6.5k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo Forum,

ich habe hier eine umfangreiche Nummernverwaltung in Excel, die von mehreren Personen bearbeitet wird. Folgendes möchte ich per VBA lösen:
Wenn in Spalte B ein anderer Wert als 0 eingetragen wird, soll automatisch in Spalte P das Datum dieses Eintrags geschrieben werden.

Wie müsste dieser Code aussehen?

Vielen Dank für Eure Hilfe

13 Antworten

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo,

trage den folgenden Code in das VBA-Projekt des Arbeitsblattes ein:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 2 And Target.Value <> 0 Then Cells(Target.Row, 16) = Date

End Sub


Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

ausgezeichnet, genau was ich gesucht habe.

Vielen Dank!
0 Punkte
Beantwortet von
Hallo zusammen,

das Makro funktioniert an sich eigentlich gut, nun bräuchte ich allerdings noch etwas Hilfe für eine Erweiterung:

Wenn in Spalte 2 der eingetragene Wert wieder gelöscht (mit 0 überschrieben) wird, möchte ich auch das Datum in Spalte 16 wieder löschen.
Zudem habe ich das Problem, wenn ich z.B. mehrere Zellen durch Kopieren/Einfügen ausfülle, erhalte ich eine Fehlermeldung (Laufzeitfehler '13') und in Spalte 16 wird nichts eingetragen.

Ich denke es müsste genügen, wenn das Makro erst beim Schliessen der Tabelle ausgeführt würde; dann gäbe es wohl auch keinen Laufzeitfehler mehr.

Wie muss ich das Makro umbauen, damit es einen Eintrag in Spalte 16 wieder löschen kann und erst beim Schliessen ausgeführt wird?

Vielen Dank für Eure Hilfe!
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

geht z.B. so

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 2 And Target.Value <> 0 Then Cells(Target.Row, 16) = Date
If Target.Column = 2 And Target.Value = 0 Then Cells(Target.Row, 16) = 0

End Sub


Gruß

Helmut
0 Punkte
Beantwortet von
Hallo Helmut,

so wird aber das Makro immer noch bei jeder Eingabe ausgeführt, oder nicht?

Wie mache ich das, dass das Makro erst beim Schliessen gestartet wird?

Vielen Dank nochmals!
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

beim Schliessen ausführen geht nicht, da das Programm nur die Änderung der letzten Zeile dann noch kennt.

Gruß

Helmut
0 Punkte
Beantwortet von
Hallo Helmut,

ok, dann geht das nicht;
aber könnte dieser Ansatz beim Schliessen funktionieren:

prüfen, ob in Spalte 2 ein Wert <> 0 steht
- wenn ja, dann 0 schreiben in Spalte 16
- wenn nein, dann prüfen ob in Spalte 16 ein Datum steht
--- wenn ja, dann nichts tun
--- wenn nein, dann aktuelles Datum in Spalte 16

Damit müssten doch alle Änderungen seit dem letzten Speichern erfasst sein, ältere Änderungen aber nicht verändert werden.
Und das Problem mit Kopieren und Einfügen wäre auch erschlagen.

Könnte das laufen?

Besten Dank & Gruss
DasSchaf
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

setze das Makro mal unter "DieseArbeitsmappe"

Sub Workbook_BeforeClose()
For i = 1 to Range("A65536").End(xlUp)
IF Range( „B“ & i).Value <> 0 and IF Range( „P“ & i).Value = 0 Then Range( „P“ & i).Value = Date
IF Range( „B“ & i).Value = 0 and IF Range( „P“ & i).Value <> 0 Then Range( „P“ & i).Value = 0
Next i
End Sub


ist zwar ungetestet, aber damit müsste es funktionieren

Gruß

Helmut
0 Punkte
Beantwortet von
Hallo Helmut,

beim Einfügen werden die beiden Zeilen mit "IF Range.." rot und beim Kompilieren erhalte ich dann eine Fehlermeldung "Deklaration der Prozedur entspricht nicht der Beschreibung eines Ereignisses oder einer Prozedur mit demselben Namen"

Ich habe den Code testweise auch in einem leeren Excel-File eingebaut, da kriege ich genau das gleiche Ergebnis...

Hast Du da noch eine Idee?

Besten Dank & Gruss
Paul
0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

hole mal die Leerzeichen bei allen Range hinter der Klammer

Range( „B“ & i).Value

Range(„B“ & i).Value

raus und versuche es dann nochmal

Gruß

Helmut
...