VBA für Datum und Uhrzeitauflistung (Fortführung), beim öffnen der Arbeitmappe?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Probier es einmal so:

Private Sub Workbook_Open()
 If [a1] = "" Then
  [a1] = Date
  [b1] = Time
 ElseIf [a2] = "" Then
  [a2] = Date
  [b2] = Time
 Else
  [a1].End(xlDown).Offset(1, 0) = Date
  [a1].End(xlDown).Offset(0, 1) = Time
 End If
End Sub
LuckyJack1986  03.12.2019, 10:32

Sieht richtig aus, wofür aber das ElseIf? Funktioniert xlDown nicht bei nur einer Zelle / Zeile?

1
Suboptimierer  03.12.2019, 10:35
@LuckyJack1986

In meinem Test funktioniert es erst ab der dritten Zeile.

Ich behaupte nicht, dass man den Code nicht noch optimieren kann.
Probier es einfach aus.

1
Suboptimierer  03.12.2019, 10:53
@pushido

Ich weiß nur, dass die Funktionen abgebildet werden, die man mit der Steuerungstaste und den Pfeiltasten ausführen kann.

Es gibt verschieden Variationen des Befehls. Man kann auch [A9999].End(xlUp) und so weiter ausprobieren.

... Sehe gerade, dass man sich dann das ElseIf sparen könnte.

Dann gibt es noch den UsedRange. Meiner Erinnerung hat man hier nicht viel gewonnen, wenn man diesen nutzt.

1
Tron1701 
Fragesteller
 03.12.2019, 11:21

Herzlichen Dank für die zeitnahe Rückmeldung !

Funktioniert so wie ich es wollte (Datum in Spalte A, Uhrzeit in Spalte B).

2
Tron1701 
Fragesteller
 03.12.2019, 16:47
@Suboptimierer

Wollte die Option auf Spalte C erweitern ("UserName") hat aber nur 2x funktioniert, ohne Spalte C.

Dachte es würde so funktionieren (siehe folgend zusammengebastelt).

Private Sub Workbook_Open()

 If [a1] = "" Then

 [a1] = Date

 [b1] = Time

 [c1] = UserName

 ElseIf [a2] = "" Then

 [a2] = Date

 [b2] = Time

 [c2] = UserName

 Else

 [a1].End(xlDown).Offset(1, 0, 0) = Date

 [a1].End(xlDown).Offset(0, 1, 0) = Time

 [a1].End(xlDown).Offset(0, 0, 1) = UserName

 End If

End Sub

War aber nicht so !

Woran liegt es.

1
Suboptimierer  03.12.2019, 16:51
@Tron1701

Offset erwartet 2 Parameter: den Zeilen- und den Spaltenoffset. Das ist die Zahl an Zeilen und Spalten relativ zur Bezugszelle.

1
Tron1701 
Fragesteller
 03.12.2019, 17:11
@Suboptimierer

Welches Offset wäre Richtig (Syntax)?

Würde mir sehr Helfen.

1
Tron1701 
Fragesteller
 03.12.2019, 17:51
@Tron1701

Sorry,

hatte das Modul bei "UserName" nicht berücksichtigt, da Tests in anderen Dateien ohne Modul, führten zu unzureichenden Ergebnissen.

Offset habe ich korrigiert, funktioniert jetzt auch auf bestehendes VBA mit anderen Abfragen !

[a1].End(xlDown).Offset(1, 0) = x

[a1].End(xlDown).Offset(0, 1) = xy

[a1].End(xlDown).Offset(0, 2) = xyz

1000 Dank für Deine Bemühungen.

Ist jetzt erledigt !!!

2
Private Sub Workbook_Open()
 
   Dim LastRow As Long
    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With
    If LastRow > 1 Then
        LastRow = LastRow + 1
    End If
    
    Cells(LastRow, 1) = Date
    Cells(LastRow + 1, 1) = Time
End Sub

LG

Tron1701 
Fragesteller
 03.12.2019, 11:28

Auch Dir herzlichen Dank für die zeitnahe Rückmeldung !

Funktioniert auch, Datum und Uhrzeit sind allerdings in Spalte A untereinander fortführend.

Eventuell diese Version hilfreich für andere Vorhaben.

Danke !

1
pushido  03.12.2019, 11:31
@Tron1701

Achsoo, falsch gelesen...

Private Sub Workbook_Open()
 
   Dim LastRow As Long
    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With
    If LastRow > 1 Then
        LastRow = LastRow + 1
    End If
    
    Cells(LastRow, 1) = Date
    Cells(LastRow, 2) = Time
End Sub
1
Tron1701 
Fragesteller
 03.12.2019, 17:16
@pushido

Es gibt nur Einträge in A1 und B1.

Daten werden nicht fortgeführt.

Spalte C Zusatzabfrage wäre schön (z. B. "UserName") zu realisieren.

1
pushido  04.12.2019, 10:22
@Tron1701
Private Sub Workbook_Open()
 
   Dim LastRow As Long
    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With
    If (LastRow > 1) Or Range("A1").Value <> "" Then
        LastRow = LastRow + 1
    End If
    
    Cells(LastRow, 1) = Date
    Cells(LastRow, 2) = Time
End Sub

Sorry, beim 2. Mal habe ich nicht getestet...

.Cells(.Rows.Count, "A").End(xlUp).Row

liefert 1 Wenn die Tabelle Leer ist bzw. wenn nur die 1. Zeile voll ist... Meine Fehler- sorry noch mal. Jetzt sollte es funktionieren....

1
Tron1701 
Fragesteller
 04.12.2019, 14:50
