2.4k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,

ich habe ein Makro geschrieben (Excel 2003), dass bei Klick auf einen Button eine neue Zeile einfügt (hier in dem Fall werden z.B. die Inhalte aus der Spalte A und B in eine neue Zeile übernommen):

Private Sub CommandButton4_Click()
letzte = ActiveSheet.Range("a65000").End(xlUp).Row
Rows(letzte + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromAbove
Range("A" & letzte).AutoFill Destination:=Range("A" & letzte & ":A" & (letzte + 1)), Type:=xlFillSeries
Range("B" & letzte).AutoFill Destination:=Range("B" & letzte & ":B" End Sub

Bei Excel-Dateien mit nur einem Makro (also diesem) funktioniert das Makro problemlos. Ich möchte es jetzt aber auch auf eine Excel-Datei anwenden, die bereits ein Makro enthält. Dabei kommt aber immer die Fehlermeldung "Fehler beim Kompilieren - Variable nicht definiert".

Ich füge den Makro-Code einfach unterhalb des bisherigen Makros ein, also so:

Private Sub Worksheet_Change(ByVal Target As Range)
' Fülfarbe
' für Schrift RaZelle.Font.ColorIndex
Dim RaBereich As Range ' Variable für Bereich
Dim RaZelle As Range ' Variable für Zelle
Set RaBereich = Range("D1:D500") ' Bereich der Wirksamkeit
' noch mehr Bereiche
'Set RaBereich = Union(Range("D1:D500"))
'Set RaBereich = Intersect(RaBereich, Range(Target.Address))
If Not RaBereich Is Nothing Then
'ActiveSheet.Unprotect ("Passwort")
For Each RaZelle In RaBereich
With Range(RaZelle.Address, RaZelle.Offset(0, 0).Address)
Select Case UCase(RaZelle.Value) '
Case "GRÜN ZU ROT"
' Füllfarbe Rot
.Interior.Color = 255
' Schriftfarbe automatisch
.Font.ColorIndex = 2
' Zellenformat Standard
.NumberFormat = "General"
.NumberFormat = "General"
End Select
End With
Next RaZelle
' ActiveSheet.protect ("Passwort")
End If
Set RaBereich = Nothing ' Variable leeren
End Sub

### JETZT KOMMT DAS NEUE MAKRO ###

Private Sub CommandButton4_Click()
letzte = ActiveSheet.Range("a65000").End(xlUp).Row
Rows(letzte + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromAbove
Range("A" & letzte).AutoFill Destination:=Range("A" & letzte & ":A" & (letzte + 1)), Type:=xlFillSeries
Range("B" & letzte).AutoFill Destination:=Range("B" & letzte & ":B" End Sub


Was mache ich falsch?? Liegt es an der Definiton der Sheets? (einmal "ActiveSheet.Range" vs. "Worksheet_Change")??

Wie muss ich die Codes umschreiben, damit das Makro funktioniert?

3 Antworten

0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Das liegt sicher nicht an der Anzahl der Makros in der Mappe sondern daran, dass Du dieses Makro in eine Mappe bzw. in ein Modul schreibst, welches im Deklarationsbereich mit "Option Explicit" festlegt, dass verwendete Variablen explizit deklariert werden muessen. Die von Dir verwendeten Variablen muessen also vor Gebrauch angelegt werden. In Deinem Beispiel wuerde dies dann aussehen wie folgt:
Private Sub test()
Dim letzte As Long
letzte = ActiveSheet.Range("a65000").End(xlUp).Row
.
.
.

Und wenn ich damit dann richtig liege, dann wird auch noch ein weiterer Fehler sichtbar werden: die Excelkonstante xlFormatFromAbove gibt es so nicht. Wenn Du nun letzte also deklariert hast, wirst Du noch einen Fehler ernten, der auf dieses xlFormatFromAbove zeigt. Richtig sollte diese ExcelKonstante wohl xlFormatFromLeftOrAbove heissen.

Cu
TheBlackBird ®

btw: Wenn Du im VB-Editor auf Extras-> Optionen klickst, dann kannst Du dort im Register "Editor" einen Haken bei " VariablenDeklaration erforderlich" setzen. Dann wird auch bei Dir in allen neuen Modulen dieses "Option Explicit" stehen. Und dies ist in meinen Augen auch ratsam.

An Deinem Beispiel:
xlFormatFromLeftOrAbove hat den Wert 0
xlFormatFromRightOrBelow hat den Wert 1 (als Gegenteil Deiner Konstanten)
Wuerdest Du ohne "Option Explicit" z.B. bei der letzteren Konstanten einen aehnlichen Fehler machen wie in Deinem Code, und z.B. xlFormatFromBelow schreiben, waere die Wirkung dennoch wie bei xlFormatFromLeftOrAbove.
Warum? Excel erkennt dieses falsche xlFormatFromBelow nicht als Konstante und wertet es als Variable. Da dieser Variablen kein Wert zugewiesen worden ist, ist sie leer und duerfte somit in diesem Fall wie ein xlFormatFromLeftOrAbove wirken. (Mit Option Explicit kann genau das, und ein paar andere Fehler, nicht passieren. Auch wenn es anfangs evtl. nervig erscheint, alle Variablen deklarieren zu muessen... Es hilft Fehler zu vermeiden und/oder zu finden.)
0 Punkte
Beantwortet von
Hallo,

vielen Dank für die Antwort. Die Fehlermeldung kommt nun nicht mehr, allerdings funktioniert das Makro immer noch nicht. Bei Klick auf den Button soll ja eigentlich automatisch eine neue Zeile eingefügt werden. Wenn ich jetzt draufklicke tut sich - gar nix.
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Das kann ich so nicht nachvollziehen. Hier bei mir in einer Testmappe funktioniert diese CodeKombi.

Wenn es die Daten in der Mappe erlauben, dann lade die doch einmal hoch (z.B. bei www.file-upload.net/) Dann koennte man sich mal anschauen, wo es klemmt.

Cu
TheBlackBird ®
...