Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1088to1092
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Laufzeitfehler 91 (editiert)

VBA - Laufzeitfehler 91 (editiert)
Bibo
Hallo liebe EXCEL-Freunde,
mit nachstehendem Code, den ich hier aus dem Forum erhalten habe, werden zwei Bestandstabellen verglichen, Bestandsabweichungen in beiden Tabellen gelb sowie die in der Tabelle "Bestand_KOLIBRI" fehlenden Datensätze der Tabelle "Bestand_DVU_VTT" rot markiert.
Option Explicit

Sub Vergleich_Neu_Alt()
'Unterschiedliche Einträge in den Tabellen markieren
Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim ZeileNeu As Long, Spalte As Long, Zelle As Range
Dim varKst, varArt, strAdresse1 As String, gefunden As Boolean
Set wks1 = Sheets("Bestand_KOLIBRI")
'Tabelle1 - anpassen
Set wks2 = Sheets("Bestand_DVU_VTT")
'Tabelle2 - anpassen, in dieser Tabelle wird gekennzeichnet!
'Farbmarkierungen zurücksetzen
With wks1
.UsedRange.Interior.ColorIndex = xlColorIndexNone
End With
With wks2
.UsedRange.Interior.ColorIndex = xlColorIndexNone
End With
For ZeileNeu = 2 To wks2.Cells(wks2.Rows.Count, 1).End(xlUp).Row
varKst = wks2.Cells(ZeileNeu, 1).Value 'Kostenstelle - neu
varArt = wks2.Cells(ZeileNeu, 2).Value 'Artikel - neu
'Kst in alt suchen
Set Zelle = wks1.Columns(1).Find(what:=varKst, LookIn:=xlValues, _
lookat:=xlWhole)
strAdresse1 = Zelle.Address
gefunden = False
If Not Zelle Is Nothing Then
Do
'Prüfen ob und Artikel übereinstimmt
If varArt = wks1.Cells(Zelle.Row, 2) Then
gefunden = True
'Spalten C bis G in den Zeilen vergleichen
For Spalte = 4 To 4
If wks1.Cells(Zelle.Row, Spalte).Value _
 wks2.Cells(ZeileNeu, Spalte).Value Then
'Zelle gelb markieren
wks2.Cells(ZeileNeu, Spalte).Interior.ColorIndex = 6
wks1.Cells(Zelle.Row, Spalte).Interior.ColorIndex = 6
End If
Next
Exit Do
End If
'Nächsten KST-Eintrag suchen
Set Zelle = wks1.Columns(1).FindNext(after:=Zelle)
Loop Until Zelle.Address = strAdresse1
End If
If gefunden = False Then
With wks2
'Spalten A bis D in zeile gelb markieren
.Range(.Cells(ZeileNeu, 1), .Cells(ZeileNeu, 4)).Interior.ColorIndex = 6
End With
End If
Next
Call vergleichMatrixgeloescht
End Sub
Sub vergleichMatrixgeloescht()
'gelöschte Einträge im Bestand alt markieren
Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim ZeileAlt As Long, Zelle As Range
Dim varKst, varArt, strAdresse1 As String, gefunden As Boolean
Set wks1 = Sheets("Bestand_DVU_VTT")
'Tabelle1 - anpassen
Set wks2 = Sheets("Bestand_KOLIBRI")
'Tabelle2 - anpassen, in dieser Tabelle wird gekennzeichnet!
For ZeileAlt = 2 To wks2.Cells(wks2.Rows.Count, 1).End(xlUp).Row
varKst = wks2.Cells(ZeileAlt, 1).Value 'Kostenstelle - alt
varArt = wks2.Cells(ZeileAlt, 2).Value 'Artikel - alt
'Kst in neu suchen
Set Zelle = wks1.Columns(1).Find(what:=varKst, LookIn:=xlValues, _
lookat:=xlWhole)
strAdresse1 = Zelle.Address
gefunden = False
If Not Zelle Is Nothing Then
Do
'Prüfen ob Artikel auch übereinstimmt
If varArt = wks1.Cells(Zelle.Row, 2) Then
gefunden = True
Exit Do
End If
'Nächsten KST-Eintrag suchen
Set Zelle = wks1.Columns(1).FindNext(after:=Zelle)
Loop Until Zelle.Address = strAdresse1
End If
If gefunden = False Then
With wks2
'Spalten A bis D in Zeile rot markieren
.Range(.Cells(ZeileAlt, 1), .Cells(ZeileAlt, 4)).Interior.ColorIndex = 3
End With
End If
Next
End Sub
Die Anweisung Sub Vergleich_Neu_Alt() wird über eine Schaltfläche gestartet und ruft zuletzt die Anweisung Sub vergleichMatrixgeloescht()" auf.
Es kommt zur Fehlermeldung Objektvariable oder With-Blockvariable nicht festgelegt, die
Anweisung Sub vergleichMatrixgeloescht() wird nach Bestätigung des OK-Buttons nicht ausgeführt.
Die Anweisung Sub Vergleich_Neu_Alt() läuft durch und liefert auch richtige Ergebnisse.
Wenn ich das Makro Sub vergleichMatrixgeloescht() hingegen über die Taste F5 im VBA-Editor aufrufe, erhalte ich zwar (auch) die Fehlermeldung Laufzeitfehler 91 - Objektvariable oder With-Blockvariable nicht
festgelegt, der Code markiert jedoch wie gewünscht die fehlenden Datensätze der Tabelle Bestand_DVU_VTT in der Tabelle Bestand_KOLIBRI, wenn ich die Fehlermeldung mit der OK-Schaltfläche bestätigt habe.
Wie ist das zu erklären bzw. noch wichtiger, wie ist dieser Bug zu korrigieren?
Ich danke Euch für die Unterstützung.
Mit freundlichem Gruß
Bibo

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: VBA - Laufzeitfehler 91 (editiert)
20.07.2009 13:41:12
EffHa
Hallo Bibo,
es könnte daran liegen, dass Du die Worksheets nicht wieder freigibst (set wks1=nothing) und sie in der
"vergleichMatrixgeloescht()" nochmals zuweist.
Ich würde die Routine "vergleichMatrixgeloescht" die beiden wks als Argumente mitgeben.
Gruß
Fritz
AW: VBA - Laufzeitfehler 91 (editiert)
20.07.2009 14:44:38
Bibo
Hallo EffHa,
vielen Dank für Deinen Beitrag. Allerdings vermag ich mit meinen VBA-Kenntnissen Deinen Vorschlag nicht umzusetzen.
Gruß
Bibo
AW: VBA - Laufzeitfehler 91 (editiert)
20.07.2009 13:47:31
Luschi
Hallo Bibo,
in der Routine 'Vergleich_Neu_Alt" suchst Du Werte aus der Tabelle 'Bestand_DVU_VTT' in der Tabelle 'Bestand_KOLIBRI'. Da alle Suchwerte in der 1. Tabelle auch in der 2. Tabelle vorhanden sind, läuft alles glatt.
In der 2. Routine suchst Du seitenvertauscht, also alle Werte aus 'Bestand_KOLIBRI' in Tabelle 'Bestand_DVU_VTT' . Da aber in diesem Fall in 'Bestand_DVU_VTT' nicht alle Suchwerte vorhanden sind, knallt es an dieser Stelle:
strAdresse1 = Zelle.Address
denn der darüberstehende Befehl:
Set Zelle = wks1.Coluns(1).Find(what:=varKst, LookIn:=xlValues, lookat:=xlWhole)
liefert für einige Suchbegriffe 'Nothing' ; Nothing besitzt aber keine Zelladresse!
Deshalb sollte es so funktionieren:

