Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Automatický čas - excel

Vedu si tabulku se záznamy a potřeboval bych vědět, kdy jsem který záznam vytvořil, vymyslel sem tudíž "vzoreček", který sem dal do A1:

=KDYŽ(B1="";"";NYNÍ())

a ten rozkopíroval do celého sloupce. Problém je, že když udělám změnu v kterémkoliv políčku sloupce B, tak mi změní datum a čas ve všech políčkách sloupce A, já bych potřeboval, aby předešlé záznamy neměnil.

Jde to nějak vyřešit?

Předmět Autor Datum
Jde toho docílit makrem Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = "1"…
Siki83 01.08.2012 13:28
Siki83
Tak sem si to přečet ještě jednou a pořádně. Hodnoty vkládáš do sloupce B a do sloupce A chceš datum…
Siki83 01.08.2012 13:46
Siki83
Tohle je šikovná funkce pro sledování editace! Pro časové razítko (ve sloupci A) v případě změny ve…
L-Core 01.08.2012 14:00
L-Core
Jelikož osobní snaha selhala (Excel se pokaždý řádně rafnul), tak sem zkusil něco najít. Private Su…
Siki83 01.08.2012 15:23
Siki83
Díky. Pro ty, kdo by hledali něco podobného jen doplním, že sloupec, kam se bude zapisovat časové r…
L-Core 01.08.2012 15:51
L-Core
Trochu robustnejšie: Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo ErrorHandler… poslední
los 01.08.2012 22:10
los
Díky za všechny reakce, jakmile dorazím z práce, tak to začnu koumesit.
nofu 01.08.2012 17:35
nofu
Menší problém pri použití predchádzajúcich riešení nastane pri zmene viacerých buniek naraz (pri vlo…
los 01.08.2012 21:55
los

Jde toho docílit makrem

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = "1" Then
        Cells(Target.Row, Target.Column + 1).Value = Now
    End If
End Sub

Tento kód vložíš do modulu listu, v kterém ho chceš provozovat. Funguje to pro sloupec A.
Pokud do sloupce A napíšeš hodnotu, do sousední buňky (sloupec B) se vloží datum a čas.

Tak sem si to přečet ještě jednou a pořádně. Hodnoty vkládáš do sloupce B a do sloupce A chceš datum změny

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = "2" Then
      With Cells(Target.Row, Target.Column - 1)
        .Value = Now
        .EntireColumn.AutoFit
      End With
    End If
End Sub

Tohle je šikovná funkce pro sledování editace!

Pro časové razítko (ve sloupci A) v případě změny ve sloupcích B až D to pak je (neoptimalizováno :-/) takhle:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = "2" Then
      With Cells(Target.Row, Target.Column - 1)
        .Value = Now
        .EntireColumn.AutoFit
      End With
    End If
    If Target.Column = "3" Then
      With Cells(Target.Row, Target.Column - 2)
        .Value = Now
        .EntireColumn.AutoFit
      End With
    End If
    If Target.Column = "4" Then
      With Cells(Target.Row, Target.Column - 3)
        .Value = Now
        .EntireColumn.AutoFit
      End With
    End If
End Sub

Jak to provést obecně (a optimalizovaně) pro celý list? Aby jakákoliv změna kdekoliv ve sloupcích B až IV byla zaznamenána ve sloupci A.

Díky.

Jelikož osobní snaha selhala (Excel se pokaždý řádně rafnul), tak sem zkusil něco najít.

Private Sub Worksheet_Change(ByVal Target As Range)
    SetDateRow Target, "A"
End Sub
 
Sub SetDateRow(Target As Range, Col As String)
    If Target.Cells.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Cells(Target.Row, Col) = Now()
    Application.EnableEvents = True
    Columns("A").AutoFit
End Sub

Mělo by to splňovat Tvůj požadavek na změnu data při editaci jakéhokoliv sloupce.

Díky.

Pro ty, kdo by hledali něco podobného jen doplním, že sloupec, kam se bude zapisovat časové razítko, lze jednoduše změnit: editací "A", změnit na požadovaný sloupec (B, C,...).

To, že zápis čehokoliv do určeného sloupce s časovým údajem má za následek změnu (jakéhokoliv) zápisu na časové razítko, lze odpustit.

Trochu robustnejšie:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ErrorHandler
    Application.EnableEvents = False
    
    Dim aRow As Range
    
    For Each aRow In Target.Rows
        aRow.EntireRow.Cells(1, 1).Value = Now
    Next
    
ErrorHandler:
    Application.EnableEvents = True
End Sub

Menší problém pri použití predchádzajúcich riešení nastane pri zmene viacerých buniek naraz (pri vložení cez Paste). V takom prípade sa čas nastaví len pre prvý riadok alebo vôbec.

Ak by som chcel určovať dátum vzniku riadku podľa zmeny v nejakom rozsahu (napr. B:F), tak by som použil niečo takéto:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim aRange As Range
    Dim aRow As Range
    Dim aCell As Range
    
    Set aRange = Intersect(Target, Range("B:F"))
    If Not aRange Is Nothing Then
        For Each aRow In aRange.Rows
            Set aCell = aRow.EntireRow.Cells(1, 1)
            If aCell = "" Then
                aCell.Value = Now
            End If
        Next
    End If
End Sub

Zpět do poradny Odpovědět na původní otázku Nahoru