Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Oobjektvariable oder with-blockvariable nicht fest | Herbers Excel-Forum


Betrifft: Oobjektvariable oder with-blockvariable nicht fest von: Marcel
Geschrieben am: 22.02.2012 10:49:31

objektvariable oder with-blockvariable nicht festgelegt

Hallo,
ich bin langsam am verzweifeln.

ich habe ein Makro in meiner Tabelle welches ein Datenbereich (der jeweils in einer Zeile liegt) aus einem anderen Tabellenblatt, nach dem Abgleich des Datums kopiert.
Danach springt es eine Zeile weiter und führt die Prüfung erneut durch.
Das Makro wird in 2 Tabellenblättern verwendet (in jedem Tabellenbl. ist der Code hinterlegt) unterscheidet sich nur in dem "Bezug [Tabellenblatt FAW SY(1A) u. FAW SY(1B)]" der zu kopierenden Daten.

Mein Problem besteht aus zwei Teilen:
zum einen:
- es erscheint beim Ausführen des Markros in dem 2. Tabellenblatt die Fehlermeldung.
" objektvariable oder with-blockvariable nicht festgelegt"
aber nur in der 2. Tabellenblatt das 1. funktioniert soweit, obwohl sich der "code" nicht unterscheidet.

zum anderen:
- das Markro gleicht ein Datum ( in Spalte A) mit dem fortlaufenden Kalenderdaten in Zeile 5 ab und überträgt den Datenbereich (mehrere Zellen) ab der "übereinstimmenden" Zelle

Problem: das Datum in Spalte A wird aus einem weiteren Tabellenblatt übertragen, wenn sich dieses Datum ändert oder dazwischen ein neues eingetragen wird, werden Daten teilweise doppelt übertragen.

es müsste bei einer Veränderung in der ersten Spalte (A1 =1) der Datenbereich(B6:B bis B:ACN)
gelöscht werden und das Makro neu ausgeführt.

Ist das möglich?

ich bin über jede Hilfe sehr dankbar!

VBA Code:


Sub t2()
Dim lz, alz, az, alzr As Range
Dim ber1, ber2, SpaBu, test As String
Dim ilz, ilzr, i As Integer

With ThisWorkbook.Sheets("AP (1A)").Range("a7:a500") '.Range("a7:a500") Bereich der geprüft  _
wird,
         Set lz = .Find(what:="*", after:=.Range("A1"), LookIn:=xlValues, _
               lookat:=xlWhole, searchdirection:=xlPrevious)
       End With
      ilz = lz.Row ' lz.Row ist die letzte Zeile
      
 Set alz = Range("a6:a" & ilz)
 Set alzr = Range("5:5")
 
For i = 1 To ilz - 7 ' -7 da die ersten 7 Zeilen auslassen werden sollen(die 1. Stelle des  _
Arrays "alz" ist die 7 Zeile)
    For ii = 2 To 767 ' 767 ist Spalte 'ACN' (Bereichsende manuell festgelegt)
        If alz(i) = alzr(ii) Then
            ber1 = Range(Cells(alz(i).Row - 2, 6), Cells(alz(i).Row - 2, 200)).Address
            With ThisWorkbook.Sheets("FAW SY(1A)").Range(ber1)
                Set lz = .Find(what:="*", after:=.Range("A1"), LookIn:=xlValues, lookat:= _
xlWhole, searchdirection:=xlPrevious)
            End With
            ber1 = Range("g" & lz.Row, lz.Address).Address
            SpaBu = Mid(alzr(ii).Address, 2, InStr(2, alzr(ii).Address, "$") - 2)
            ber2 = SpaBu & alz(i).Row & ":" & SpaBu & alz(i).Row
            Sheets("FAW SY(1A)").Range(ber1).Copy
            Sheets("AP (1A)").Range(ber2).PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
        End If
    Next ii
Next i
End Sub

  

Betrifft: AW: Oobjektvariable oder with-blockvariable nicht fest von: dan
Geschrieben am: 22.02.2012 16:22:53

Hallo Marcel,
die Variable ii is nich deklariert worden. Es fehlt: Dim ii As Integer
Gruss dan, cz


  

Betrifft: AW: Oobjektvariable oder with-blockvariable nicht fest von: Marcel
Geschrieben am: 23.02.2012 08:59:42

Hallo,
danke für die schnelle Antwort.

das makro läuft für das erste wieder

ich habe es noch ein wenig modifiziert, beim Aufruf wird der Datenbereich gelöscht und später wieder neu beschrieben. so hoffe ich das Problem mit doppelt geschrieben Daten zu vermeiden.

Ein Problem besteht weiterhin,
die letzten beiden Datenreihen werden nicht übertragen.

wie kann ich das beheben?


  

Betrifft: AW: Oobjektvariable oder with-blockvariable nicht fest von: Marcel
Geschrieben am: 23.02.2012 09:02:26

hier noch der aktuelle code

Sub t2()
Dim lz, alz, az, alzr As Range
Dim ber1, ber2, SpaBu, test As String
Dim ilz, ilzr, ii, i As Integer

With ThisWorkbook.Sheets("AP (1A)").Range("a7:a500") '.Range("a7:a500") Bereich der geprüft  _
wird,
         
         ThisWorkbook.Sheets("AP (1A)").Range("B7:ACN500").ClearContents
         
         Set lz = .Find(what:="*", after:=.Range("A1"), LookIn:=xlValues, _
               lookat:=xlWhole, searchdirection:=xlPrevious)
       End With
      ilz = lz.Row ' lz.Row ist die letzte Zeile
      
 Set alz = Range("a6:a" & ilz)
 Set alzr = Range("5:5")
 
For i = 1 To ilz - 7 ' -7 da die ersten 7 Zeilen auslassen werden sollen(die 1. Stelle des  _
Arrays "alz" ist die 7 Zeile)
    For ii = 2 To 767 ' 767 ist Spalte 'ACN' (Bereichsende manuell festgelegt)
        If alz(i) = alzr(ii) Then
            ber1 = Range(Cells(alz(i).Row - 2, 6), Cells(alz(i).Row - 2, 200)).Address
            With ThisWorkbook.Sheets("FAW SY(1A)").Range(ber1)
                Set lz = .Find(what:="*", after:=.Range("A1"), LookIn:=xlValues, lookat:= _
xlWhole, searchdirection:=xlPrevious)
            End With
            ber1 = Range("g" & lz.Row, lz.Address).Address
            SpaBu = Mid(alzr(ii).Address, 2, InStr(2, alzr(ii).Address, "$") - 2)
            ber2 = SpaBu & alz(i).Row & ":" & SpaBu & alz(i).Row
            Sheets("FAW SY(1A)").Range(ber1).Copy
            Sheets("AP (1A)").Range(ber2).PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
        End If
    Next ii
Next i
End Sub



  

Betrifft: AW: Oobjektvariable oder with-blockvariable nicht fest von: dan
Geschrieben am: 23.02.2012 21:49:50

Hallo Marcel,
zwei Probleme habe ich noch in Deinem Code gefunden.
1/ Wenn man die Function Find ruft, muss man damit rechnen, dass nichts gefunden wird. Wenn man den 'Ergebnis' der Find Methode benutzt wenn es Nothing ist, bekommt man die Fehlermeldung: "Oobjektvariable oder with-blockvariable nicht fest...".
2/ Range() Methode so gerufen bezieht sich zu dem ActiveSheet. Es ist also equivalent zu ActiveSheet.Range(). Besser ist immer ein Bezug auf den Worksheet benutzen. So vermeidet man unerwartete Ergebnisse.




Option Explicit

' Function Find(What, [After], [LookIn], [LookAt], [SearchOrder], [SearchDirection As XlSearchDirection = xlNext], [MatchCase], [MatchByte], [SearchFormat]) As Range

Public Sub FindTest()
  Dim sourceWorksheet As Worksheet
  Dim sourceRange As Range
  Dim findResult As Range
  
  Set sourceWorksheet = Worksheets("AP (1A)")
  Set sourceRange = sourceWorksheet.Range("a7:a500")
  
  Set findResult = sourceRange.Find(What:="*", _
                                    After:=sourceRange.Range("A1"), _
                                    LookIn:=xlValues, _
                                    LookAt:=xlWhole, _
                                    SearchDirection:=xlPrevious)
  
  
  Dim findResultRow As Integer ' Zeile wo Find() den Stern gefunden hat
  
  ' diese Zeilen verursachen kein Error nur dann, wenn in dem source-range
  ' mindestens eine Zelle mit dem Stern vorkommt
  findResult.Activate
  findResultRow = findResult.Row
  
  Set findResult = sourceRange.Find(What:="Aber such jetzt etwas was " & _
                                          "in dem source range ganz bestimmt " & _
                                          "nicht vorkommt ...", _
                                    After:=sourceRange.Range("A1"), _
                                    LookIn:=xlValues, _
                                    LookAt:=xlWhole, _
                                    SearchDirection:=xlPrevious)
  
  ' Wenn Find() nichts findet, dann gibt es Nothing (Nichts) zurueck,
  ' also man muss erstmals testen, ob Find() etwas gefunden hat:
  If (Not findResult Is Nothing) Then
    findResultRow = findResult.Row
  Else
    MsgBox "In dem Bereich [" & sourceRange.Address & "] nichts gefungen."
  End If
End Sub