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

Forumthread: VBA Module löschen und neu importieren?

VBA Module löschen und neu importieren?
14.02.2021 18:36:53
Sergej
Hallo Leute,
was stimmt bitte in meinem Code (s. am Ende) nicht?
Ich bekomme diese Fehlermeldung: Fehler beim Kompilieren: Methode oder Datenobjekt nicht gefunden.
Es sollen zwei Module gelöscht werden und aus einer Datei wieder importiert werden.
Ich darf nicht davor ThisWorkbook eintragen, weil der Code nicht in aktiver Datei sondern in zuvor ausgewählten Dateien durch das Makro "formatWithoutColor" ausgeführt werden soll.

Sub formatWithoutColor()
Dim varWB As Variant, intIndex As Integer
On Error GoTo ErrExit
GMS
varWB = Application.GetOpenFilename(Filefilter:="Excel (*.xls), *.xls", _
Title:="Bitte Datei(en) für Formatierung auswählen, Abbrechen beendet das Makro", _
MultiSelect:=True)
If IsArray(varWB) Then
For intIndex = 1 To UBound(varWB)
Application.StatusBar = "Datei " & Format(intIndex, "00") & " von " & Format(UBound( _
varWB), "00") & ": "
FormatSheets varWB(intIndex)
Next
Application.StatusBar = False
End If
ErrExit:
If Err.Number  0 Then MsgBox Err.Number & vbLf & Err.Description, vbExclamation, "Fehler"
GMS True
End Sub
Sub FormatSheets(ByVal FileName As String, Optional ByVal withColor As Boolean = False)
Dim wb As Workbook, objWB As Workbook, objWS As Worksheet
Dim rng As Range, rngDel As Range, strFirst As String, lngR As Long, blnWasOpen As Boolean
Dim objShp As Shape, lngLastRow As Long, lngLastCol As Long
Dim dblLeft As Double, aLinks As Variant, intI As Integer
For Each wb In Application.Workbooks
If wb.FullName = FileName Then
Set objWB = wb
blnWasOpen = True
Exit For
End If
Next
If objWB Is Nothing Then Set objWB = Workbooks.Open(FileName, UpdateLinks:=False)
aLinks = objWB.LinkSources(xlExcelLinks)
If Not IsEmpty(aLinks) Then
For intI = 1 To UBound(aLinks)
objWB.BreakLink aLinks(intI), xlLinkTypeExcelLinks
Next
End If
Application.StatusBar = Application.StatusBar & objWB.Name
If Not SheetExist("Massbild", objWB.Name) Then
objWB.Worksheets.Add After:=objWB.Sheets(objWB.Sheets.Count)
objWB.Sheets(objWB.Sheets.Count).Name = "Massbild"
End If
For Each objWS In objWB.Worksheets
With objWS
'Tabellenblat Einrichten
.Activate 'wegen Gitternetzlinien
'Das bestehende Modul1 zuerst umbenennen und dann mit diesem Namen löschen.
.VBProject.VBComponents("Modul1").Name = "Modul99"
.VBProject.VBComponents.Remove .VBProject.VBComponents("Modul99")
'Neues Modul importieren und umbenennen
.VBProject.VBComponents.Import ("D:\Daten\Modul1.bas")
.VBProject.VBComponents(.VBProject.VBComponents.Count).Name = "Modul1"
.VBProject.VBComponents("Modulo1").Name = "Modul88"
.VBProject.VBComponents.Remove .VBProject.VBComponents("Modul88")
'Neues Modul importieren und umbenennen
.VBProject.VBComponents.Import ("D:\Daten\Modul2.bas")
.VBProject.VBComponents(.VBProject.VBComponents.Count).Name = "Modul2"

Beste Grüße,
Sergej
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Module löschen und neu importieren?
14.02.2021 19:12:37
Nepumuk
Hallo Sergej,
1. Die Schleife über alle Tabellen macht keinen Sinn wen du Standardmodule löschen/importieren willst.
2. Ist das VBProject eine Eigenschaft des Workbook-Objektes nicht eines Worksheet-Objektes.
Also:
With objWB
    
    'Das bestehende Modul1 zuerst umbenennen und dann mit diesem Namen löschen.
    .VBProject.VBComponents("Modul1").Name = "Modul99"
    .VBProject.VBComponents.Remove .VBProject.VBComponents("Modul99")
    'Neues Modul importieren und umbenennen
    .VBProject.VBComponents.Import "D:\Daten\Modul1.bas"
    .VBProject.VBComponents(.VBProject.VBComponents.Count).Name = "Modul1"
    .VBProject.VBComponents("Modulo1").Name = "Modul88"
    .VBProject.VBComponents.Remove .VBProject.VBComponents("Modul88")
    'Neues Modul importieren und umbenennen
    .VBProject.VBComponents.Import "D:\Daten\Modul2.bas"
    .VBProject.VBComponents(.VBProject.VBComponents.Count).Name = "Modul2"
    
End With

Bist du dir sicher dass du da mit dem löschen und neu benennen von Modulen nicht durcheinander gekommen bist?
Wenn das auf anderen als deinem Rechner laufen soll, muss auf jedem Rechner die Option "Zugriff auf das VBA-Projektobjektmodell vertrauen" gesetzt sein.
Gruß
Nepumuk
Anzeige
AW: VBA Module löschen und neu importieren?
14.02.2021 19:30:41
Sergej
Hallo Nepumuk,
ich bin nicht durcheinander gekommen. :-)
Ich starte das Makro "formatWithoutColor", wähle eine oder mehrere Exceldateien aus, die verarbeitet werden sollen. Dort sollen die erwähnte Module umbenannt, gelöscht und aus der BAS-Datei (aktualisierte Fassung) importiert werden.
Ich habe dein Vorschlag getestet und bekomme jetzt Meldung 9: "Index außerhalb des gültigen Bereichs"
Beste Grüße,
Sergej
Anzeige
AW: VBA Module löschen und neu importieren?
14.02.2021 19:34:55
Nepumuk
Hallo Sergej,
das bedeutet dass du ein Objekt ansprichst welches es nicht gibt.
Gruß
Nepumuk
AW: VBA Module löschen und neu importieren?
14.02.2021 20:52:49
Luschi
Hallo Sergej,
ich betreibe den Code-Austausch per Vba-AddIn intensiv und verstehe nicht, warum Du ein Modul
- erst umbenennst
- und dann löscht
- das ist doch überflüssig
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA Module löschen und neu importieren?
14.02.2021 21:32:32
Sergej
Hallo Luschi,
mit welchem VBA-Addin tauschst du bitte den Code aus?
Beste Grüße,
Sergej
AW: VBA Module löschen und neu importieren?
15.02.2021 08:13:40
Luschi
Hallo Sergej,

mit welchem VBA-Addin tauschst du bitte den Code aus?
Das habe ich selbst zusammengefummelt mit den Tipps von h i e r und d o r t und weiteren Quellen aus dem I-Net.
Mache doch mal ein praktisches Beispiel, wie Du Dir das vorstellst und stelle es hier rein.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA Module löschen und neu importieren?
15.02.2021 15:46:52
Sergej
Hallo Luschi,
ich habe 434 Dateien. Mit dem Makro "MultiSelectFile" kann ich eine oder mehrere Datei auswählen.
In den ausgewählten Dateien soll dateiweise alle VBA Module gelöscht und zwei aktuelle Module (D:\Daten\Modul1.bas und D:\Daten\Modul2.bas) importieren werden. Danach die Datei speichern. Die aktuelle Module können von mir aus auch in der Masterdatei sein.
Sub MultiSelectFile()
Dim varWB As Variant, intIndex As Integer
varWB = Application.GetOpenFilename(Filefilter:="Excel (*.xls), *.xls", _
Title:="Bitte Datei(en) für Formatierung auswählen, Abbrechen beendet das Makro", _
MultiSelect:=True)
If IsArray(varWB) Then
For intIndex = 1 To UBound(varWB)
Application.StatusBar = "Bearbeite Datei " & Format(intIndex, "00") & " von " & Format( _
UBound(varWB), "00") & ": "
'Makro für VBA Module
Next
Application.StatusBar = False
End If
End Sub
Beste Grüße,
Sergej
Anzeige
AW: VBA Module löschen und neu importieren?
15.02.2021 16:09:56
Nepumuk
Hallo Sergej,
teste mal:
Option Explicit

Public Sub MultiSelectFile()
    
    Dim vntWB As Variant, lngIndex As Long
    Dim objWorkbook As Workbook
    Dim objVBComponent As Object
    
    vntWB = Application.GetOpenFilename(Filefilter:="Excel (*.xls), *.xls", _
        Title:="Bitte Datei(en) für Formatierung auswählen, Abbrechen beendet das Makro", _
        MultiSelect:=True)
    
    If IsArray(vntWB) Then
        
        With Application
            .EnableEvents = False
            .ScreenUpdating = False
        End With
        
        For lngIndex = LBound(vntWB) To UBound(vntWB)
            
            Application.StatusBar = "Bearbeite Datei " & Format$(lngIndex, "00") & _
                " von " & Format$(UBound(vntWB), "00")
            
            Set objWorkbook = Workbooks.Open(Filename:=vntWB(lngIndex))
            
            With objWorkbook
                
                For Each objVBComponent In .VBProject.VBComponents
                    
                    If objVBComponent.Type = 1 Then _
                        Call .VBProject.VBComponents.Remove(objVBComponent)
                    
                Next
                
                Call .VBProject.VBComponents.Import("D:\Daten\Modul1.bas")
                Call .VBProject.VBComponents.Import("D:\Daten\Modul2.bas")
                
            End With
            
            Call objWorkbook.Close(SaveChanges:=True)
            
        Next
        
        Set objWorkbook = Nothing
        
        With Application
            .EnableEvents = False
            .ScreenUpdating = False
            .StatusBar = False
        End With
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Module löschen und neu importieren?
15.02.2021 23:08:13
Sergej
Hallo Nepumuk,
vielen herzlichen Dank. Es hat alles perfekt funktioniert.
Beste Grüße,
Sergej
AW: VBA Module löschen und neu importieren?
14.02.2021 20:52:49
Luschi
Hallo Sergej,
ich betreibe den Code-Austausch per Vba-AddIn intensiv und verstehe nicht, warum Du ein Modul
- erst umbenennst
- und dann löscht
- das ist doch überflüssig
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA Module löschen und neu importieren?
14.02.2021 19:39:23
onur
Sorry, aber ich verstehe nicht, warum immer ausgerechnet VBA-Anfänger per VBA-Code am VBA-Code herumpfuschen wollen, und dann auch noch in anderen Dateien.
Ich persönlich habe noch nie den Fall gehabt, dass ich glaubte, per VBA den Code verändern zu müssen.
AW: VBA Module löschen und neu importieren?
14.02.2021 20:48:52
Luschi
Hallo Onur,
ich arbeite mit einem Kompagnon zusammen. wobei er die Excel-Oberfläche/Formeln/Logik organisiert und ich den Vba-Teil. Da dies parallel passiert, verwende ich den Code-Austausch per Vba-AddIn, um meine Lösungen in seine Arbeitsmappe zu impfen.
Da wir auch mit 2 unterschiedlichen _Excel-Versionen arbeiten, passiert es öfters, daß
- der Code in E_2016 nicht läuft
- wenn er in Excel_2019 entwickelt und getestet wurde
- das liegt aber nicht an Programmierfehler
- sondern an Intoleranz-Problemen zwischen beiden Versionen
- deshalb kopiere ich den Code auf die Festplatte
- öffne die E_2016-Datei
- tausche den Vba-Code aus
- schließe die Datei wieder und schicke sie per eMail an den Partner
- ohne noch mal zu testen - das hat sich bewährt!
Gruß von Luschi
aus klein-Paris
Anzeige
AW: VBA Module löschen und neu importieren?
14.02.2021 20:58:30
onur
Hallo Luschi,
Bei dir kann ich das ja auch verstehen.
Aber 9 von 10 Anfragen in VBA-Foren, bei denen es um Code-Manipulationen per VBA geht, stammen von VBA-Anfängern, die sich meistens so in ihre "Lösungsansätze" verstrickt haben, dass sie glauben, Code-Manipulation per VBA wäre die einzige Lösung ihrer Probleme. Ich würde doch erst mal überhaupt richtig programmieren lernen wollen, bevor ich mich an "High-End"-Programmieraufgaben traue.
Gruß
Onur
Anzeige
AW: VBA Module löschen und neu importieren?
14.02.2021 21:30:53
Sergej
Hallo Onur,
ich habe genauer 434 Excel-Dateien die zwei VBA Module beinhalten, die ausgetauscht werden müssen.
Diese wollte ich nicht per copy / paste durchführen. Daher auch die Frage, wie ich in einem bestehenden Makro diese Ergänzung erweitern kann.
Gruß,
Sergej
AW: VBA Module löschen und neu importieren?
14.02.2021 22:32:40
onur
Hallo Sergej,
WENN das immer die selben Makros in den 434 sind, hätte ich sie entweder als Add-In geschrieben oder die beiden Module in eine Masterdatei eingebaut, die dann die Dateien öffnet und sie mittels der Makros verarbeitet.
In beiden Fällen müsste ich die Makros/Module nur EIN MAL auszutauschen/verändern.
Gruß
Onur
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

VBA Module löschen und neu importieren


Schritt-für-Schritt-Anleitung

Um ein Excel VBA Modul zu löschen und ein neues zu importieren, befolge diese Schritte:

  1. Öffne die Excel-Datei: Stelle sicher, dass die Datei, in die du das Modul importieren möchtest, geöffnet ist.

  2. Aktiviere den VBA-Editor: Drücke ALT + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  3. Erstelle ein neues Makro:

    Sub MultiSelectFile()
       Dim varWB As Variant, intIndex As Integer
       varWB = Application.GetOpenFilename(Filefilter:="Excel (*.xls), *.xls", _
       Title:="Bitte Datei(en) für Formatierung auswählen, Abbrechen beendet das Makro", _
       MultiSelect:=True)
       If IsArray(varWB) Then
           For intIndex = 1 To UBound(varWB)
               Application.StatusBar = "Bearbeite Datei " & Format(intIndex, "00") & " von " & Format(UBound(varWB), "00") & ": "
               Call ProcessWorkbook(varWB(intIndex))
           Next
           Application.StatusBar = False
       End If
    End Sub
    
    Sub ProcessWorkbook(FileName As String)
       Dim wb As Workbook
       Set wb = Workbooks.Open(FileName)
       ' Hier Module löschen und importieren
       Call DeleteAndImportModules(wb)
       wb.Close SaveChanges:=True
    End Sub
    
    Sub DeleteAndImportModules(wb As Workbook)
       Dim vbComp As Object
    
       ' Alle Module löschen
       For Each vbComp In wb.VBProject.VBComponents
           If vbComp.Type = 1 Then ' 1 für Standardmodule
               wb.VBProject.VBComponents.Remove vbComp
           End If
       Next vbComp
    
       ' Neues Modul importieren
       wb.VBProject.VBComponents.Import "D:\Daten\Modul1.bas"
       wb.VBProject.VBComponents.Import "D:\Daten\Modul2.bas"
    End Sub
  4. Führe das Makro aus: Starte das Makro, um die Dateien auszuwählen und die Module zu löschen sowie neue zu importieren.


Häufige Fehler und Lösungen

  • Fehler: "Methode oder Datenobjekt nicht gefunden": Überprüfe, ob die "Zugriff auf das VBA-Projektobjektmodell vertrauen" in den Excel-Optionen aktiviert ist.
  • Fehler: "Index außerhalb des gültigen Bereichs": Stelle sicher, dass das Modul, das du löschen möchtest, existiert. Überprüfe den Namen des Moduls.
  • Fehler: "Objekt nicht gefunden": Dies kann passieren, wenn du versuchst, ein Modul zu löschen oder zu importieren, das nicht existiert. Überprüfe die Pfade und Namen der Module.

Alternative Methoden

Eine alternative Methode ist die Verwendung eines VBA Add-Ins. Hierbei kannst du häufig verwendete Module zentral verwalten und bei Bedarf in verschiedenen Excel-Dateien importieren, ohne den Code jedes Mal manuell zu ändern.


Praktische Beispiele

Hier ist ein Beispiel, wie du ein Excel Modul löschen und ein neues importieren kannst:

Sub ImportNewModules()
    Dim wb As Workbook
    Set wb = ThisWorkbook ' oder verwende Workbooks("deinWorkbook.xlsm")

    ' Löschen des Moduls "Modul1"
    On Error Resume Next
    wb.VBProject.VBComponents.Remove wb.VBProject.VBComponents("Modul1")
    On Error GoTo 0

    ' Importieren des neuen Moduls
    wb.VBProject.VBComponents.Import "D:\Daten\NeuesModul.bas"
End Sub

In diesem Beispiel wird das Modul "Modul1" gelöscht und ein neues Modul aus einer Datei importiert.


Tipps für Profis

  • Sichere deine Module: Bevor du ein Modul löschst, erstelle eine Sicherungskopie, um Datenverluste zu vermeiden.
  • Nutze Fehlerbehandlung: Implementiere On Error-Anweisungen, um Fehler während des Import- oder Löschvorgangs zu behandeln.
  • Automatisierung: Wenn du regelmäßig Module importierst, erstelle ein Makro, das diesen Prozess automatisiert.

FAQ: Häufige Fragen

1. Wie kann ich ein Modul umbenennen?
Um ein Modul umzubenennen, kannst du die .Name-Eigenschaft des VBComponent-Objekts verwenden. Beispiel:

wb.VBProject.VBComponents("Modul1").Name = "NeuerModulname"

2. Kann ich mehrere Module gleichzeitig löschen?
Ja, indem du eine Schleife über vbProject.VBComponents verwendest und die Module basierend auf ihren Namen löschst.

3. Was ist der Unterschied zwischen einem Modul und einem Klassenmodul?
Ein Modul ist eine Sammlung von Prozeduren, während ein Klassenmodul zur Implementierung von Objekten und deren Eigenschaften verwendet wird.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige