Microsoft Excel

Herbers Excel/VBA-Archiv

VBA Range Find Laufzeitfehler

Betrifft: VBA Range Find Laufzeitfehler von: Zissy
Geschrieben am: 16.09.2014 13:22:46

Hallo,

ich schreibe gerade mein erstes Makro. Und bekomme eine Fehlermeldung einfach nicht weg.


Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt
Diese Meldung tritt im Bereich V. auf.

Tabelle 2: Liefert die Daten, zu jeder Kennung & Gruppe gibt es unterschiedliche Texte. je Text eine neue Zeile mit Kennung & Gruppe
Tabelle 1: Soll pro Zeile je eine kenning & Gruppe haben mit allen dazugehörigen Texten. Wobei jeder Text eine Spalte ist und immer nur entsprechend ein "ja" gesetzt warden soll, wenn vorhanden.

Habt ihr eine Idee wo mein Fehler ist?

Grüße, Zissy
Sub pruef()

Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim Zei1 As Integer
Dim Zei2 As Integer
Dim ZeiAz As Integer
Dim SpalteNr As Integer
Dim ZeileNr As Integer

Set wks1 = Worksheets("Tabelle2")
Set wks2 = Worksheets("Tabelle1")

Zei1 = 1 ' Zeilenindex für wks1
Zei2 = 1 ' Zeilenindex für wks2
ZeiAz = wks2.Cells(1, Columns.Count).End(xlToLeft).Column ' Spaltenanzahl wks2

' I. Durchlaufe komplette Spalte
Do Until IsEmpty(wks1.Cells(Zei1, 3))
        Zei1 = Zei1 + 1
          
       ' II. nur Gruppe1 betrachten
        If InStr(wks1.Cells(Zei1, 7), "Gruppe1") > 0 Then
            ' III. wenn Kennung nicht vorhanden in wsk2
           If Range(wks2.Cells(1, 1), wks2.Cells(Zei2, 1)).Find(wks1.Cells(Zei1, 3)) Is Nothing  _
 _
Then
                
                Zei2 = Zei2 + 1
                
                ' Kennung setzten in wks2 Spalte 1 schreiben
                wks2.Cells(Zei2, 1).Value = wks1.Cells(Zei1, 3)
                '  setzten in wks2 Spalte 2 schreiben
                wks2.Cells(Zei2, 2).Value = wks1.Cells(Zei1, 6)
                ' setzten in wks2 Spalte 3 schreiben
                wks2.Cells(Zei2, 3).Value = wks1.Cells(Zei1, 5)
                ' Gruppe setzten in wks2 Spalte 4 schreibens
                wks2.Cells(Zei2, 4).Value = wks1.Cells(Zei1, 7)
                
		' IV. Schreibe ja entsprechend, wenn/wo Text in Titel auftaucht
                If Range(wks2.Cells(1, 5), wks2.Cells(1, ZeiAz)).Find(wks1.Cells(Zei1, 8),  _
LookIn:=xlValues) Is Nothing Then
                     
                Else
                    SpalteNr = wks2.Cells.Find(wks1.Cells(Zei1, 8).Value).Column
                    wks2.Cells(Zei2, SpalteNr).Value = "ja"
                End If
                
                                       
            ' V. wenn Kennung bereits in wsk2 vorhanden - Schreibe ja entsprechend, wenn/wo  _
Text in Titel auftaucht
            Else
            	
      	       	SpalteNr = wks2.Range(wks2.Cells(1, 5), wks2.Cells(1, ZeiAz)).Find(wks1.Cells( _
Zei1, 8)).Column
		ZeileNr = wks2.Range(wks2.Cells(1, 1), wks2.Cells(Zei2, 1)).Find(wks1.Cells(Zei1, 3)).Row
      	       	wks2.Cells(ZeileNr, SpalteNr).Value = "ja"

            End If
        End If
Loop
End Sub

  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Rudi Maintaire
Geschrieben am: 16.09.2014 13:33:35

Hallo,
das läuft natürlich in einen Fehler, wenn nix gefunden wird.
Also erst feststellen, ob was gefunden wird.

Set rFind=wks2.Range(wks2.Cells(1, 5), wks2.Cells(1, ZeiAz)).Find(wks1.Cells(Zei1, 8))
If Not Rfind is nothing then
  SpalteNr=rFind.Column
End If

ZeileNr analog.

Außerdem solltest du der Find-Methode noch die Parameter LookIn und LookAt mitgeben.

Gruß
Rudi


  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Daniel
Geschrieben am: 16.09.2014 13:34:20

Hi

der Fehler tritt auf, wenn die .FIND-Funktion nichts finden kann, denn von "nichts" kann man keine Zeilennummer oder Spaltennummer ermitteln (darum der Fehler)

um den Fehlerabbruch zu vermeiden, sollte man die Fundstellen derstmal in eine Range-Variable schreiben (hier verursacht das "nichts" noch keinen Fehler) und dann prüfen, ob die Variablen leer sind oder nicht:

für deinen Bereich V (Variablendeklaration bitte an den Anfang des Makros stellen):

Dim ZelleS As Rane
Dim ZelleR As Range

Set ZelleS = wks2.Range(wks2.Cells(1, 5), wks2.Cells(1, ZeiAz)).Find(wks1.Cells(Zei1, 8))
Set ZelleR = wks2.Range(wks2.Cells(1, 1), wks2.Cells(Zei2, 1)).Find(wks1.Cells(Zei1, 3))
If Not (ZelleS Is Nothing And ZelleR Is Nothing) Then 
    Intersect(ZelleS.EntireColumn, ZelleR.EntireRow).Value = "ja"
End If
Gruß Daniel


  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Zissy
Geschrieben am: 16.09.2014 14:08:05

Hey, danke euch beiden für die schnelle Antwort

@Daniel der Code gibt mir dann auch wieder die gleiche Fehlermeldung aus

@Rudi der Code erfüllt seinen Job

Grüße, Zissy


  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Daniel
Geschrieben am: 16.09.2014 14:33:40

Hi
du musst die Deklaration auch richtig Schreiben:

Dim ZelleS as Range

Hirn einschalten beim Abschreiben ist nicht verboten!
Tippfehler vermeidest du durch Nutzung der Intellisense, diese gibts hier im Forum nicht.

Gruß Daniel


  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Zissy
Geschrieben am: 16.09.2014 14:56:45

Hi,

Die Deklaration habe ich schon berichtigt gehabt. Dennoch tauchte die Fehlermeldung wieder unten im Code auf...

Gruß Zissy


  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Daniel
Geschrieben am: 16.09.2014 15:25:10

Hi
1. wie sieht dein Code aus?
2. in welcher Zeile taucht die Fehlermeldung auf?
3. wie lautet die Fehlermeldung?
4. welche Werte haben die Variablen, die in der Fehlerverursachenden Zeile verwendet werden?

Gruß Daniel


  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Zissy
Geschrieben am: 16.09.2014 15:47:06

HI,

Sub pruef()

Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim Zei1 As Integer
Dim Zei2 As Integer
Dim ZeiAz As Integer
Dim SpalteNr As Integer
Dim ZeileNr As Integer

Dim ZelleS As Range
Dim ZelleR As Range

Set wks1 = Worksheets("Tabelle2")
Set wks2 = Worksheets("Tabelle1")

Zei1 = 1 ' Zeilenindex für wks1
Zei2 = 1 ' Zeilenindex für wks2
ZeiAz = wks2.Cells(1, Columns.Count).End(xlToLeft).Column ' Spaltenanzahl wks2

' I. Durchlaufe komplette Spalte
Do Until IsEmpty(wks1.Cells(Zei1, 3))
        Zei1 = Zei1 + 1
          
       ' II. nur Gruppe1 betrachten
        If InStr(wks1.Cells(Zei1, 7), "Gruppe1") > 0 Then
            ' III. wenn Kennung nicht vorhanden in wsk2
           If Range(wks2.Cells(1, 1), wks2.Cells(Zei2, 1)).Find(wks1.Cells(Zei1, 3)) Is Nothing  _
Then                
                Zei2 = Zei2 + 1
                
                ' Kennung setzten in wks2 Spalte 1 schreiben
                wks2.Cells(Zei2, 1).Value = wks1.Cells(Zei1, 3)
                '  setzten in wks2 Spalte 2 schreiben
                wks2.Cells(Zei2, 2).Value = wks1.Cells(Zei1, 6)
                ' setzten in wks2 Spalte 3 schreiben
                wks2.Cells(Zei2, 3).Value = wks1.Cells(Zei1, 5)
                ' Gruppe setzten in wks2 Spalte 4 schreibens
                wks2.Cells(Zei2, 4).Value = wks1.Cells(Zei1, 7)
                
		' IV. Schreibe ja entsprechend, wenn/wo Text in Titel auftaucht
                If Range(wks2.Cells(1, 5), wks2.Cells(1, ZeiAz)).Find(wks1.Cells(Zei1, 8),  _
LookIn:=xlValues) Is Nothing Then
                     
                Else
                    SpalteNr = wks2.Cells.Find(wks1.Cells(Zei1, 8).Value).Column
                    wks2.Cells(Zei2, SpalteNr).Value = "ja"
                End If
                                     
            ' V. wenn Kennung bereits in wsk2 vorhanden - Schreibe ja entsprechend, wenn/wo  _
Text in Titel auftaucht

             Else
                
                Set ZelleS = wks2.Range(wks2.Cells(1, 5), wks2.Cells(1, ZeiAz)).Find(wks1.Cells( _
Zei1, 8))
                Set ZelleR = wks2.Range(wks2.Cells(1, 1), wks2.Cells(Zei2, 1)).Find(wks1.Cells( _
Zei1, 3))
                If Not (ZelleS Is Nothing And ZelleR Is Nothing) Then
                         Intersect(ZelleS.EntireColumn, ZelleR.EntireRow).Value = "ja"
                End If
             End If
        End If

Loop
End Sub
Fehlermeldung taucht bei "Intersect(ZelleS.EntireColumn, ZelleR.EntireRow).Value = "ja"" auf.
Sie lautet: Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt

Wie die Werte tatsächlich aussehen, weiß ich nicht, wollte die Variable ZelleS in einer Zelle ausgeben, bekomme dann aber auch wieder die oben benannte Fehlermeldung.
             
            ' wenn Kennung bereits in wsk2 vorhanden
            Else
                
                Set ZelleS = wks2.Range(wks2.Cells(1, 5), wks2.Cells(1, ZeiAz)).Find(wks1.Cells( _
Zei1, 8))
                Set ZelleR = wks2.Range(wks2.Cells(1, 1), wks2.Cells(Zei2, 1)).Find(wks1.Cells( _
Zei1, 3))
                If Not (ZelleS Is Nothing And ZelleR Is Nothing) Then
                        wks2.Cells(Zei2, 14).Value = ZelleS.Value
                        wks2.Cells(Zei2, 15).Value = ZelleR.Value
                         
                         ' Intersect(ZelleS.EntireColumn, ZelleR.EntireRow).Value = "ja"
                End If
            End If
Gruß, Zissy


  

Betrifft: AW: VBA Range Find Laufzeitfehler von: Daniel
Geschrieben am: 16.09.2014 15:59:45

Hi
mach mal aus dem AND ein OR
Gruß Daniel


 

Beiträge aus den Excel-Beispielen zum Thema "VBA Range Find Laufzeitfehler"