@pushido

Hallo,

vielen Dank, habe die Version von "Suboptimierer" realisiert und prämiert.

Sorry, musste jemanden selektieren der als Erstes die Beste Option lieferte und hoffe das Du nicht sauer bist.

Das nächste Mal … .

Dennoch werde ich Deine Version mal Testen, eventuell bieten sich da ganz andere Möglichkeiten.

1000 Dank für Dein Engagement.

Leider bekommt man von Fragestellern nicht immer die Aufmerksamkeit, obwohl man Stunden für die Lösungsfindung verbracht hat.

Einziger Trost ist, das gewisse Fragestellungen einem als Vorteilhaft erschließen, falls es zu ähnliche Situation kommt.

Gruß Tron

0
Tron1701 
Fragesteller
 05.12.2019, 08:56
@pushido

Hallo,

wo käme die Korrektur hin, da schon Bestand im "alten" Syntax

0
pushido  05.12.2019, 11:01
@Tron1701

Beim 2. Mal habe ich nur das hier hinzugefügt gehabt:

Or Range("A1").Value <> ""

Also nochmal hier die komplette Funktion:

Private Sub Workbook_Open()
 
   Dim LastRow As Long
    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With
    If (LastRow > 1) Or Range("A1").Value <> "" Then
        LastRow = LastRow + 1
    End If
    
    Cells(LastRow, 1) = Date
    Cells(LastRow, 2) = Time
End Sub

Mir ist es egal ob meine Lösung gewählt wird oder nicht- mir ist es wichtig, das was ich an Lösung bereitstelle soll funktionieren und soll auch korrekt sein- ich kämpfe nicht für die "Hilfreichste Antwort" sondern ich gebe mein Wissen gerne weiter.

Die Antwort von Suboptimierer funktioniert zwar, aber in der Informatikwelt macht man das einfach nicht so... (für die ersten 2 Einträge macht er die Abfrage manuell, und ab dem 3. dann automatisiert- das gehört sich nicht so).

Egal, viel Erfolg! ;)

1
Tron1701 
Fragesteller
 07.12.2019, 11:20
@pushido

Nochmals 1000 Dank !!! ;-)

Schade finde ich es, dass manchmal keine Resonanz von Fragestellern erfolgt, obwohl man unter Umständen sehr viel Zeit zur Lösungsfindung verbracht hat.

Ich habe Deine Varianten getestet (nach meinen Bedürfnissen die Abfrage erweitert) und funktionieren beide.

Die 1. Variante verteilt sich in Spalte A (Daten nach unten fortführend) und ist auch Super. Die 2. Variante verteilt sich in den Zeilen (Daten nach unten fortführend).

Ich hätte da noch einen Frage: Wie sieht der Zusatz-Syntax aus wenn das VBA sich nur auf "Tabelle1" (als Beispiel) beziehen darf, denn die Einträge erfolgen auf dem Blatt, wo man sich befindet, bzw. zuletzt befunden hatte (beim öffnen der Datei).

Könnte bei mehr Register sich als unvorteilhaft erweisen.

0
pushido  09.12.2019, 12:01
@Tron1701
Private Sub Workbook_Open()
 
   Dim LastRow As Long
   ActiveWorkbook.Sheets("Test1").Activate
   
    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        
    End With
    If (LastRow > 1) Or Range("A1").Value <> "" Then
        LastRow = LastRow + 1
    End If
    
    Cells(LastRow, 1) = Date
    Cells(LastRow, 2) = Time
End Sub

Mit dieser Zeile:

ActiveWorkbook.Sheets("Test1").Activate

bestimmst Du welcher Sheet der "ActiveSheet" sein soll. Also statt "Test1" kannst du sonst was schreiben (auch dynamisch).

Beachte, dass dein Code im Reiter "DieserArbeitsmappe" (auf der linken Seite) eingetragen werden muss.

Ich hoffe, es ist soweit alles verständlich.

LG

1
Tron1701 
Fragesteller
 10.12.2019, 12:36
@pushido

Super, einfach Klässisch !

Bezieht sich auf Registernamen und nicht der Tabellenzuordnung, habe ich dann festgestellt.

Nochmals 1000 Dank für Dein Engagement.

Gruß Tron

0
hannes1806  03.12.2019, 16:28

Hallo pushido!

Wie bekommst du den VBA-Code so schön formatiert in den thread?

1
hannes1806  09.12.2019, 15:09
@pushido

Aha, danke. Aus meinem Excel 2016 ein kleines Makro mit 10 Zeilenkommt so an:

Sub Makro1()

End Sub

End Sub

End Sub

End Sub

End Sub

End Sub

End Sub

End Sub

End Sub

Vielleicht liegt es am Browser, welchen verwendest du?

0

Ohne VBA kannst du das Datum / die Uhrzeit sehr schnell manuell setzen, ohne sie schreiben zu müssen (auch weil viele Netzwerke kein VBA zulassen):

Shortcut Datum: Strg+Punkt

Shortcut Zeit: Strg+Doppelpunkt

gehen beide auch nacheinander (sinnvollerweise mit Leerzeichen dazwischen) oder einzeln in Fließtexten.

In LO etc geht dieser Shortcut nicht. (oder anders?)

Tron1701 
Fragesteller
 03.12.2019, 16:35

Danke lamiam,

ist mir geläufig, möchte aber aus Sicherheitstechnischen Gründen im Hintergrund die gewünschte Option über VBA laufen lassen, sobald die Datei geöffnet wird.

Hierzu spielen andere Aspekte eine wichtige Rolle.

Gruß Tron

1