Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Kopiertes Makro läuft nicht in anderer Tabelle

Kopiertes Makro läuft nicht in anderer Tabelle
09.01.2013 15:49:01
Reiner
Hallo zusammen,
ich habe ein lauffähiges VBA Makro in einer betehenden Tabelle und habe (wie so oft) den Code 1:1 in eine andere Tabelle kopiert.
Egal ob ich es in den Bereich "VBAProject-Diese Arbeitsmappe" oder "VBAProject-Tabelle2 (Export)" kopiere kann ich das Makro nicht ausführen.
Teilweise bekam ich den Fehler 400 bzw. 1004 aber auch wenn ich den Blattschutz ausschalte und sogar die Zellenformatierung entferne funktioniert dieses Makro nicht.
Alle anderen Makros laufen problemlos.
Ich hoffe, daß von euch jemand eine Idee hat wo es klemmt denn ich lese jetzt schon lange (Stunden) alle möglichen Infos und komme nicht weiter.
Ich habe von A1:AE4 Kopfzeilen mit Beschriftungen und ab A5:AEn werden Werte eingetragen.
Das Makro soll leere Spalten inkl. den Kopfzeilen ausblenden und das andere Makro wieder einblenden.
Da das Makro in der alten Ursprungsdatei sollte es ja nicht daran liegen aber ich hänge es _
trotzdem mal an.

Sub Leere_Spalten_ausblenden()
Dim lngLast As Long, rng As Range
Application.ScreenUpdating = False
lngLast = Cells(1, 1).CurrentRegion.Rows.Count
If lngLast > 4 Then
For Each rng In Range("A1:AE1") ' Endzelle eintragen
'    For Each rng In Range(Cells(1, 1), Cells(1, 1).End(xlToRight)) ' Sucht die erste leere  _
Zelle
rng.EntireColumn.Hidden = _
Application.CountA(rng.Offset(4).Resize(lngLast - 4)) = 0
Next
End If
End Sub

Sub Alle_Spalten_einblenden()
Cells.EntireColumn.Hidden = False
End Sub

Vielen Dank, daß ihr euch ein paar Gedanken macht.
Reiner

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kopiertes Makro läuft nicht in anderer Tabelle
09.01.2013 15:51:58
Hajo_Zi
Das Makro gehört in ein Modul.

AW: Kopiertes Makro läuft nicht in anderer Tabelle
09.01.2013 15:57:17
Reiner
Leider funktioniert das als Modul auch nicht.
Komisch ist auch, daß egal welches Makro ich aufrufe immer nur die Spalten eingeblendet werden.

Anzeige
AW: Kopiertes Makro läuft nicht in anderer Tabelle
09.01.2013 16:02:06
Hajo_Zi
beide Makros laufen Fehlerfrei durch. Das Sie nicht machen was Du willst, hängt vielleicht damit zusammen das Du nicht das richtige Makro hast?
Gruß Hajo

AW: Kopiertes Makro läuft nicht in anderer Tabelle
09.01.2013 16:42:09
Reiner
Das Makro ist schon richtig da es in der anderen Tabelle auch funktioniert.
Ich habe jatzt mal alle anderen Makros rausgelöscht - gleicher Fehler.
Ich habe dann das erste Tabellenblatt gelöscht und dann funktioniert es.
Im VBA Editor unter "DieseArbeitsmappe" habbe ich zwei Makros die Tabellenblätter schützen.

Private Sub Workbook_Open()
'   alle Fenster schützen und ein-/ausblenden (zur Sicherheit)
Worksheets("Ordersheet").Activate
ActiveSheet.Protect "MeinPW"
ActiveSheet.Visible = True
Worksheets("Export").Activate
ActiveSheet.Protect "MeinPW"
ActiveSheet.Visible = True
Worksheets("Start").Activate
ActiveSheet.Protect "MeinPW"
ActiveSheet.Visible = False
Worksheets("Ordersheet").Activate
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Cancel = False
'   alle Fenster schützen und ein-/ausblenden (zur Sicherheit)
Worksheets("Ordersheet").Activate
ActiveSheet.Protect "MeinPW"
ActiveSheet.Visible = True
Worksheets("Export").Activate
ActiveSheet.Protect "MeinPW"
ActiveSheet.Visible = True
Worksheets("Start").Activate
ActiveSheet.Protect "MeinPW"
ActiveSheet.Visible = True
Worksheets("Start").Activate
End Sub
In der Tabelle1 steht ein Makro das bei einer Zelländerung ein anderes Makro aufruft:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("F24:F24")) Is Nothing Then
Call PingHost_Hostname
End If
If Not Intersect(Target, Range("F39:F39")) Is Nothing Then
Call PingHost_Incoming
End If
End Sub
Sub PingHost_Hostname()
' Abfragen ob der Druckerhostname erreichbar ist
ActiveSheet.Unprotect "MeinPW"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")
With Tabelle1 'Tabelle anpassen
Z = 24  'Zeilennummer des Hostnamen
S = 6   'Spaltennummer des Hostnamen
W = 24  'Ausgabezeile für IP
A = 13  'Ausgabespalte für IP
.Cells(W, A).Interior.ColorIndex = 0 'Ausgabezelle IP leeren und ohne Farbe
.Cells(W, A).Value = "" 'Ausgabezelle IP leeren und ohne Farbe
.Cells(W + 1, A).Interior.ColorIndex = 0 'Ausgabezelle ms leeren und ohne Farbe
.Cells(W + 1, A).Value = ""   'Ausgabezelle ms leeren und ohne Farbe
If .Cells(Z, S).Text  "" Then   'Wenn Hostname nicht leer
Set colPings = objWMIService.ExecQuery _
("Select * From Win32_PingStatus where Address = '" & .Cells(Z, S).Text & "'")
For Each objPing In colPings
If objPing.StatusCode = 0 Then
.Cells(W, A).Value = objPing.ProtocolAddress 'IP-Adresse
.Cells(W + 1, A).Value = objPing.ResponseTime & " ms" 'Antwortzeit in ms
.Cells(W, A).Interior.ColorIndex = 4  'erreichbar = grün
Else
.Cells(W, A).Value = "not reachable"
.Cells(W, A).Interior.ColorIndex = 3  'nicht erreichbar = rot
End If
Next
End If
End With
ActiveSheet.Protect "MeinPW"
End Sub
'
Ich ging immer davon aus, daß ein (nicht aufgerufenes) Makro anderes Tabellenblatt keine Auswirkungen habt.
Wenn es Sinn macht könnte ich auch ein neutralisiertes File erstellen und hochladen aber ich möchte euch auch nicht mit dem Thema zu sehr belasten.
Ich bin auf dem besten Weg in die Psychiatrie denn so ein widerspenstiges Excel hatte ich noch nie.
Viele Grüße
Reiner

Anzeige
AW: Kopiertes Makro läuft nicht in anderer Tabelle
09.01.2013 19:29:03
Luschi
Hallo Reiner,
dieses Durcheinander entsteht, wenn man 'ActiveSheet' benutzt statt Objektbezüge auf eine bestimmte Tabelle. In diesem geposteten Vba-Code geht z.B. nicht hervor, wofür der interne Vba-Tabellenname 'Tabelle1' steht. Ist das "Ordersheet", "Export", "Start" oder noch eine ganz andere Tabelle.
Übergib den Proceduren 'PingHost_Hostname' & 'PingHost_Incoming' die Tabelle die Du meinst und laß nicht Excel bestimmen, welche Tabelle gerade die aktive (sichtbare) Tabelle ist.
Außerdem reagieren auch Tabellen, wenn man per vba-Code Zellinhalte ändert, also sollte man mit 'Application.EnableEvents = False' dafür sorgen, daß Vba die Tabellen/Workbook-Ereignisroutinen in den Schlafzustand versetzt, während Deine Module am Wirken sind und Werte in Tabellenzellen schreiben.
Gruß von Luschi
aus klein-paris

Anzeige
AW: Kopiertes Makro läuft nicht in anderer Tabelle
10.01.2013 11:47:39
Reiner
Hallo zusammen,
vielen Dank für die Tipps aber leider auch die direkte Addressierung hat nichts gebracht.
Über schrittweises löschen von Elementen "try and error" habe ich festgestellt, daß es nicht am Makro sondern am Zellinhalt liegt.
Die Zellen werden durch Formeln aus einem anderem Tabellenblatt gefüllt.
Damit das Makro leere Zellen erkennen kann habe ich den Bereich kopiert und mit "Inhalte einfügen" "Werte" "Leerzellen überspringen" wieder eingefügt.
So wie es aussieht sind die leeren Zellen für das Makro nicht leer und deshalb funktioniert es nicht.
Wenn ich die (optisch) leeren Zellen mit "Entfernen" lösche dann funktioniert alles.
Gibt es eine Möglichkeit das Makro so zu ändern, daß es auch nur optisch leere Zellen ausblendet?
Dann könnte ich mir das Kopieren - Werte einfügen ersparen.
Sub Leere_Spalten_ausblenden()
Dim lngLast As Long, rng As Range
Application.ScreenUpdating = False
lngLast = Cells(1, 1).CurrentRegion.Rows.Count
If lngLast > 4 Then
For Each rng In Range("A1:AE1") ' Endzelle eintragen
'    For Each rng In Range(Cells(1, 1), Cells(1, 1).End(xlToRight)) ' Sucht die erste leere  _
Zelle
rng.EntireColumn.Hidden = _
Application.CountA(rng.Offset(4).Resize(lngLast - 4)) = 0
Next
End If
End Sub
Sub Alle_Spalten_einblenden()
Cells.EntireColumn.Hidden = False
End Sub
Alternativ wäre ein Tipp wie ich beim Werte einfügen etwas anders machen kann auch OK.
Vielen Grüße aus Hessen
Reiner

Anzeige
Geschlossen - separates Thema eröffnet
10.01.2013 13:04:01
Reiner
Da die neue Fragestellung ja erheblich vom ursprünglichen Thema abweicht habe ich mich entschlossen einen neuen Faden/Thread zu eröffnen.
Ich danke allen für ihre Hilfe.

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Makro-Probleme in Excel: Fehlerbehebung und Lösungen


Schritt-für-Schritt-Anleitung

  1. Überprüfe, ob das Makro richtig platziert ist:

    • Stelle sicher, dass das Makro in einem Modul und nicht direkt in einem Arbeitsblatt platziert ist. Gehe dazu zum VBA-Editor (ALT + F11), klicke mit der rechten Maustaste auf „Module“ und wähle „Einfügen“ > „Modul“.
  2. Makro anpassen:

    • Vergewissere Dich, dass alle Bezüge im Makro korrekt sind. Statt ActiveSheet solltest Du spezifische Tabellenbezüge verwenden, um Verwirrung zu vermeiden.
  3. Blattschutz prüfen:

    • Wenn das Arbeitsblatt geschützt ist, musst Du den Schutz im Makro temporär aufheben. Achte darauf, das Arbeitsblatt nach der Bearbeitung wieder zu schützen.
  4. Zellinhalte überprüfen:

    • Stelle sicher, dass die Zellen, die Dein Makro bearbeitet, tatsächlich leer sind. Wenn sie Formeln enthalten, die leere Werte zurückgeben, erkennt das Makro diese möglicherweise nicht als leer.
  5. Makro testen:

    • Führe das Makro durch Drücken von F5 im VBA-Editor aus, um zu sehen, ob es jetzt funktioniert.

Häufige Fehler und Lösungen

  • Fehler 400 oder 1004:

    • Diese Fehler können auftreten, wenn das Makro auf eine nicht vorhandene Zeile oder Spalte zugreift. Überprüfe die Bereiche, die im Makro verwendet werden.
  • Makro funktioniert nicht auf anderem Blatt:

    • Wenn Du ein Makro in eine neue Tabelle kopierst, kann es an den spezifischen Blattnamen liegen. Stelle sicher, dass die Bezüge korrekt sind.
  • Leere Zellen werden nicht erkannt:

    • Wenn Du Formeln hast, die leere Zellen anzeigen, aber dennoch Werte enthalten, erwäge die Verwendung von Application.CountA, um die Zellen korrekt auszuwerten.

Alternative Methoden

  • Verwende Application.EnableEvents = False:

    • Dies verhindert, dass andere Ereignisse während der Ausführung Deines Makros aktiviert werden. Dies kann hilfreich sein, wenn Du Werte in Zellen schreibst und nicht möchtest, dass andere Makros oder Ereignisse ausgelöst werden.
  • Anpassung des Makros:

    • Um nur optisch leere Zellen auszublenden, kannst Du das Makro wie folgt anpassen:
Sub Leere_Spalten_ausblenden()
    Dim lngLast As Long, rng As Range
    Application.ScreenUpdating = False
    lngLast = Cells(1, 1).CurrentRegion.Rows.Count
    If lngLast > 4 Then
        For Each rng In Range("A1:AE1")
            rng.EntireColumn.Hidden = (Trim(rng.Offset(4).Value) = "")
        Next
    End If
    Application.ScreenUpdating = True
End Sub

Praktische Beispiele

  1. Ausblenden von leeren Spalten:

    • Verwende das oben angepasste Makro, um Spalten auszublenden, die optisch leer erscheinen, aber möglicherweise Formeln enthalten.
  2. Einblenden aller Spalten:

    • Das folgende Makro stellt sicher, dass alle Spalten wieder sichtbar sind:
Sub Alle_Spalten_einblenden()
    Cells.EntireColumn.Hidden = False
End Sub

Tipps für Profis

  • Vermeide ActiveSheet:

    • Verwende immer spezifische Bezüge, um Fehler zu vermeiden, und mache Deinen Code robuster.
  • Debugging:

    • Nutze Debug.Print in Deinem Code, um Werte auszugeben und den Ablauf Deines Makros zu verfolgen.
  • Dokumentation:

    • Dokumentiere jeden Schritt Deines Codes mit Kommentaren, um die Wartung und das Verständnis zu erleichtern.

FAQ: Häufige Fragen

1. Warum funktioniert mein Makro nicht, wenn ich es in eine andere Tabelle kopiere? Es kann sein, dass die Bezüge auf spezifische Zellen oder Blätter nicht mehr korrekt sind. Überprüfe alle Referenzen und stelle sicher, dass sie auf das richtige Blatt zeigen.

2. Wie kann ich sicherstellen, dass leere Zellen auch wirklich leer sind? Wenn Zellen Formeln haben, die leere Werte zurückgeben, erkenne diese nicht als leer. Du kannst die Zellen mit „Werte einfügen“ und „Leerzellen überspringen“ kopieren, um sie tatsächlich leer zu machen oder die Anpassungen im Makro vornehmen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige