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

CodeModule zur Laufzeit in Sheet einfügen

Forumthread: CodeModule zur Laufzeit in Sheet einfügen

CodeModule zur Laufzeit in Sheet einfügen
04.07.2005 10:11:19
Chat
Hallo an alle Excel-Experten in diesem Forum.
Ich habe folgendes Problem:
Ich möchte ein CodeModule während der Laufzeit in den Code-Bereich eines Tabellenblatts schreiben.
Die folgenden Lines-of-code befinden sich im Bereich "Arbeitsmappe" und sind
Teil des "Workbook_Open()"-Ereignis:
'
' Insert sheet "name_of_sheet"
'
Sheets.Add.Name = name_of_sheet
'
' Get CodeName of sheet
'
codename_of_sheet = Sheets("CONTROL").CodeName
'
' Generate CodeModule
'
code = code & vbLf
code = code & "

Private Sub Worksheet_Activate()" & vbLf
code = code & "    panel_control.Show" & vbLf
code = code & "End Sub
" & vbLf
code = code & vbLf
code = code & vbLf
code = code & "

Private Sub Worksheet_Deactivate()" & vbLf
code = code & "    panel_control.Hide" & vbLf
code = code & "End Sub
"
'
' Pass CodeModule to sheet "codename_of_sheet"
'
--> With ThisWorkbook.VBProject.VBComponents(codename_of_sheet).CodeModule .AddFromString code
End With
Der Debugger zeigt mir immer einen Fehler in der mit den Pfeilen (--> Füge ich den o. a. Code in ein eigenes Modul ein und gehe im Debug-Modus schrittweise durch, so funktioniert alles einwandfrei.
Ich hoffe es kennt jemand eine Lösung für mein Problem.
Im Voraus: Vielen Dank!
Chat
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: CodeModule zur Laufzeit in Sheet einfügen
04.07.2005 13:07:17
Heiko
Hallo Chat,
ich wundere mich ein bisschen über diesen Teil:
' Insert sheet "name_of_sheet"
Sheets.Add.Name = name_of_sheet
' Get CodeName of sheet
codename_of_sheet = Sheets("CONTROL").CodeName
Meine Fragen dazu:
Wann und wo wird die Variable name_of_sheet mit einen Namen (Inhalt) "versorgt" ?
Soll der Code in das neu angelegte Blatt, oder soll er in das Blatt "Control" ?
Wenn ich das bei mir so schreibe:
Sheets.Add.Name = "CONTROL"
' Get CodeName of sheet
codename_of_sheet = Sheets("CONTROL").CodeName
dann läuft es bei mir im Workbook_Open so durch.
Gruß Heiko
Anzeige
AW: CodeModule zur Laufzeit in Sheet einfügen
04.07.2005 14:07:00
Chat
Hallo Heiko...
Vielen Dank für Deine schnelle Antwort.
Im Folgenden füge ich Ausschnitte aus Deiner Antwort ein um sie direkt beantworten zu können:
>> ich wundere mich ein bisschen über diesen Teil:
>>
>> ' Insert sheet "name_of_sheet"
>> Sheets.Add.Name = name_of_sheet
>> ' Get CodeName of sheet
>> codename_of_sheet = Sheets("CONTROL").CodeName
>>
>> Meine Fragen dazu:
>> Wann und wo wird die Variable name_of_sheet mit einen Namen (Inhalt) "versorgt" ?
>> Soll der Code in das neu angelegte Blatt, oder soll er in das Blatt "Control" ?
Der Variablen "name_of_sheet" wird schon der Name "CONTROL" zugewiesen. Ich hatte dummer Weise vergessen, diese Zeile in meiner Anfrage einzufügen.
>> Wenn ich das bei mir so schreibe:
>> Sheets.Add.Name = "CONTROL"
>> ' Get CodeName of sheet
>> codename_of_sheet = Sheets("CONTROL").CodeName
>>
>> dann läuft es bei mir im Workbook_Open so durch.
Wenn ich Deinen Code schrittweise debugge, dann funktioniert das bei mir auch!
Aber füge doch bitte mal folgende Zeilen in den Bereich "DieseArbeitsmappe" ein:

Private Sub workbook_open()
Sheets.Add.Name = "CONTROL"
codename_of_sheet = Sheets("CONTROL").CodeName
With ThisWorkbook.VBProject.VBComponents(codename_of_sheet).CodeModule
.AddFromString "' " & codename_of_sheet
End With
End Sub

Wenn die Mappe geschlossen war und ich sie per doppelklick öffne, dann kommt eine Fehlermeldung. Wenn ich mir dann den Inhalt von "codename_of_sheet" anzeigen lasse, muss ich feststellen, dass der Variablen kein Zeichen zugewiesen wurde.
Gibt es keine andere Möglichkeit auf eine "frisch" erzeugte VB-Komponente zuzugreifen?
So was wie: ActiveComponent?
Oder: LastComponent?
Ich muss das Tabellenblatt nicht zwingender Weise über seinen CodeNamen ansprechen.
Chat.
Anzeige
AW: CodeModule zur Laufzeit in Sheet einfügen
04.07.2005 14:56:11
Heiko
Hallo Chat,
ich bin jetzt soweit das es läuft wenn EXCEL und der VBA Editor schon offen sind. Startet man das Workbook ohne das der VBA Editor offen ist dann geht es nicht.
Aber warum das so ist ?
Gruß Heiko

PS: Rückmeldung wäre nett !
Mal ne schlechte Lösung, aber sollte laufen.
04.07.2005 15:09:44
Heiko
Hallo Chat,
hier mal ne Krücke mit der es bei mir nun läuft, Krücke deshalb weil halt kurzfristig die VBE auftaucht. Gibt bestimmt bessere Lösungen, aber ich mach jetzt erstmal Feierabend.

Private Sub workbook_open()
Application.ScreenUpdating = False
With Application.VBE.MainWindow
.SetFocus
.Visible = True
End With
Sheets.Add.Name = "CONTROL"
codename_of_sheet = Sheets("CONTROL").CodeName
With ThisWorkbook.VBProject.VBComponents(codename_of_sheet).CodeModule
.AddFromString "' " & codename_of_sheet
End With
With Application.VBE.MainWindow
.SetFocus
.Visible = False
End With
Application.ScreenUpdating = True
End Sub

Gruß Heiko

PS: Rückmeldung wäre nett !
Anzeige
Klappt
04.07.2005 16:23:23
Chat
Once again: Vielen Dank für die Arbeit, die Du investiert hast.
Ja, klappt!!!
Deiner Betreff-Zeile meine ich entnehmen zu können, dass Du mit der Lösung selber nicht so recht zufrieden bist - oder täusche ich mich da?
Ich werde jetzt einfach mal ein Weilchen abwarten...
Vieleicht kommst Du - oder jemand anders - ja noch auf eine bessere Lösung.
Ich habe jedenfalls die Nase für's erste voll und gebe mich geschlagen.
Bis bald,
Chat.
Anzeige
Nun ne saubere Lösung, ;-)
05.07.2005 08:45:54
Heiko
Hallo Chat,
das hat mich doch nicht in Ruhe gelassen.

Private Sub workbook_open()
Dim strHilf As String, strNameOfSheet As String
Application.ScreenUpdating = False
' Name festlegen
strNameOfSheet = "CONTROL"
' Neues Sheet anlegen
Sheets.Add
' Nun erstmal den Namen auslesen um auch den "VBA-Namen" zu bekommen.
strHilf = ActiveSheet.Name
' Und dann erst umbenennen
Sheets(strHilf).Name = strNameOfSheet
' Diesee Zeile kann auch weggelassen werden, dann bleibt der VBA-Name halt Tabelle...
ThisWorkbook.VBProject.VBComponents.Item(strHilf).Name = strNameOfSheet
' Ohne die Zeile über "mir" müßte die With Zeile so aussehen.
' With ThisWorkbook.VBProject.VBComponents(strhilf).CodeModule
With ThisWorkbook.VBProject.VBComponents(strNameOfSheet).CodeModule
.AddFromString "' " & strNameOfSheet
End With
Application.ScreenUpdating = True
End Sub

Gruß Heiko

PS: Rückmeldung wäre nett !
Anzeige
RESPEKT
05.07.2005 09:46:51
Chat
Hallo Heiko.
Respekt!
Super Lösung!
Ich hatte in der Zwischenzeit eine andere Lösung ausprobiert:
-- Ich habe alle vorhandenen Tabellenblätter gezählt,
-- Ein Array mit dieser Zahl dimensioniert
-- Die Nummern aller Blätter im Array gespeichert
-- Das neue Blatt eingefügt
-- Geprüft, welches Blatt bzw. welche Blattnummer im Array NICHT vorhanden ist
-- Den Namen dieses Blattes an die Routine zur Übergabe des Code-Moduls übergeben.
Das Ergebnis war, dass sich die Datei zwar noch öffnen ließ, dann aber sang-und-klanglos abgeschmiert ist (Fehlerreport senden?).
Deine Lösung glänzt durch ihre Einfachheit!!!
Ich bin beeindruckt.
Vielleicht bis bald,
Chat.
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

CodeModule zur Laufzeit in Excel einfügen


Schritt-für-Schritt-Anleitung

  1. Arbeitsmappe öffnen: Zuerst musst Du sicherstellen, dass Du den VBA-Editor geöffnet hast, bevor Du die Arbeitsmappe öffnest, um Probleme zu vermeiden.

  2. Code in das Workbook_Open-Ereignis einfügen: Füge den folgenden VBA-Code in den Bereich "DieseArbeitsmappe" ein:

    Private Sub Workbook_Open()
       Dim strNameOfSheet As String
       Application.ScreenUpdating = False
       strNameOfSheet = "CONTROL"
       Sheets.Add.Name = strNameOfSheet
    
       With ThisWorkbook.VBProject.VBComponents(strNameOfSheet).CodeModule
           .AddFromString "' " & strNameOfSheet
       End With
    
       Application.ScreenUpdating = True
    End Sub
  3. CodeModule anpassen: Stelle sicher, dass der Code korrekt formatiert ist und die richtigen Variablen verwendet werden, um Fehler zu vermeiden.


Häufige Fehler und Lösungen

  • Fehler beim Zugriff auf den Code: Wenn Du beim Öffnen der Arbeitsmappe eine Fehlermeldung erhältst, könnte es daran liegen, dass der VBA-Editor nicht offen ist. Stelle sicher, dass er geöffnet ist, bevor Du die Arbeitsmappe öffnest.

  • Unzureichende Variablenzuweisung: Achte darauf, dass alle Variablen korrekt zugewiesen sind, insbesondere name_of_sheet. Wenn diese Variable nicht den richtigen Wert hat, kann es zu Fehlern kommen.

  • CodeModule wird nicht erkannt: Wenn Du den Code in das falsche Modul einfügst, kann das dazu führen, dass das CodeModule nicht richtig funktioniert. Achte darauf, dass Du es im richtigen Modul platzierst.


Alternative Methoden

Eine alternative Methode zur Erstellung eines CodeModules ist die Verwendung von:

Private Sub Workbook_Open()
    Application.ScreenUpdating = False
    Dim NewSheet As Worksheet
    Set NewSheet = Sheets.Add
    NewSheet.Name = "CONTROL"

    With ThisWorkbook.VBProject.VBComponents(NewSheet.CodeName).CodeModule
        .AddFromString "Private Sub Worksheet_Activate()" & vbCrLf & "    panel_control.Show" & vbCrLf & "End Sub"
    End With

    Application.ScreenUpdating = True
End Sub

Diese Methode erstellt ein neues Tabellenblatt und fügt sofort ein CodeModule hinzu.


Praktische Beispiele

Ein einfaches Beispiel zur Verwendung eines VBA CodeModules in einem neuen Blatt könnte so aussehen:

Private Sub Workbook_Open()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add
    ws.Name = "Daten"

    With ThisWorkbook.VBProject.VBComponents(ws.CodeName).CodeModule
        .AddFromString "Private Sub Worksheet_Change(ByVal Target As Range)" & vbCrLf & "    MsgBox ""Wert geändert!""" & vbCrLf & "End Sub"
    End With
End Sub

Dieses Beispiel zeigt, wie Du eine einfache Meldung erzeugen kannst, wenn sich ein Wert in dem neuen Blatt ändert.


Tipps für Profis

  • Verwende Error-Handling: Implementiere Error-Handling in Deinen VBA-Skripten, um unerwartete Fehler abzufangen.

  • Code effizient strukturieren: Halte Deinen Code modular und klar strukturiert, um die Wartbarkeit zu verbessern.

  • Testen in verschiedenen Umgebungen: Teste Dein Skript in unterschiedlichen Excel-Versionen, um sicherzustellen, dass es überall funktioniert.


FAQ: Häufige Fragen

1. Warum funktioniert mein Code nicht, wenn der VBA-Editor nicht offen ist? Das liegt daran, dass Excel beim Öffnen der Arbeitsmappe auf den VBA-Editor zugreifen muss. Stelle sicher, dass der Editor vor dem Öffnen der Arbeitsmappe geöffnet ist.

2. Wie kann ich sicherstellen, dass mein codemodule erfolgreich hinzugefügt wird? Überprüfe die Zuweisungen und stelle sicher, dass die Variablen korrekt sind. Teste den Code schrittweise im Debug-Modus, um die Fehlerursache zu identifizieren.

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