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

Forumthread: Makro per Makro kopieren

Makro per Makro kopieren
29.07.2005 09:54:03
Andreas
Hallo, irgendwie habe ich nichts drüber finden können, drum hier nun meine Frage:
Ich habe eine Arbeitsmappe(Original) mit entsprechenden Makros. Diese Arbeitsmappe wird dann vom Benutzer unter anderem Namen abgespeichert (Kopie).
Nun sind ne Menge Kopien im Umlauf. Da aber meine Makros im Original ständig verbessert werden würde ich gerne die Kopien auf den neuesten Stand bringen.
Gut ich könnte jede Datei öffnen und umständlich das neue Makro reinkopieren, ist aber ein riesiger Aufwand.
Gibt es eine Lösung per Makro?
Freue mich schon auf eure Vorschläge.
Danke
Andreas
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro per Makro kopieren
29.07.2005 10:27:20
Sigi
Hallo Andreas,
Makros zu kopieren ist zu umständlich. Der Kopiermakro müsste ja wissen wie die Kopien
heißen und in welchen Verzeichnissen sie sind. In der Praxis viel zu umständlich!
Alternative:
Trenne die Makros von den Daten! Die Makros kommen in eine eigene Mappe im Netz. So
können es alle User zugreifen und du kannst die Makros jederzeit verbessern. Von den
Datendatein können beliebig viele Kopien existieren. Noch besser: Erstelle für die Makros
ein Add-In das alle User einbinden können.
Gruß
Sigi
Anzeige
AW: Makro per Makro kopieren
29.07.2005 10:37:08
Heiko
Hallo Andreas,
wo sind den die Makros (DieseArbeitsmappe, Tabellenblatt, Userforms, Module, Klassenmodule) und willst du dann nur bestimmte oder alle überschreiben ?
Dieses Beispiel hier kopiert alle Module und Userforms von einer Mappe in eine neue.
Wenn dir der Name der Zielmappe bekannt ist mußt du das ja nur anpassen.
Reicht das als Anregung oder brauchst du mehr Input, dann Frag nach.
Das Zweite Script zeigt wie man VBA Inhalte löscht. Es ist natürlich sehr aufgebohrt, aber zeigt sehr schön wie es geht und was passiert. Muss man ich dan zum anwenden abspecken.

Private Sub CommandButton15_Click()
Dim strPath As String, strNewBookName As String
Dim vbc As Object
strPath = Application.Path & "\"
On Error GoTo Errorhandler
Workbooks.Add
strNewBookName = ActiveWorkbook.Name
ThisWorkbook.Activate
With ActiveWorkbook.VBProject
For Each vbc In .VBComponents
' Wenn Type = 1 dann ist es ein Standardmodul.
' Wenn Type = 3 dann ist es ein Userform
If vbc.Type = 1 Or vbc.Type = 3 Then
vbc.Export strPath & vbc.Name & ".txt"
Workbooks(strNewBookName).VBProject.VBComponents.Import strPath & vbc.Name & ".txt"
Kill strPath & vbc.Name & ".txt"
End If
Next vbc
End With
MsgBox "Module wurde kopiert!"
Exit Sub
' Bei Fehlernummer 1004, diese Meldung ausgeben.
Errorhandler:
If Err.Number = 1004 Then
MsgBox "Das kopieren des VBA Moduls ist fehlgeschlagen!" & vbCr & _
"Bitte überprüfen Sie folgende Einstellung! " & vbCr & _
"EXTRAS -> MAKRO -> SICHERHEIT -> Vertrauenwürdige Quellen." & vbCr & _
"'Zugriff auf Visual Basic Projekt vertrauen' muss aktiviert sein! ", vbCritical, _
" Meldung vom Makro Module exportieren!"
Else
MsgBox "Err.Number = " & Err.Number & ".   " & Err.Description, vbCritical
End If
' Fehlernummer löschen.
Err.Clear
End Sub


