VBA Laufzeit 1004 - Die Methode Range für das Objekt_Global ist fehlgeschlagen

Suma

Lt. Commander
Registriert
Juni 2013
Beiträge
1.528
Hey,

hab ein Problem mit diesem Code:

Range(wks1.Cells(3, 1), wks1.Cells(2 + AnzahlG, 7)).Sort Key1:=Range(wks1.Cells(3, 1)), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

wks1 ist mein Tabellenblatt, dass ich natürlich vorher definiert habe...

derselbe Code funktioniert in einem anderen Dokument problemlos..

Ich wollte 2 Dokumente zu einem zusammenfassen mit 2 Modulen, die jeweils ein Programm enthalten, das jeweils für ein Tabellenblatt gedacht ist...(Beide Dokumente für sich genommen, funktionieren wunderbar...Beide Programme greifen auf 2 andere Tabllenblätter zu)

Der Rest des Codes funktioniert problemlos... die Sortierung ist die letzte Operation im Code.. der Rest wird vorher exakt so ausgeführt, wie es sein soll...

Hab schon ein bissel gegoogelt, aber noch keine Lösung für mein Problem gefunden...

Hoffe, dass ihr mir helfen könnt :D
 
Zuletzt bearbeitet:
Jop, ist definiert...

wie gesagt, bevor ich die beiden Dokumente zusammengelegt habe, hat alles wunderbar funktioniert...

ich versteh es nicht...
 
Man sollte die Range-Funktion immer von einem Objekt aus aufrufen, d.h. in deinem Fall wks1.Range(.....)
 
Sehr komisch...

Habe den Code ausführen können...

Ich darf meinen Mauszeiger nur nicht im Modul haben... erst einmal rausklicken und dann auf ausführen klicken...

Echt umständlich so...

kann mir einer sagen, wie ich ändern kann?
Ergänzung ()

diablobase schrieb:
Man sollte die Range-Funktion immer von einem Objekt aus aufrufen, d.h. in deinem Fall wks1.Range(.....)

Ich definiere den Range ja durch die wks1.Cells... das reicht als Zuweisung aus, denke ich...

Man kann entweder wks1.Range(Cells(), Cells()) oder Range(wks1.Cells(), wks1.Cells())

Ist dasselbe... wenn man beides macht, dann is das doppelt gemoppelt :D
Ergänzung ()

Jetzt funktioniert es wieder nicht...

jetzt bin ich endlos verwirrt...
Ergänzung ()

auch mit wks1.Range() kann ich nichts an dem Fehler ändern...

habe diese Code Zeile in beiden Programme für beide Tabellenblätter

im ersten funktioniert es, im zweiten nicht...
Ergänzung ()

Habe anscheinend den Fehler und das Problem gefunden...

Habe bei Key1 vor dem Range ein wks1. eingefügt und nun funktioniert es...

Das grundlegende Problem ist aber folgendes:

Da ich beide Programme nacheinander ausführen lasse, hat er da anscheinend ein Problem mit den Tabellenblättern...

Wenn ich in dem jeweiligen Tabellenblatt bin und dort das jeweiige Programm ausführe, funktioniert es

Möchte ich in Tabellenblatt 1 das Programm für Tabellenblatt 2 ausführen kommt der Fehler...

neuste Fehlerzeile:

wks1.Range(wks1.Cells(1, 1), wks1.Cells(2 + AnzahlG, 7)).Select

Und da kann nun wirklich nichts dran falsch sein...

Ich habe ein drittes makro, dass die anderen beiden nacheinander aufruft...

Wenn ich mich dann in einem Tabellenblatt befinde, springt er immer zwischen 1 und 2 hin und her, obwohl das nicht so im Code steht...

Da bearbeite ich die beiden Tabellenblätter ja in 2 Programmen nacheinander.. wie kann es sein, dass er die parallel macht?

Weil ich benutze wks1 in beiden, definiere es aber halt anders...

Möglicher Lösungsansatz:

Wie kann ich beide Programme nacheinander ausführen, ohne dass sie sich gegenseitig stören?
 
Zuletzt bearbeitet:
Also das hin und her springen kommt vermutlich durch das .Select damit änderst du dann auch worauf sich andere Befehle beziehen.
diablobase hat schon recht speziell in deinem Fall wo du mit zwei Verschiedenen Arbeitsblättern arbeitest solltest du schon explizit angeben womit du arbeitest das hat dann auch nichts mit doppelt gemoppelt zu tun (Also nicht nur auf Range bezogen sondern ALLES)

Ich weiß nicht warum du überhaupt .Select benutzt in der Regel ist VBA Code besser der das garnicht erst benutzt ;) Es gibt ein paar Ausnahmen wo es sich lohnt aber versuch doch mal das Allgemeiner zu formulieren.
 
Ich benutze Select nur am Ende beider Programme einmal zur Formatierung der Tabellen...

Ich hasse select auch selber wie die Pest, aber hier war ich jetzt zu faul es anders zu machen...

Aber da ich ja die Programme nacheinander ausführe, sollte es doch so sein, dass er zuerst im ersten Tabellenblatt alles abarbeitet und danach im zweiten...

Das tut er aber nicht, er wechselt mehrere Male zwischen den beiden Blättern...
 
Dann vielleicht weil du irgendwo Befehle ohne Kontext benutzt und die sich dann zufällig auf das Arbeitsblatt beziehen das du gerade nicht abarbeitest? Ich weiß nicht genau was alles einen entsprechenden Wechsel triggert, du könntest ja mal mehr Code posten ;)
 
Code:
Option Explicit

Dim wks1 As Worksheet
Dim wks2 As Worksheet
Dim wks3 As Worksheet

Sub Eintragen1()
Set wks1 = Worksheets("Analyse1")
Set wks2 = Worksheets("Daten")
Set wks3 = Worksheets("K-Liste")
Dim Zeile As Integer
Dim Zeile2 As Integer
Dim Zeile3 As Integer
Dim AnzahlG As Integer
Dim vorhanden As Integer
Dim Stelle As Integer
Dim i As Integer
Zeile = 20
Zeile2 = 8
Zeile3 = 8
AnzahlG = 0
vorhanden = 0
Stelle = 0
Worksheets("Analyse1").Cells.Clear
Do
    If (wks2.Cells(Zeile, 11) <> "") Then
        If (wks2.Cells(Zeile, 8) = "OS") Then
            vorhanden = 0
            For i = 0 To AnzahlG
                If wks1.Cells((3 + i), 1) = wks2.Cells(Zeile, 7) Then
                    vorhanden = 1
                    Stelle = 3 + i
                End If
            Next i
            If vorhanden = 0 Then
                wks2.Cells(Zeile, 7).Copy
                wks1.Cells((3 + AnzahlG), 1).PasteSpecial Paste:=xlValues
                wks1.Cells((3 + AnzahlG), 2) = wks1.Cells((3 + AnzahlG), 2) + wks2.Cells(Zeile, 26)
                wks1.Cells((3 + AnzahlG), 3) = wks1.Cells((3 + AnzahlG), 3) + wks2.Cells(Zeile, 27)
                wks1.Cells((3 + AnzahlG), 4) = wks1.Cells((3 + AnzahlG), 4) + wks2.Cells(Zeile, 28)
                wks1.Cells((3 + AnzahlG), 5) = wks1.Cells((3 + AnzahlG), 5) + wks2.Cells(Zeile, 29)
                wks1.Cells((3 + AnzahlG), 6) = wks1.Cells((3 + AnzahlG), 6) + wks2.Cells(Zeile, 30)
                wks1.Cells((3 + AnzahlG), 7) = wks1.Cells((3 + AnzahlG), 7) + wks2.Cells(Zeile, 31)
                'wks1.Cells((3 + AnzahlG), 8) = wks2.Cells(Zeile, 11)
                
                AnzahlG = AnzahlG + 1
            Else
                Zeile2 = 8
                Do
                    If (wks1.Cells(Stelle, Zeile2) = "") Then
                        'wks1.Cells(Stelle, Zeile2) = wks2.Cells(Zeile, 11)
                        wks1.Cells(Stelle, 2) = wks1.Cells(Stelle, 2) + wks2.Cells(Zeile, 26)
                        wks1.Cells(Stelle, 3) = wks1.Cells(Stelle, 3) + wks2.Cells(Zeile, 27)
                        wks1.Cells(Stelle, 4) = wks1.Cells(Stelle, 4) + wks2.Cells(Zeile, 28)
                        wks1.Cells(Stelle, 5) = wks1.Cells(Stelle, 5) + wks2.Cells(Zeile, 29)
                        wks1.Cells(Stelle, 6) = wks1.Cells(Stelle, 6) + wks2.Cells(Zeile, 30)
                        wks1.Cells(Stelle, 7) = wks1.Cells(Stelle, 7) + wks2.Cells(Zeile, 31)
                        Exit Do
                    Else
                        Zeile2 = Zeile2 + 1
                    End If
                Loop
            End If
        Zeile = Zeile + 1
        Else
            Zeile = Zeile + 1
        End If
    Else
        Exit Do
    End If
Loop

Zeile = 20
Zeile2 = 2
Do
    If (wks3.Cells(Zeile2, 1) <> "") Then
        Zeile = 20
        Do
            If (wks2.Cells(Zeile, 7) = wks3.Cells(Zeile2, 1) And wks2.Cells(Zeile, 8) <> "OS") Then
                vorhanden = 0
                For i = 0 To AnzahlG
                    If wks1.Cells((3 + i), 1) = wks3.Cells(Zeile2, 1) Then
                        vorhanden = 1
                        Stelle = 3 + i
                    End If
                Next i
                If (vorhanden = 0) Then
                    wks3.Cells(Zeile2, 1).Copy
                    wks1.Cells((3 + AnzahlG), 1).PasteSpecial Paste:=xlValues
                    wks1.Cells((3 + AnzahlG), 2) = wks1.Cells((3 + AnzahlG), 2) + wks2.Cells(Zeile, 26)
                    wks1.Cells((3 + AnzahlG), 3) = wks1.Cells((3 + AnzahlG), 3) + wks2.Cells(Zeile, 27)
                    wks1.Cells((3 + AnzahlG), 4) = wks1.Cells((3 + AnzahlG), 4) + wks2.Cells(Zeile, 28)
                    wks1.Cells((3 + AnzahlG), 5) = wks1.Cells((3 + AnzahlG), 5) + wks2.Cells(Zeile, 29)
                    wks1.Cells((3 + AnzahlG), 6) = wks1.Cells((3 + AnzahlG), 6) + wks2.Cells(Zeile, 30)
                    wks1.Cells((3 + AnzahlG), 7) = wks1.Cells((3 + AnzahlG), 7) + wks2.Cells(Zeile, 31)
                    'wks1.Cells((3 + AnzahlG), 8) = wks2.Cells(Zeile, 11)
                    
                    AnzahlG = AnzahlG + 1
                Else
                    Zeile3 = 8
                    Do
                        If (wks1.Cells(Stelle, Zeile3) = "") Then
                            'wks1.Cells(Stelle, Zeile3) = wks2.Cells(Zeile, 11)
                            wks1.Cells(Stelle, 2) = wks1.Cells(Stelle, 2) + wks2.Cells(Zeile, 26)
                            wks1.Cells(Stelle, 3) = wks1.Cells(Stelle, 3) + wks2.Cells(Zeile, 27)
                            wks1.Cells(Stelle, 4) = wks1.Cells(Stelle, 4) + wks2.Cells(Zeile, 28)
                            wks1.Cells(Stelle, 5) = wks1.Cells(Stelle, 5) + wks2.Cells(Zeile, 29)
                            wks1.Cells(Stelle, 6) = wks1.Cells(Stelle, 6) + wks2.Cells(Zeile, 30)
                            wks1.Cells(Stelle, 7) = wks1.Cells(Stelle, 7) + wks2.Cells(Zeile, 31)
                            Exit Do
                        Else
                            Zeile3 = Zeile3 + 1
                        End If
                    Loop
                End If
            End If
            Zeile = Zeile + 1
            If (wks2.Cells(Zeile, 11) = "") Then
                Exit Do
            End If
        Loop
        Zeile2 = Zeile2 + 1
        If (wks3.Cells(Zeile2, 1) = "") Then
            Exit Do
        End If
    Else
        Exit Do
    End If
Loop

wks1.Cells(1, 1) = "K-Paket-Nummer"
wks1.Cells(1, 2) = "Plan - INV1"
wks1.Cells(1, 3) = "Ist - INV1"
wks1.Cells(1, 4) = "Obligo - INV1"
wks1.Cells(1, 5) = "Verfügt - INV1"
wks1.Cells(1, 6) = "AuftrRestPlan - INV1"
wks1.Cells(1, 7) = "Verfügt* - INV1"
wks1.Cells(2, 1) = "Gesamtsumme"
Worksheets("Analyse1").Cells.Rows.AutoFit
Worksheets("Analyse1").Cells.Columns.AutoFit
wks1.Cells(2, 2) = WorksheetFunction.Sum(Range(wks1.Cells(3, 2), wks1.Cells(3 + AnzahlG, 2)))
wks1.Cells(2, 3) = WorksheetFunction.Sum(Range(wks1.Cells(3, 3), wks1.Cells(3 + AnzahlG, 3)))
wks1.Cells(2, 4) = WorksheetFunction.Sum(Range(wks1.Cells(3, 4), wks1.Cells(3 + AnzahlG, 4)))
wks1.Cells(2, 5) = WorksheetFunction.Sum(Range(wks1.Cells(3, 5), wks1.Cells(3 + AnzahlG, 5)))
wks1.Cells(2, 6) = WorksheetFunction.Sum(Range(wks1.Cells(3, 6), wks1.Cells(3 + AnzahlG, 6)))
wks1.Cells(2, 7) = WorksheetFunction.Sum(Range(wks1.Cells(3, 7), wks1.Cells(3 + AnzahlG, 7)))
wks1.Range(wks1.Cells(3, 1), wks1.Cells(2 + AnzahlG, 7)).Sort Key1:=wks1.Range("A3"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
wks1.Range("A1:G1").AutoFilter
wks1.Range(wks1.Cells(1, 1), wks1.Cells(2 + AnzahlG, 7)).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
End Sub

Sorry, dass ich erst jetzt antworte... hatte am Wochenende noch andere Sachen zu tun...

Ich habe keinen einzigen Cellen, Range oder what ever Bezug, wo ich keine Tabellenblatt-Zuweisung habe...

Das ist jetzt nur eins meiner beiden Programme, aber das andere ist fast identisch...

Liebe Grüße,

Suma

P.S: Mein Code ist vllt nicht schön, aber er funktioniert...
Ergänzung ()

So langsam geht mir Excel aufn Sack...

Ich lasse ja beide Programme nacheinander in einem dritten Makro ausführen...

Nun lässt es sich doch ohne Sprünge ausführen, nur jetzt hat er ein Problem mit folgender Zeile :

wks1.Range(wks1.Cells(1, 1), wks1.Cells(2 + AnzahlG, 7)).Select

Diese hatte ich ja bereits oben schon einmal gepostet...

Exakt dieselbe Zeile habe ich in meinem ersten Programm und da hat sie jetzt wunderbar funktioniert...

Diese Zeile findet ihr in Code-Zeile 151... Der gepostete Code ist der, der nicht funktioniert...
 
Hatte nur kurz Zeit darüber zu gucken aber ist es nicht theoretisch möglich das "AnzahlG" in Zeile 147 Null ist? Also wenn 46 oder 98 nicht ausgeführt werden?

Ich schau später nochmal drüber ob ich was finde.
 
Nein, das ist es nicht...

Benutze AnzahlG ja vorher schon mehrmals

und Excel kann mir ja anzeigen, welchen Wert eine Variable hat... AnzahlG hat genau den richtigen Wert...

Die Zeile 147 funktioniert ja einwandfrei, das sehe ich ja in dem Excel-Sheet, weil es sortiert wird...

Danke dir schon mal für deine Hilfe :D
Ergänzung ()

Das Ding ist ja: Wenn ich diesen Code alleine, ohne das zweite Programm ausführe, funkioniert alles einwandfrei...

Es klappt nur nicht wenn ich beide gleichzeitig ausführen möchte...

Edit: Ich kann mein Problem nun noch etwas spezifizieren:

Einzeln kann ich die Programme in jedem Tabellenblatt ausführen...

Wenn ich in Tabllenblatt 1 bin, kann ich (wenn ich beide gleichzeitig ausführe) das Programm für Tabellenblatt 1 komplett ausführen, das zweite nur bis zur Fehlercodezeile

Wenn ich Tabellenblatt 2 bin, komm ich bei Programm 1(weil es als erstes ausgeführt wird) nur bis zu dieser Fehlercodezeile, Programm 2 wird dann gar nicht ausgeführt...

Das Tabellenblatt-Gespringe kommt daher, dass ich in einem anderen Tabellenblatt bin, als das Programm...

ein einfaches Sheet.Activate behebt zwar das Springen, aber nicht mein Problem...
 
Zuletzt bearbeitet:
Ok das Problem ist das .Select auch nur funktioniert wenn das Sheet Active ist. Also bevor du .Select auf ein bestimmtes Sheet ausführst solltest du ein entsprechendes Activate davor setzen.
 
Habe meinen letzten post schon editiert, das aktivieren bringt keine verbesserung... wie gesagt, wenn ich das einzeln ausführe funktioniert es ja, egal in welchem Tabellenblatt ich bin...
Ergänzung ()

Hey,

ich hab mein Problem jetzt gelöst bekommen indem ich einfach die Selection weggelassen habe und alles manuell ausgewählt habe...

Selection und With ist einfach nur fürn ar***... :D

Danke dir/euch trotzdem für die Hilfe :D
 
Ich weiß nicht was du gemacht hast aber ein wks1.Activate in Zeile 150 behebt den Fehler in 151 soviel ist sicher das habe ich getestet ;) aber gut das du es jetzt am laufen hast.
 
Achso... Ich habe lediglich das Tabellenblatt aktiviert... vllt muss man genau die jeweiligen Zellen aktivieren...

Naja gut...

Ich hab die Selection einfach direkt durch den Range ersetzt...

Statt "With Selection" habe ich nun "With wks1.Range()"

Hätte ich von Anfang an machen sollen, aber da habe ich i-wie einen kleinen Denkfehler gehabt...

Liebe Grüße,

Suma
 
Zurück
Oben