Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
632to636
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
632to636
632to636
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

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

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.
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige