Fehlersuche: Methode 'Range' Objekt '_Worksheet' fehlgeschlagen

  • Excel

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Petersilie.

    Fehlersuche: Methode 'Range' Objekt '_Worksheet' fehlgeschlagen

    Hi Zusammen,
    ich finde den Fehler nicht. Sieht von euch jemand was in der folgenden Zeile?

    Quellcode

    1. wsTab2.Range(Cells(j, lngSuchSp), Cells(j, lngSuchSp + 8)).Copy Destination:=wsTab1.Range(Cells(i, 3), Cells(i, 3))


    Um den Zusammenhang verstehen zu könne hier die ganze Prozedur.

    Quellcode

    1. Sub AuswertungKostentabelle()
    2. '1 bezeichnet alle Variablen im Tabellenblatt KostenTool
    3. '2 bezeichnet alle Variablen im Tabellenblatt Kostentabelle
    4. Dim strInfuniqID1 As String
    5. Dim strInfuniqID2 As String
    6. Dim strMaschtyp1 As String
    7. Dim strMaschtyp2 As String
    8. Dim strVerkMaschtyp_ID1 As String
    9. Dim strVerkMaschtyp_ID2 As String
    10. Dim wsTab1 As Worksheet
    11. Dim wsTab2 As Worksheet
    12. Dim ws As Worksheet
    13. Dim lngAK As Long
    14. Dim lngLZ1 As Long
    15. Dim lngLZ2 As Long
    16. Dim i As Long
    17. Dim j As Long
    18. '#Spalte Auftragskosten suchen
    19. Dim lngSuchSp As Long 'Spalte der Auftragskosten in Kostentabelle
    20. Dim k As Long
    21. Dim intLS As Integer
    22. Dim strSuchTxt1 As String 'SuchText
    23. Set wsTab1 = ThisWorkbook.Worksheets("Kostentool - ICON")
    24. Set wsTab2 = ThisWorkbook.Worksheets("Kostentabelle")
    25. strSuchTxt1 = "Auftragskosten"
    26. intLS = wsTab2.Cells(5, Columns.Count).End(xlToLeft).Column ' Letzte Spalte in Zeile "5"
    27. For Each ws In ActiveWorkbook.Sheets
    28. If ws.Name = "Kostentabelle" Then
    29. For k = intLS To 1 Step -1 'Sucht Suchtext und gibt Spaltennummer wieder
    30. If wsTab2.Cells(5, k).Text = strSuchTxt1 Then
    31. lngSuchSp = k
    32. End If
    33. Next k
    34. lngLZ1 = wsTab1.Cells(Rows.Count, 2).End(xlUp).Row ' Letzte Zeile in Spalte "2"
    35. For i = 10 To lngLZ1
    36. strInfuniqID1 = wsTab1.Cells(i, 2)
    37. strMaschtyp1 = wsTab1.Cells(5, 2)
    38. strVerkMaschtyp_ID1 = strInfuniqID1 & strMaschtyp1
    39. lngLZ2 = wsTab2.Cells(Rows.Count, 6).End(xlUp).Row ' Letzte Zeile in Spalte "6"
    40. For j = 6 To lngLZ2
    41. strInfuniqID2 = wsTab2.Cells(j, 6)
    42. strMaschtyp2 = wsTab2.Cells(j, 8)
    43. strVerkMaschtyp_ID2 = strInfuniqID2 & strMaschtyp2
    44. If strVerkMaschtyp_ID1 = strVerkMaschtyp_ID2 Then
    45. wsTab2.Range(Cells(j, lngSuchSp), Cells(j, lngSuchSp + 8)).Copy Destination:=wsTab1.Range(Cells(i, 3), Cells(i, 3))
    46. ElseIf strInfuniqID1 = strInfuniqID2 Then
    47. wsTab2.Range(Cells(j, lngSuchSp), Cells(j, lngSuchSp + 8)).Copy Destination:=wsTab1.Range(Cells(i, 3), Cells(i, 3))
    48. Else
    49. MsgBox ("Folgende Infuniq ID wurde nicht gefunden: " & strInfuniqID1), vbInformation
    50. End If
    51. Next j
    52. Next i
    53. MsgBox ("Es ist keine Kostentabelle zum Prüfen vorhanden!"), vbInformation
    54. End If
    55. Next ws
    56. End Sub


    Bin gespannt.... :D
    Das Problem ist, Excel weiss nicht auf welchem Worksheet deine Zellen sind, deshalb nimmt es automatisch die auf dem aktiven Worksheet.
    Beispiel: Das wsTab1 ist aktiv, dann macht Excel mit deinem Code dies

    Visual Basic-Quellcode

    1. wsTab2.Range(wsTab1.Cells(j,lngSuchSp), wsTab1.Cells(j, lngSuchSp + 8)).Copy wsTab1.Range(wsTab1.Cells(i, 3), wsTab1.Cells(i, 3))
    Also Excel versucht auf wsTab2 Zellen, die auf wsTab1 sind, zu kopieren und das geht nicht.

    Also richtig sollte dein Code so aussehen...

    Visual Basic-Quellcode

    1. wsTab2.Range(wsTab2.Cells(j, lngSuchSp), wsTab2.Cells(j, lngSuchSp + 8)).Copy wsTab1.Range(wsTab1.Cells(i, 3), wsTab1.Cells(i, 3))
    Guten Morgen Henry,
    danke für deinen Tipp.... damit funktioniert es nun. :)

    Allerdings rüttelt es auch ein wenig an meinem Verständnis, da ich bisher immer davon ausgegangen bin,
    dass wenn ich Range ein Worksheet zuweise, wie hier durch "wsTab2.range" und "range" dann genauer definieren will, eben durch ".cells",
    er dann Weiss das cells ebenfalls in dem definiertem worksheet von range ist.

    Dem scheint aber generell nicht so zu sein?????
    @Stonerule

    Hallo,
    Zellen sind Objekte.
    Bei Objekten solltest du immer klare Referenzen setzen.

    Beispiele:

    Visual Basic-Quellcode

    1. 'Mit With
    2. 'Klare Refernzierung, vor jedem "." innerhalb dieses With, steht jetzt also wsTab2
    3. With wsTab2
    4. Set rng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Row)
    5. End With
    6. 'Ohne With
    7. Set rng = wsTab2.Range(wsTab2.Cells(1, 1), wsTab2.Cells(wsTab2.Rows.Count, 1).End(xlUp).Row)
    8. 'Mehr als ein With
    9. With wsTab2
    10. Set rng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp).Row)
    11. With rng
    12. 'Jetzt also: rng.Find/rng.ClearContents
    13. Set c = .Find("something")
    14. If c Is Nothing Then .ClearContents
    15. End With
    16. End With


    Ohne klare Referenz, wird einfach das ActiveWorkbook bzw ActiveSheet genommen,