VBA Anfänger erbittet Hilfe

Hallo und Gruß allerseits,
ich arbeite täglich mit einer umfangreichen Excel-Tabelle. Einige Routinearbeiten habe ich inzwischen mit den „normalen“ Funktionen z.B. WENN, ZÄHLEWENN, verschiedene Matrixfunktionen etc. vereinfacht. Nun brauche ich für einige spezielle Funktionen den VBA Editor und da ich damit noch nie gearbeitet habe, fängt mein Problem an. 2 Formeln oder Funktionen die ich im Internet gefunden habe funktionieren aber nur jede einzeln für sich und nicht zusammen.Formel 1 bewirkt dass ein aktuelles Datum in einer Zelle gesetzt wird dass sich nur dann aktualisiert wenn sich die nebenstehende Zelle ändert. Sie lautet:
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range(„L2:L5000“)) Is Nothing Then
Exit Sub
Else
If Target.Value „“ Then
Target.Offset(0, 1).Value = Date
Else
Target.Offset(0, 1).ClearContents
End If
End If

End Sub

Ich habe das so im Editor im Projekt-Explorer in Tabelle 1 einfach reinkopiert, den Zellbereich verändert und es funktioniert.
Formel 2 soll nun Zelle L2 um den Wert erhöhen, der in Zelle L2 eingegeben wird und lautet:
If Target.Address = „$L$2“ Then
Application.EnableEvents = False
Target.Value = Target.Value + zahl
Application.EnableEvents = True
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = „$L$2“ Then zahl = Target.Value
End Sub

Im Editor in Tabelle 2 reinkopiert funktioniert das auch in Tabelle 2. Ich brauche das aber in Tabelle 1 und wenn ich das einfach unter die erste Formel in Tabelle 1 kopiere kommen Fehlermeldungen und beide Funktionen laufen nicht. Wie schon erwähnt bin ich darin absoluter Neuling und hoffe dass ich trotzdem mein Problem einigermaßen verständlich beschrieben habe.
Noch zu erwähnen ist, dass ich es auch nicht schaffe Formel 2 so zu verändern dass sie den gleichen Zellbereich wie in Formel 1, also L2 bis L5000 anspricht. Für ein paar hilfreiche Ratschläge von Experten bedanke ich mich jetzt schon.
Mit freundlichem Gruß, flexliner

VBA Anfänger erbittet Hilfe
Hi,

Du mußt Dir darüber klar werden, daß in einem VBA-Modul nicht alles, was darin steht, automatisch ausgeführt wird, wenn man z.B. eine Arbeitsmappe öffnet. Nur das, was explizit mit seinem Namen aufgerufen wird, wird ausgeführt.

Die kleinste Einheit, die aufgerufen wird, heißt PROZEDUR. Sie wird gekennzeichnet durch den Prozedurkopf und den Prozedurrumpf. Am Kopf erkennt VBA, was es ausführen soll, im Rumpf steht, was VBA genau machen soll.

Deine beiden Prozeduren aus dem Internet heißen „Sub Worksheet_Change“. Wenn sie in zwei verschiedenen Tabellenblättern stehen, ist das kein Problem. Aber im selben Tabellenblatt wohl: VBA weiß nicht, welche von beiden es ausführen soll und weigert sich. Daher die Fehlermeldungen.

Abhilfe: kopiere den ProzedurRUMPF der zweiten Prozedur ans Ende der ersten Sub Worksheet_Change-Prozedur und lösche die zweite Prozedur.

Hinweis: wenn die neue Prozedur auf ALLEN Tabellenblättern Deiner Arbeitsmappe funktionieren soll, müßtest Du sie theoretisch in jedes Codemodul jedes einzelnen Tabellenblattes kopieren. Wenn die neue Prozedur aber im Codemodul DIESE_ARBEITSMAPPE steht, funktioniert sie direkt auf allen Tabellenblättern.

HTH.

M.

Hallo FL,

meinst du so:

in Modul1:

Option Explicit

Public Zahl

in Tabelle1:

Option Explicit
'
Private Sub Worksheet\_Change(ByVal Target As Range)
If Intersect(Target, Range("L2:L5000")) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Target.Value "" Then
 Target.Offset(0, 1).Value = Date
 Target.Value = Target.Value + Zahl
Else
 Target.Offset(0, 1).ClearContents
End If
Application.EnableEvents = True
End Sub
'
Private Sub Worksheet\_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("L2:L5000")) Is Nothing Then Exit Sub
Zahl = Target.Value
End Sub

Gruß
Reinhard

Hallo Reinhard,
vielen Dank für Deine schnelle Anwort.
Ich habe nun die Formel aus Deiner Antwort ab folgender Stelle in die Tabelle 1 im VBA-Editor kopiert.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range(„L2:L5000“)) Is Nothing Then Exit
Sub
Application.EnableEvents = False
If Target.Value „“ Then
Target.Offset(0, 1).Value = Date
Target.Value = Target.Value + Zahl
Else
Target.Offset(0, 1).ClearContents
End If
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range(„L2:L5000“)) Is Nothing Then Exit
Sub
Zahl = Target.Value
End Sub

Wenn ich nach dem Abspeichern in die betreffende Zelle gehen möchte öffnet sich ein Fehlerfenster mit der Meldung
„Fehler beim Kompilieren, Variable nicht definiert“.
Außerdem ist dann „Zahl“ in der vorletzten Reihe Deiner Formel
(Zahl = Target.Value) blau unterlegt.
Ich hoffe auch diesmal mich verständlich ausgedrückt zu haben. Wenn nicht dann bitte ich um Nachsicht.
Gruß flexliner

Wenn ich nach dem Abspeichern in die betreffende Zelle gehen
möchte öffnet sich ein Fehlerfenster mit der Meldung
„Fehler beim Kompilieren, Variable nicht definiert“.
Außerdem ist dann „Zahl“ in der vorletzten Reihe Deiner Formel
(Zahl = Target.Value) blau unterlegt.

Hallo flexliner,

in meiner Antwort schrieb ich das die Deklaration von zahl in Modul1 muß.
Wenn du keins hast, im Editor oben Einfügen—Modul.
Danach haste ein Modul1.

Zwischen den Modulen, also hier zwischen Modul1 und dem Modul „tabelle1“ wechselst du durch Doppelklick links auf den Modulnamen.

gelegentlich ergeben sich Zustände wo links zwar z.B. „Tabelle1“ markiert ist, aber rechts der Inhalt eines anderes Moduls angezeigt wird.
Mach in so unklaren Momenten links einen Doppelklick, dann stimmt wieder alles.

Der Code ist mit XL200 kurz getestet sodaß er wohl fehlerfrei abläuft.
Das heißt aber noch lange nicht daß er auch das macht was du willst, da war mir einiges unklar.

Gruß
Reinhard

Hallo Reinhard,
Es funktioniert.Vielen, vielen Dank. Ich habe zwar noch keinen Schimmer warum aber es läuft so wie es soll. Ich werde mich jetzt öfter mit VBA befassen und irgendwann wird es dann auch bei mir dämmern. Nochmals vielen Dank für Deine schnelle Hilfe.
Liebe Grüße aus Berlin

Hallo Reinhard,
ich habe leider doch noch eine Frage. In die betreffende Zelle der Spalte (L2":L5000) der Tabelle trage ich Teillieferungen einer Bestellung ein. Die Stückzahlen dieser Teillieferungen werden jetzt automatisch addiert mit dem dazugehörigem Tagesdatum der letzten Teillieferung nebenan in Spalte M der betreffenden Zeile. Das funktioniert soweit super. Irgendwann ist nun die bestellte Menge erreicht und ich möchte die ganze Zeile löschen weil meine Bestellung und die Lieferung, also der ganze Vorgang, erledigt ist. Wenn ich die Zeile lösche kommt die Fehlermeldung Laufzeitfehler ‚13‘ Typen unverträglich und in der Prozedur ist die Zeile
If Target.Value „“ Then
gelb unterlegt und die ganze Prozedur läuft nicht mehr. Es wäre nett wenn du mir nochmals helfen könntest.

Wenn ich die Zeile lösche
kommt die Fehlermeldung Laufzeitfehler ‚13‘ Typen
unverträglich und in der Prozedur ist die Zeile
If Target.Value „“ Then
gelb unterlegt und die ganze Prozedur läuft nicht mehr. Es

Hallo FL,

das liegt an Target in
Private Sub Worksheet_Change(ByVal Target As Range)

Wenn du eine ganze Zeile löschst oder per Strg+c, dann Strg+v, oder anderes mehrere zellen gleichzeitig veränderst, und löschen ist schon eine gewaltige Änderung *gg* so „springt“ der Ereigniscode des „Worksheet_Change“_ereignisses, also der von mir gepostete Code an und läuft los.

Intersect überprüft nur ob eine Zelle im Zellenbereich von „target“ in l2:L5000 liegt. Das ist wohl erfüllt.

Bei „If Target.Value „“ Then“ "knallts dann, denn EIN Zellenbereich hat kein Value, also keinen Wert ===> Fehler.

Abhilfe, füge vor oder nach dem „If intersect…“ folgendes ein:

If target.cells.count 1 then exit sub

Stör dich nicht an der Kleinschrift, ich schreib im VB-Editor meist klein, wenn das der VB-Editor nicht umwandelt weiß ich, ich habe mich verschrieben o.ä.

Gruß
Reinhard