Private Sub CommandButton11_Click()
' Mit diesem Sub wird die aktuelle Datei unter einem neuen Namen abgespeichert, und dann
' in der neuen Datei alle VBA Codes sowie alle Moduel und Userforms gelöscht.
' Es wird übrigens auch das Modul gelöscht, in dem sich dieses Makro befindet.
' So DIS 25.01.05
' Getestet auf EXCEL 2000 und EXCEL 2002/SP 2
' Sub VBAloeschen()
Dim vbc As Object
Dim strFile As String
'Abfrage ob die Datei ohne VBA Code gespeichert werden soll.
If MsgBox("Hiermit wird die aktuelle Datei 'ohne Makros' unter einem anderen Namen abgespeichert!", _
vbCritical + vbYesNo, " DIS 2005") = 6 Then
' Auf Laufwerk H wechseln
On Error Resume Next
ChDrive "H"
ChDir "H:\"
' Fehlerbehandlung aus.
On Error GoTo 0
' Den "Speichern unter" Dialog aufrufen.
strFile = Application.GetSaveAsFilename("Neuer Name", "Excel-Dateien (*.xls), *.xls")
' Wurde ein Dateiname zum "Speichern unter" ausgewählt dann weiter.
If strFile <> "" And strFile <> "Falsch" And strFile <> "False" Then
' Die Datei erstmal unter dem neuen Namen abspeichern.
ActiveWorkbook.SaveAs strFile
' bei Fehler zum Errorhandler
On Error GoTo Errorhandler
' Mit dem VBA Objekten in der aktiven Datei.
With ActiveWorkbook.VBProject
' Ein Schleife die ALLE VBComponents durchläuft, sollen nur bestimmte gelöscht werden
' dann muss dieser Code angepaßt werden.
For Each vbc In .VBComponents
Select Case vbc.Type
' Wenn Type = 1 dann ist es ein Standardmodul, dies wird komplett gelöscht!
Case 1
' Diese Abfragen können natürlich nach dem testen und verstehen raus.
If MsgBox("Ich bin ein Standardmodul ! Mein Name ist =   " & vbc.Name & "  ." & vbCr & _
"Möchtest du mich und meinen Code löschen ?", _
vbYesNo + vbInformation, " DIS 2005") = 6 Then
' Löschen des Standardmodules, mann kann auch Module dirket mit Namen
' ansprechen. Zb. Löscht die nächste Zeile Modul 1
' .VBComponents.Remove .VBComponents("Modul1")
.VBComponents.Remove .VBComponents(vbc.Name)
End If
' Wenn Type = 2 dann ist es ein Klassennmodul, dies wird komplett gelöscht!
Case 2
' Diese Abfragen können natürlich nach dem testen und verstehen raus.
If MsgBox("Ich bin ein Klassenmodul ! Mein Name ist =   " & vbc.Name & "  ." & vbCr & _
"Möchtest du mich und meinen Code löschen ?", _
vbYesNo + vbInformation, " DIS 2005") = 6 Then
' Löschen des Klassenmodules
.VBComponents.Remove .VBComponents(vbc.Name)
End If
' Wenn Type = 3 dann ist es ein Userform, dies wird komplett gelöscht!
Case 3
' Diese Abfragen können natürlich nach dem testen und verstehen raus.
If MsgBox("Ich bin ein Userform ! Mein Name ist =   " & vbc.Name & "  ." & vbCr & _
"Möchtest du mich und meinen Code löschen ?", _
vbYesNo + vbInformation, " DIS 2005") = 6 Then
' Löschen des Userforms
.VBComponents.Remove .VBComponents(vbc.Name)
End If
' Wenn Type = 100, also DieseArbeitsmappe oder ein Tabellenblatt, dann darin
' alle Codezeilen löschen. Denn die Datei und die Tabellenblätter sollen ja
' erhalten bleiben, also nur den Code löschen.
Case 100
' Diese Abfragen können natürlich nach dem testen und verstehen raus.
If MsgBox("Ich bin DieseArbeitsmappe oder ein Tabellenblatt ! " & vbCr & _
"Mein Name ist =   " & vbc.Name & "  .  Möchtest du meinen Code löschen ?", _
vbYesNo + vbInformation, " DIS 2005") = 6 Then
With .VBComponents(vbc.Name).CodeModule
.DeleteLines 1, .CountOfLines
End With
End If
Case Else
MsgBox "Unbekannter VBA Type !", vbCritical
End Select
Next vbc
End With
' Wenn alles gelöscht wurde, dann raus hier!
Exit Sub
Else
MsgBox "Datei konnte nicht unter einem anderen Namen gespeichert werden !", vbCritical
Exit Sub
End If
' Bei Fehlernummer 1004, diese Meldung ausgeben.
Errorhandler:
If Err.Number = 1004 Then
MsgBox "Das Löschen des VBA Codes ist fehlgeschlagen!" & vbCr & _
"Bitte überprüfen Sie folgende Einstellung! " & vbCr & _
"EXTRAS -> MAKRO -> SICHERHEIT -> Vertrauenwürdige Quellen." & vbCr & _
"'Zugriff auf Visual Basic Projekt vertrauen' muss aktiviert sein! ", vbCritical, _
" Meldung vom Makro VBAloeschen"
Else
MsgBox "Err.Number = " & Err.Number & ".   " & Err.Description, vbCritical
End If
End If
End Sub

Gruß Heiko

PS: Rückmeldung wäre nett !
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Makros effizient kopieren in Excel


Schritt-für-Schritt-Anleitung

Um ein Excel-Makro zu kopieren, kannst du den folgenden VBA-Code verwenden. Dieser Code kopiert alle Module und UserForms von einer Arbeitsmappe in eine neue:

Private Sub CommandButton15_Click()
    Dim strPath As String, strNewBookName As String
    Dim vbc As Object
    strPath = Application.Path & "\"
    On Error GoTo Errorhandler
    Workbooks.Add
    strNewBookName = ActiveWorkbook.Name
    ThisWorkbook.Activate
    With ActiveWorkbook.VBProject
        For Each vbc In .VBComponents
            If vbc.Type = 1 Or vbc.Type = 3 Then
                vbc.Export strPath & vbc.Name & ".txt"
                Workbooks(strNewBookName).VBProject.VBComponents.Import strPath & vbc.Name & ".txt"
                Kill strPath & vbc.Name & ".txt"
            End If
        Next vbc
    End With
    MsgBox "Module wurde kopiert!"
    Exit Sub
Errorhandler:
    If Err.Number = 1004 Then
        MsgBox "Das kopieren des VBA Moduls ist fehlgeschlagen!" & vbCr & _
        "Bitte überprüfen Sie folgende Einstellung! " & vbCr & _
        "EXTRAS -> MAKRO -> SICHERHEIT -> Vertrauenswürdige Quellen." & vbCr & _
        "'Zugriff auf Visual Basic Projekt vertrauen' muss aktiviert sein! ", vbCritical, _
        " Meldung vom Makro Module exportieren!"
    Else
        MsgBox "Err.Number = " & Err.Number & ".   " & Err.Description, vbCritical
    End If
    Err.Clear
End Sub

Dieser Code funktioniert in Excel 2000 und Excel 2002. Stelle sicher, dass du die richtigen Sicherheitseinstellungen für Makros gesetzt hast.


Häufige Fehler und Lösungen

  • Fehler 1004: Dies tritt häufig auf, wenn die Sicherheitseinstellungen nicht korrekt konfiguriert sind. Stelle sicher, dass du den Zugriff auf das Visual Basic-Projekt in den Makro-Sicherheitseinstellungen aktivierst.

  • Module werden nicht gefunden: Überprüfe, ob die Module in der richtigen Arbeitsmappe vorhanden sind.


Alternative Methoden

Eine effektive Methode, um Excel-Makros zu kopieren, ist die Verwendung eines Add-Ins. Mit einem Add-In kannst du die Makros zentral speichern und alle Benutzer können die neuesten Versionen nutzen, ohne die Makros manuell in jede Datei einfügen zu müssen.

  • Makro exportieren: Du kannst auch die Makros exportieren und dann in eine andere Datei importieren. Dies ist besonders nützlich, wenn du Makros auf einem anderen PC verwenden möchtest.

Praktische Beispiele

Hier ist ein Beispiel, wie du ein Makro in eine andere Datei kopieren kannst:

Sub MakroKopieren()
    Dim SourceWorkbook As Workbook
    Dim TargetWorkbook As Workbook
    Set SourceWorkbook = ThisWorkbook
    Set TargetWorkbook = Workbooks.Open("Pfad\zu\deiner\Zieldatei.xlsm")

    SourceWorkbook.VBProject.VBComponents("MeinModul").Export "C:\Temp\MeinModul.txt"
    TargetWorkbook.VBProject.VBComponents.Import "C:\Temp\MeinModul.txt"
    Kill "C:\Temp\MeinModul.txt" ' Löscht die temporäre Datei
    TargetWorkbook.Save
    TargetWorkbook.Close
End Sub

Ersetze "Pfad\zu\deiner\Zieldatei.xlsm" mit dem tatsächlichen Pfad zur Zieldatei.


Tipps für Profis

  • Makros organisieren: Halte deine Makros gut organisiert in Modulen. So kannst du leichter entscheiden, welche Makros kopiert oder exportiert werden sollen.

  • Sicherheitsrichtlinien: Achte darauf, dass alle Benutzer die richtigen Sicherheitsrichtlinien für Makros befolgen, um Probleme beim Kopieren zu vermeiden.

  • Regelmäßige Updates: Halte deine Makros regelmäßig auf dem neuesten Stand, um sicherzustellen, dass alle Benutzer die besten Versionen verwenden.


FAQ: Häufige Fragen

1. Wie kann ich ein Excel-Makro auf einen anderen PC kopieren?
Du kannst das Makro exportieren und dann auf dem anderen PC importieren. Verwende dazu die VBA-Export- und Importfunktionen.

2. Was passiert, wenn ich ein Makro nicht richtig kopiere?
Das Makro könnte nicht funktionieren oder Fehler auslösen. Stelle sicher, dass alle Abhängigkeiten und Module korrekt übertragen werden.

3. Kann ich mehrere Makros gleichzeitig kopieren?
Ja, du kannst den oben genannten Code anpassen, um mehrere Makros in einem Durchgang zu kopieren. Achte darauf, die korrekten Module zu benennen.

4. Wie kann ich Makros in eine andere Datei kopieren?
Verwende den VBA-Code, um das Makro zu exportieren und dann in die andere Datei zu importieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige