Excel-VBA-Ereignis-Handler
1) Kann mir bitte jemand sagen, was das Problem sein könnte, mit diesem code?
2.) brauche ich diesen code eigentlich ausgeführt auf einem Arbeitsblatt zu aktualisieren, aber @ erstmaligen laden der Arbeitsmappe, ich bin ein update ausführen mit dem Workbook_Open
event-handler. Wird dies nicht auslösen meine Worksheet_Change
event? Gibt es eine Möglichkeit, dies zu vermeiden
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim rowCount As Integer
Set Worksheet = "datasheet"
Set rowCount = ws.Cells(Rows.Count, "A").End(xlUp)
If Not Intersect(Target, Range("M3:M" & CStr(rowCount))) Is Nothing Then
MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("T3:T" & CStr(rowCount))) Is Nothing Then
MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("X3:X" & CStr(rowCount))) Is Nothing Then
MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("AB3:AB" & CStr(rowCount))) Is Nothing Then
MsgBox ("Hi")
End If
Else
If Not Intersect(Target, Range("AI3:AI" & CStr(rowCount))) Is Nothing Then
MsgBox ("Hi")
End If
End Sub
Ich bin immer eine Compiler-Fehlermeldung "Objekt erforderlich" wenn ich meine Daten ändern mit dieser handler. Auf der anderen Seite, wenn ich die Werte statt rowcount, bekomme ich keine Probleme.
Set rowCount = ws.Cells(Rows.Count, "A").End(xlUp)
rowCount ist nicht ein Objekt, sondern eine variable. VerwendenrowCount = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
- Und verwenden
Dim rowCount As Long
- es sind mehr Zeilen in einem Arbeitsblatt als eineInteger
halten kann - Guter Punkt, @Chris. :@user1638796: Bezüglich deiner 2. Frage. Sie können verwenden eine öffentliche variable zu prüfen, für die worksheet_open Veranstaltung und dann zu vermeiden, das change-Ereignis.
- Sind Sie mit dem code aus dem sheets("Datenblatt") code-Bereich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich immer empfehlen, diese bei der Verwendung
Worksheet_Change
Müssen Sie nicht den Namen des Blattes. Es wird davon ausgegangen, dass der code ausgeführt werden, auf der aktuellen Platte, es sei denn, Sie versuchen, verwenden Sie ein weiteres Blatt Zeile als eine Referenz, wie richtig erwähnt brettdj in den Kommentaren unten.
Wann immer Sie arbeiten mit
Worksheet_Change
Veranstaltung. Schalten Sie immer Ereignisse, wenn Sie das schreiben von Daten zu der Zelle. Dies ist erforderlich, damit der code nicht gehen in eine mögliche EndlosschleifeWann immer Sie abschalten Veranstaltungen, mit Fehlerbehandlung else if erhalten Sie eine Fehlermeldung, der code wird nicht ausgeführt, das nächste mal.
Hier ist ein Beispiel
Also mit dem obigen code wird (UNGETESTET)
BEARBEITEN:
Bezüglich deiner 2. Frage. Wie ich bereits im Kommentar oben, können Sie verwenden eine Öffentliche variable zu prüfen, ob das worksheet-change-Ereignis verursacht wird, indem Sie die Arbeitsmappe öffnen.
Dieser code in ein Modul.
Platzieren Sie diesen code in die Arbeitsmappe code-Bereich
Und ändern Sie Ihre worksheet-change-Ereignis zu
Haben Sie mehrere Fragen
rowCount = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set ws = Sheets("datasheet")
nichtSet Worksheet = "datasheet"
Else
Aussagen sind, verursachen Fehler, wie Sie sind verwaist. Wenn Sie verlassen wollen, auf das erste "Hallo", anstatt weiterhin zu testen, sollten Sie versuchen, so etwas wie diesesSid hat bedeckt den anderen Punkt. Sie können eine
Boolean
variable für dieseaktualisierten code
diese tests die intersect-Spalten, M, T, X, AB und AI von Zeile 3 zu Zeile
rowCount
in einer einzigen ZeileYou should be using Set ws = "datasheet"
Set ws = Sheets("datasheet")
und nichtSet ws = "datasheet"
. Ah! Ich sehe, Sie haben aktualisiert, die in Ihrem code. Sie müssen ändern, Punkt 2 oben, denke ich.rowCount = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Den code von brettdj arbeitet auch für mich...