AW: vba Excel2000 überprüfen nach Inhalt
14.10.2007 10:24:58
fcs
Hallo Franz,
bei dem Ereignismakro "Private Sub Worksheet_Change(ByVal Target As Range)" eines Tabellenblattes bezieht sich Target immer auf die Zelle(n) die gerade geändert wurden.
Deshalb prüft man in dem Makro meistens immer zuerst, ob die geänderte Zelle (Target) in dem Zellbereich liegt, den man bei Wertänderungen überwachen möchte.
Bei einer einzelnen Zelle, so wie in deinem Fall kann man das mit der Zell-Adresse machen. Umfasst der zu überwachende Bereich mehrere zusammenliegende Zellen, dann kann man entweder die Methode "Intersect" verwenden, die prüft ob ein Bereich in einem anderen Bereich liegt oder man vergleicht die Spalten- und/oder Zeilennummer der Target-Zelle mit Vorgabewerten.
Bei den anderen Befehlen ist für dich evtl. die With ... End With-Konstruktion neu. Dies ist eine Programmiererleichterung. Mit der With-Zeile wird das Objekt festgelegt (In meinem Beispiel das Tabellenblatt wks), auf das sich alle Methoden und Eigenschaften beziehen, die bis zur End With Zeile mit einem Punkt als erstes Zeichen beginnen.
Falls du in deinem Tabellenblatt mehrere Zellen in ähnlicher Weise abarbeiten möchtest, dann muss die Prüfung der Zellen anders aufgebaut werden. Ich hab hier "Select Case" gewählt, da diese übersichtlicher/pflegeleichter ist als eine Serie von If-Anweisungen.
In meinem Beispiel hab ich zwei Fälle eingebaut.
Bei einer Änderung in B9 werden Werte in Spalten B und C eingetragen, bei Anderung in Zelle D9 werden Werte in Spalte D eingetragen.
Das muss du jetzt an deine Wünsche anpassen. Das Ausfüllen der Zellen hab ich in eine Sub-Routine ausgelagert, damit die Zeilen im Hauptcode nicht ständig wiederholt werden müssen.
Ich hoffe jetzt kommst du weiter
Gruß
Franz
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Select Case Target.Address
'Werte in Spalten B und C ausfüllen, wenn Wert in B9 geändert wird
Case "$B$9"
Call Eintragen(wks:=Me, lAnzahl:=Target.Value, strText:="z", lZeile:=Target.Row + 2, _
iSpalte:=Target.Column)
Call Eintragen(wks:=Me, lAnzahl:=Target.Value, strText:="Y", _
lZeile:=Target.Row + 2, iSpalte:=Target.Column + 1)
'Werte in Spalte D ausfüllen, wenn Wert in D9 geändert wird
Case "$D$9"
Call Eintragen(wks:=Me, lAnzahl:=Target.Value, strText:="xxx", lZeile:=Target.Row + 2, _
iSpalte:=Target.Column)
'keine Aktionen wenn andere Zellen geändert werden
Case Else
'do nothing
End Select
Application.EnableEvents = True
End Sub
Sub Eintragen(wks As Worksheet, lAnzahl As Long, strText As String, lZeile As Long, _
iSpalte As Integer)
'wks = Tabellenblatt auf dem die Aktion ausgführt wird
'lAnzahl = Wert von Target (zuletzt geänderte Zelle) = Anzahl der auszufüllenden Zeilen
'Text = Text der vor den Ziffern stehen soll
'lZeile = 1. Zeile in der Werte eingefügt werden sollen
'iSpalte = Spalte in der Werte eingetragen werden sollen
Dim lWert As Long
With wks
'Altdaten löschen
.Range(.Cells(lZeile, iSpalte), IIf(.Cells(.Rows.Count, iSpalte).End(xlUp).Row _