Sub vergleichMatrixgeloescht()
'gelöschte Einträge im Bestand alt markieren
Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim ZeileAlt As Long, Zelle As Range
Dim varKst, varArt, strAdresse1 As String, gefunden As Boolean
Set wks1 = Sheets("Bestand_DVU_VTT")
'Tabelle1 - anpassen
Set wks2 = Sheets("Bestand_KOLIBRI")
'Tabelle2 - anpassen, in dieser Tabelle wird gekennzeichnet!
For ZeileAlt = 2 To wks2.Cells(wks2.Rows.Count, 1).End(xlUp).Row
varKst = wks2.Cells(ZeileAlt, 1).Value 'Kostenstelle - alt
varArt = wks2.Cells(ZeileAlt, 2).Value 'Artikel - alt
'Kst in neu suchen
gefunden = False
Set Zelle = wks1.Columns(1).Find(what:=varKst, LookIn:=xlValues, _
lookat:=xlWhole)
If Not Zelle Is Nothing Then
strAdresse1 = Zelle.Address
Do
'Prüfen ob Artikel auch übereinstimmt
If varArt = wks1.Cells(Zelle.Row, 2) Then
gefunden = True
Exit Do
End If
'Nächsten KST-Eintrag suchen
Set Zelle = wks1.Columns(1).FindNext(after:=Zelle)
Loop Until Zelle.Address = strAdresse1
End If
If Not gefunden Then
With wks2
'Spalten A bis D in Zeile rot markieren
.Range(.Cells(ZeileAlt, 1), .Cells(ZeileAlt, 4)).Interior.ColorIndex = 3
End With
End If
Next
End Sub
Gruß von Luschi
aus klein-Paris
PS: Es ist übrigens besser, auch in der 1. Routine erst auf Nothing zu prüfen und dann in der Do-Schleife die Zelladresse zu ermitteln (Schreibfehler, ausversehenes Löschen von Werten...)
If Not gefunden Then entspricht
If gefunden = False Then
ist aber kürzer in der Schreibweise und in derBefehlsausführung. Die If-Bedingung vergleicht intern immer auf True oder False
In 1. Fall wird der Wert in 'gefunden' einfach negiert und dann verglichen, ob das Ergebnis True ist.
Im 2. Fall wird 'gefunden' erst mit False verglichen und dann geprüft, ob das Ergebnis True ist.
Das ist ein Vergleich mehr, und der kostet mehr Zeit als ein Umdrehen des Ergebnisses.
(Manche sagen auch Krümelkackerei dazu!)
Anzeige
AW: VBA - Laufzeitfehler 91 (editiert)
20.07.2009 14:52:36
Bibo
Hallo Luschi,
vielen Dank für Deine Mühe.
Habe Deinen angepassten Code in "Diese Arbeitsmappe" kopiert und bekomme die selbe Fehlermeldung wie vorher. Allerdings erhalte ich keine Fehlermeldungmehr, wenn ich den Code direkt im VBA-Editor aufrufe.
Außerdem habe ich festgestellt, dass es zu keinen Problemen kommt, wenn ich die Anweisung
Sub vergleichMatrixgeloescht() über eine eigene gesonderte Schaltfläche aufrufe.
Kannst Du Dir dieses Phänomen erklären?
Gruß
Bibo
AW: VBA - Laufzeitfehler 91 (editiert)
20.07.2009 14:58:36
Kawensmann
Hallo,
wenn es ein Button aus der Steuerelement-Symbolleiste ist, setz mal die Eigenschaft "TakeFocusOnClick" auf False.
Gruß
Kawensmann
Anzeige

89 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige