Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1924to1928
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

Fehler bei Makroaufruf aus VBA

Fehler bei Makroaufruf aus VBA
30.03.2023 15:05:51
Michael Günnewig

Mittels des Makrorecorders habe ich zwei Makros erstellt, die mir auf einem Blatt bestimmte Spalten ausblenden oder alle Spalten (wieder) einblenden. Wenn ich mich auf dem Blatt befinde und die Makros per Menü starte, funktioniert alles wie vorgesehen. Wenn ich die beiden Makros jedoch aus meinem VBA-Programm her aufrufe, dann bekomme ich zunächst im VBA-Editor die Fehlermeldung "Die Methode 'Range' für das Objekt 'Global_' ist fehlgeschlagen". Klicke ich nun auf "Debuggen", dann sehe ich, dass der Abbruch an der Stelle erfolgte, wo die ein-/auszublenden Spalten definiert werden. Und nun das (für mich) Seltsame: Setze ich jetzt die Ausführung des Programms mit "F5" fort, ohne irgendwas am Code geändert zu haben, dann wird die Verarbeitung anstandslos fortgesetzt.

Den Code der beiden Makros und der aufrufenden Routine habe ich angehängt. Meine erste Vermutung war, dass der Wechsel auf das Blatt, welches durch die globale Variable "MC_cost_sheet" definiert ist, irgendwie Probleme macht. Allerdings nutze ich die Variable in meinem gesamten VBA-Programm und habe mich nochmals vergewissert, dass Sie bei Aufruf der Makros mit dem richtigen Inhalt zur Verfügung steht. Außerdem ist zum Zeitpunkt des Abbruchs das durch die Variable definierte Blatt bereits das Aktive, denn wenn ich vom Editor mit ALT-TAB zum vorherigen Fenster wechsle, dann zeigt dies das durch die Variable definierte Blatt und nicht mehr das Blatt "Working..." von dem ich das VBA-Prozedur "SpaltenEinAusblenden" aufgerufen wurde.
Ich weiß es kann nur eine Kleinigkeit sein, aber ich komme nicht auf die Lösung.


Sub SpaltenEinAusblenden()
Sheets(MC_cost_Sheet).Select
Range("A1").Select

If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
  Call Makro_ausblenden
Else    'alle Spalten einblenden
  Call Makro_einblenden
End If

Range("A1").Select
Sheets("Working...").Select
End Sub

Sub Makro_ausblenden()
Range( _
    "E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR,BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED,ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF" _
    ).Select
Selection.EntireColumn.Hidden = True
Range("A1").Select
End Sub

Sub Makro_einblenden()
Columns("A:GJ").Select
Selection.EntireColumn.Hidden = False
Range("A1").Select
End Sub


16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler bei Makroaufruf aus VBA
30.03.2023 15:31:24
Yal
Hallo Michael,

für Worksheet nicht "Select" sondern "Activate"

Sub SpaltenEinAusblenden()
Const cAus = "E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR,BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED,ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF"
Const cAn = "A:GJ"
    
    With Sheets(MC_cost_Sheet)
        If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
            .Columns(cAus).Hidden = True 'Ausblenden
        Else
            .Columns(cAn).Hidden = False 'Einblenden
        End If
        .Range("A1").Select
    End With
    Sheets("Working...").Activate
End Sub
VG
Yal


Anzeige
AW: Fehler bei Makroaufruf aus VBA
30.03.2023 15:55:40
GerdL
Sub SpaltenEinAusblenden()

'MC_cost_Sheet = "Tabelle1"
'NichtAllePBL = "x"

If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
  Call Makro_ausblenden(MC_cost_Sheet)
Else    'alle Spalten einblenden
  Call Makro_einblenden(MC_cost_Sheet)
End If

Range("A1").Select

End Sub

Sub Makro_ausblenden(strBlatt As String)

Worksheets(strBlatt).Range("E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR," _
                           & "BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED," _
                           & "ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF") _
                           .EntireColumn.Hidden = True

End Sub

Sub Makro_einblenden(strBlatt As String)
   Worksheets(strBlatt).Columns("A:GJ").Hidden = False
End Sub
Kein Select.
Gruß Gerd


Anzeige
AW: Fehler bei Makroaufruf aus VBA
30.03.2023 16:39:45
Michael Günnewig
Hallo Gerd,

danke auch Dir für Deine schnelle Hilfe. Leider habe ich auch damit ein kleines Problem. Während das Einblenden der Spalten fehlerlos durchläuft, bekomme ich beim Ausblenden die Fehlermeldung "Laufzeitfehler '1004' Anwendungs- oder Objektdefinierter Fehler" der sich aber ohne weiter Codeänderung übergehen lässt. Die Spalten werden dann auch korrekt ausgeblendet.


AW: Fehler bei Makroaufruf aus VBA
30.03.2023 16:28:05
Michael Günnewig
Zunächst mal vielen Dank für Deine schnelle Hilfe. Ich muss sagen, dass mir der Unterschied zwischen .select und .activate gar nicht richtig bewusst war. Ein Schicksal dass ich scheinbar mit einer Menge Exceluser und VBA-Anfänger teile - wenn ich Google richtig interpretiere. Ich werde mich damit noch mal eingehender beschäftigen und evtl. einiges von meinem Code nochmal überarbeiten müssen.
Ich habe es mir für jetzt aber erst mal einfach gemacht und den Code meiner "SpaltenEinAusblenden" Routine 1:1 mit Deinem Code ersetzt, welcher auch noch bewundernswert klar strukturiert und einfach zu lesen ist.
Allerdings bekomme ich dann an der Stelle ".Columns(cAus).Hidden" einen Laufzeitfehler 13 "Typen unverträglich", bzw. an der Stelle ".Range("A1").Select" den Fehler "Die Select Methode des Range-Objektes konnte nicht ausgeführt werden". Der zweite Fehler ändert sich auch nicht, wenn ich statt .select .activate nehme. Und er lässt sich auch nicht mehr mit F5 "übergehen".
Ich habe dann nach der Konstantendefinition die Zeile Sheets(MC_cost_Sheet).Activate eingefügt, weil ich gesehen habe, dass bei Ausführung der Routine nicht das durch "MC_cost_Sheet" definieret Blatt aktiv war. Ich nehme zwar an, dass es das bei Verwendung von "With Sheets(MC_cost_Sheet)" auch nicht muss, aber "Versuch macht kluch".
Nach der Änderung ist jetzt zumindest der Fehler "Die Select Methode des Range-Objektes konnte nicht ausgeführt werden" verschwunden. Ein Teilerfolg, allerdings bleibt der andere Fehler weiter bestehen.

Nochmal zur Verdeutlichung. das ist der Code wie ich ihn jetzt implementiert habe und der nur noch an der Stelle ".Columns(cAus).Hidden" einen Laufzeitfehler 13 "Typen unverträglich" bringt:


Sub SpaltenEinAusblenden()
Const cAus = "E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR,BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED,ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF"
Const cAn = "A:GJ"
    
Sheets(MC_cost_Sheet).Activate

    With Sheets(MC_cost_Sheet)
        If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
            .Columns(cAus).Hidden = True 'Ausblenden
        Else
            .Columns(cAn).Hidden = False 'Einblenden
        End If
        .Range("A1").Select
    End With
    
    Stop
    
    Sheets("Working...").Activate
    
End Sub


Anzeige
AW: Fehler bei Makroaufruf aus VBA
30.03.2023 16:47:18
Yal
Hallo Michael,

Du musst nicht das Blatt aktivieren, um darauf Aktionen vorzunehmen. Dann kannst Du ".Activate" innerhalb des With (=Präfix) aufnehmen.
Columns funktioniert wohl nur mit Zahlen, also Range verwenden:

Sub SpaltenEinAusblenden()
Const cAus = "E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR,BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED,ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF"
Const cAn = "A:GJ"
    
    With Sheets(MC_cost_Sheet)
        .Activate
        If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
            .Range(cAus).Hidden = True 'Ausblenden
        Else
            .Range(cAn).Hidden = False 'Einblenden
        End If
        .Range("A1").Select
    End With
    Sheets("Working...").Activate
End Sub
VG
Yal


Anzeige
AW: Fehler bei Makroaufruf aus VBA
30.03.2023 17:11:18
Michael Günnewig
Hallo Yal,

schön dass Du noch nicht die Geduld verloren hast. Aber auch wenn ich den neuen Code der Routine mit Range nehme erhalte ich leider zwei Fehlermeldungen.
Beim Einblenden steigt er mit der Meldung "Die Hidden-Eigenschaft des Range-Objektes kann nicht festgelegt werden" aus, beim Ausblenden kommt die Meldung "Anwendungs- oder objektdefinierter Fehler". Beide Fehlermeldungen können nicht übergangen werden.


AW: Fehler bei Makroaufruf aus VBA
30.03.2023 17:21:27
Yal
Na gut, dann doch Spalten einzeln behandeln:

Sub SpaltenEinAusblenden()
Dim ws As Worksheets
Const cAus = "E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR,BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED,ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF"
Const cAn = "A:GJ"
    
    Set ws = Worksheets(MC_cost_Sheet)
    ws.Activate
    ws.Range("A1").Select
    If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
        EinAusblenden ws, True, cAus  'Ausblenden
    Else
        EinAusblenden ws, False, cAn  'Einblenden
    End If
    Sheets("Working...").Activate
End Sub

Private Sub EinAusblenden(ws As Worksheet, bAusblenden As Boolean, Spaltenliste As String)
Dim S
    Application.ScreenUpdating = False
    For Each S In Split(Spaltenliste, ",")
        ws.Range(S).EntireColumn.Hidden = bAusblenden
    Next
    Application.ScreenUpdating = True
End Sub
VG
Yal


Anzeige
Wobei...
30.03.2023 17:25:07
Yal
... EntireColumn scheint auch auf multiple Spalten zu wirken:

Sub SpaltenEinAusblenden()
Const cAus = "E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR,BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED,ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF"
Const cAn = "A:GJ"
     
    With Sheets(MC_cost_Sheet)
        .Activate
        .Range("A1").Select
        If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
            .Range(cAus).EntireColumn.Hidden = True 'Ausblenden
        Else
            .Range(cAn).EntireColumn.Hidden = False 'Einblenden
        End If
    End With
    Sheets("Working...").Activate
End Sub


Anzeige
AW: Wobei...
30.03.2023 17:48:33
Michael Günnewig
Hmmm,

das Einblenden funktioniert so, aber beim Ausblenden kommt (natürlich) die gleiche Fehlermeldung wie beim identischen Vorschlag von GerdL:
.Range(cAus).EntireColumn.Hidden = True => Fehler: Anwendungs- oder objektdefinierter Fehler
Das verwunderliche ist halt, dass der Code nach F5 dann doch ausgeführt wird, obwohl am Code nichts korrigiert wurde. Ich habe den Code Deines letzten Vorschlags 1:1 übernommen.


AW: Wobei...
30.03.2023 18:08:31
Yal
Hast Du irgendwo verbundene Zellen? Das stört immer beim Ausblenden.

Aber nicht nur da. Verbundene Zellen ist eine Krankheit. Entweder will man seine Daten effektiv verwwalten: keine verbundene Zellen, oder will man "schön machen", dann verzichtet man auf Makros.

VG
Yal


Anzeige
AW: Wobei...
30.03.2023 18:30:09
Michael Günnewig
Nein, (leider) keine verbundene Zellen ... nur ein paar Kopfzeilen fixiert, aber die habe ich probeweise mal frei gegeben - und das hat nichts geändert.


AW: Wobei...
30.03.2023 18:40:07
Yal
Keine Ahnung. Irgendwas ist bei Dir nicht standard.
Versuche die Version mit Einzelspalte ausblenden.
Füge eine "Petzte" vor dem Ausblenden (Ausgabe in Direktfenster)

Sub SpaltenEinAusblenden()
Dim ws As Worksheets
Const cAus = "E:F,K:L,U:V,AA:AB,AK:AL,AQ:AR,BA:BB,BG:BH,BQ:BR,BW:BX,CG:CH,CM:CN,CW:CX,DC:DD,DM:DN,DS:DT,EC:ED,ES:ET,EI:EJ,EY:EZ,FI:FJ,FO:FP,FY:FZ,GE:GF"
Const cAn = "A:GJ"
    
    Set ws = Worksheets(MC_cost_Sheet)
    ws.Activate
    ws.Range("A1").Select
    If NichtAllePBL = "x" Then  'nicht kalkulierte Spalten ausblenden
        EinAusblenden ws, True, cAus  'Ausblenden
    Else
        EinAusblenden ws, False, cAn  'Einblenden
    End If
    Sheets("Working...").Activate
End Sub

Private Sub EinAusblenden(ws As Worksheet, bAusblenden As Boolean, Spaltenliste As String)
Dim S
    Application.ScreenUpdating = False
    For Each S In Split(Spaltenliste, ",")
        Debug.Print S
        ws.Range(S).EntireColumn.Hidden = bAusblenden
    Next
    Application.ScreenUpdating = True
End Sub
VG
Yal


Anzeige
AW: Wobei...
30.03.2023 19:04:40
Michael Günnewig
Da bleibt er schon bei:
Set ws = Worksheets(MC_cost_Sheet)
hängen. Fehlermeldung: "Laufzeitfehler 13 Typen unverträglich"
Wenn ich an der Stelle im Debugfenster den Variableninhalt ausgeben lasse:
?MC_cost_Sheet
Marginal Cost PB
Und das ist genau die Bezeichnung des Blattes auf dem die Spalten ausgeblendet werden sollen und das ich auch sonst in meinem VBA Code an vielen Stellen fehlerfrei verwende.
Beim vorherigen Code habe ich mal probeweise die Konstante gekürzt und zunächst nur einen zusammenhängenden Bereich eingegeben:
Const cAus = "E:L"
Das wird fehlerfrei ausgeführt, sobald ich aber zwei durch Komma getrennte Bereiche in der Konstante angebe, bleibt die Ausführung zunächst hängen.
Das hört sich alles nicht sehr schlüssig an, oder?
Ich werde mal versuchen die 24 Bereiche in einem Array zu übergeben, um diese dann in einer Schleife einzeln auszublenden.


Anzeige
AW: Wobei...
30.03.2023 19:24:24
Yal
Sorry, Fehler
Dim ws As Worksheet
und nicht
Dim ws As Worksheets

Worksheet ist ein Worsheet, Worksheets ist die Sammlung ("Collection") der Worksheets in einem Workbook (wofür es auch Workbooks gibt).

VG
Yal


AW: Wobei...
30.03.2023 19:47:23
Michael Günnewig
BINGO!!!!
Das war's ... jetzt läufts! ;-)
Gerade wo ich auch mein "Workaround" mit der Schleife übers Array fertig hatte. Aber Deine Lösung ist natürlich viel eleganter und schneller und wird daher übernommen
Hab' vielen Dank für Deine Geduld und Hilfe!


AW: Fehler bei Makroaufruf aus VBA
30.03.2023 16:46:49
Michael Günnewig
Sorry, bei meinen ersten beiden Antworten oben an an GerdL und Yal ist die Zuordnung irgendwie durcheinander geraten und ich kann das scheinbar nicht mehr korrigieren.

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige