VBA Objektvariable oder With Blockvariable nicht festgelegt?
Hallo habe folgenden Code:
Bekomme beim debuggen nach der Zeile "Objektvariable oder With-Blockvariable nicht festgelegt" Ich sehe mein Fehler leider nicht, hat jemand eine Ahnung?
Dim wbSAP As Workbook
Dim wbStamm As Workbook
Dim sapSheet As Worksheet
Dim stammSheet As Worksheet
Dim sapRange As Range
Dim stammRange As Range
Dim curSapCell As Range
Dim foundStammCell As Range
Dim nextStammRowNr As Integer
Set wbSAP = Workbooks.Open(ThisWorkbook.Path & "\SAP-Abfrage_GEN-User_SUIM.xls")
Set wbStamm = ThisWorkbook
Set sapSheet = wbSAP.Sheets("SAP-Abfrage_GEN-User_SUIM")
Set stammSheet = wbStamm.Sheets("Tabelle1")
Set sapRange = sapSheet.Range("B29:B105")
Set stammRange = stammSheet.Range("F2:F81")
For Each curSapCell In sapRange
foundStammCell = stammRange.Find(curSapCell.Value, LookAt:=xlWhole)
If Not foundStammCell = curSapCell.Value Then
stammSheet.Range("M" & nextStammRowNr) = sapSheet.Range("M" & curSapCell.Row).Value
nextStammRowNr = nextStammRowNr + 1
Else
stammSheet.Range("M" & foundStammCell.Row) = sapSheet.Range("M" & curSapCell.Row).Value
End If
Next curSapCell
3 Antworten
Ich weiß nicht, ob genau das dein Problem ist, aber nextStammRowNr ist zu Anfang uninitialisiert. Es kann passieren, dass versucht wird, auf M0 zuzugreifen.
Manchmal greifst du auf die Zellen mit .Value zu, manchmal nicht. Das ist uneinheitlich.
nach der Zeile ????
Und kannst Du den Code vielleicht nochmal lesbarer schicken?
Danke.
Ich habe jetzt die anderen Antworten nicht gelesen, bin aber schon soweit gekommen:
...For Each curSapCell In sapRange
Set foundStammCell = stammRange.Find(curSapCell.Value, LookAt:=xlWhole)
If Not foundStammCell Is Nothing Then
If Not foundStammCell = curSapCell.Value Then
stammSheet.Range("M" & nextStammRowNr) = sapSheet.Range("M" & curSapCell.Row).Value
nextStammRowNr = nextStammRowNr + 1
Else
stammSheet.Range("M" & foundStammCell.Row) = sapSheet.Range("M" & curSapCell.Row).Value
End If
End If
Next curSapCell
Also einmal ein "Set" am Anfang der Zeile und zum anderen das "Nothing" abfangen.
Habe jetzt nicht mehr weiter getestet, muss leider weg.
Schaue nachher auf jeden Fall noch vorbei, aber ich denke, die anderen Experten werden Dir bis dahin geholfen habe.
Bitte formatiere den Code als Code. (Dafür gibt es </> in der Formatierungsleiste.)
Und verrate uns auch bitte, in welcher Zeile der Fehler auftritt.
Vermutlich ist das bei
foundStammCell = ...
ein Range ist ein Objekt, also musst du entweder
Set foundStammCell = ...
nehmen oder foundStammCell einen Wert vom Typ Range zuweisen, bevor du mit
foundStammCell = ...
seiner Value-Eigenschaft etwas zuweist.
Tipp: Gewöhn dir an, dich nicht auf Default-Eigenschaften zu verlassen, also z. B.
foundStammCell.Value = ...
zu verwenden, dann fallen solche Fehler viel schneller auf. (Und in VB.NET gibt es sowieso keine "nichtindizierten" Default-Eigenschaften mehr.)
Fehler tritt nach:
foundStammCell = stammRange.Find(curSapCell.Value, LookAt:=xlWhole)
auf. Ich bin was VBA angeht ein blutiger Anfänger und verwirre mich gerade glaube ich komplett. Ich möchte eigentlich nur 2 Spalten aus zwei Dateien vergleichen und dann aus der einen Datei Datum zu den jeweiligen Einträgen rauskopieren und dann in der Stammdatei zu den richtigen hinzufügen. Gibt es dafür eventuell eine einfachere Variante oder mache ich das einfach viel zu kompliziert? Hier Beispielbild: https://imgur.com/JFwdZoq
Probier mal
Set foundStammCell = stammRange.Find(curSapCell.Value, LookAt:=xlWhole)
dann dürfte der Fehler eine Zeile später auftreten - wenn foundStammCell dann Nothing sein sollte
Hallo, sorry wurde bearbeitet.