Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1600to1604
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
Inhaltsverzeichnis

vbComponent nach Worksheets.Add leer?

vbComponent nach Worksheets.Add leer?
15.01.2018 13:52:16
Burkhard
Hallo miteinander,
ich füge ein neues Worksheet ein und möchte danach eine OnSelectionChange-Funktion hineinschreiben:
Worksheets.Add After:=Worksheets(Worksheets.count)
sCodeName = ActiveSheet.CodeName
With ActiveWorkbook.VBProject.VBComponents(sCodeName).CodeModule
i = .CreateEventProc("SelectionChange", "Worksheet")
.InsertLines i + 1, "ProcessSelectionChange Target"
End With
Wenn ich das Ganze im VBEditor "durchklickere", funktioniert alles wunderbar. Im Echtlauf bekomme ich allerdings in der With-Zeile einen Index-Fehler, denn sCodeName ist zu diesem Zeitpunkt leer. Wenn ich mir die VBComponents auflisten lasse, fehlt an dieser Stelle das gerade hinzugefügte Worksheet. Wo liegt das Problem?
Vielen Dank für eure Tipps!
Burkhard

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: vbComponent nach Worksheets.Add leer?
15.01.2018 13:58:04
Sepp
Hallo Burkhard,
versuche es so.
Sub test1()
Dim sCodeName As String, i As Long

Worksheets.Add After:=Worksheets(Worksheets.Count)
sCodeName = ActiveSheet.CodeName
DoEvents
With ActiveWorkbook.VBProject.VBComponents(sCodeName).CodeModule
  i = .CreateEventProc("SelectionChange", "Worksheet")
  .InsertLines i + 1, "ProcessSelectionChange Target"
  Debug.Print VarType(i)
End With
End Sub

Gruß Sepp

Anzeige
AW: vbComponent nach Worksheets.Add leer?
15.01.2018 15:29:32
Burkhard
Hallo Sepp,
das hat leider nichts geholfen. Aber ich habe etwas SEHR Erstaunliches herausgefunden:
Worksheets.Add After:=Worksheets(Worksheets.count)
sCodeName = Worksheets(Worksheets.count).CodeName
MsgBox "1 sCodeName: " & sCodeName                      ==> sCodeName ist LEER
sCodeName = ActiveWorkbook.VBProject.VBComponents(Worksheets.count).Name
MsgBox "2 sCodeName: " & sCodeName                      ==> sCodeName ist "Tabelle6" (FALSCH)
sCodeName = Worksheets(Worksheets.count).CodeName
MsgBox "3 sCodeName: " & sCodeName                      ==> sCodeName ist "Tabelle8" (RICHTIG)
Irgendwie scheint durch den Zugriff auf die VBComponents der CodeName in dem neuen Worksheet erst versorgt zu werden. Kennt jemand einen anderen (logischeren) Weg, das zu bewerkstelligen?
Grüße
Burkhard
Anzeige
AW: vbComponent nach Worksheets.Add leer?
15.01.2018 15:45:12
Sepp
Hallo Burkhard,
Sub test1()
Dim sCodeName As String, i As Long
Dim objSheet As Worksheet

Set objSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))

With ActiveWorkbook.VBProject.VBComponents(objSheet.CodeName).CodeModule
  i = .CreateEventProc("SelectionChange", "Worksheet")
  .InsertLines i + 1, "ProcessSelectionChange Target"
End With

Set objSheet = Nothing
End Sub

Gruß Sepp

Anzeige
AW: vbComponent nach Worksheets.Add leer?
16.01.2018 10:25:59
Burkhard
Hallo Sepp,
die Idee mit dem worksheet-object finde ich gut - aber das hilft leider auch nicht. Schau dir bitte mal den folgenden Codeausschnitt an:
[...]
Set wsSheet = Worksheets.Add(After:=Worksheets(Worksheets.count))
sCodeName = wsSheet.CodeName
Stop
'    With ActiveWorkbook.VBProject.VBComponents(sCodeName).CodeModule
With ActiveWorkbook.VBProject.VBComponents(wsSheet.CodeName).CodeModule
[...]

Wenn nach dem Stop der VB-Editor aufgeht, hat sCodeName den Inhalt "", wsSheet.CodeName den korrekten Inhalt "Tabelle8".
Wenn ich den Stop weglasse (und das muss ich ja wohl irgendwann einmal), geht der nachfolgende Zugriff auf die Components im With-Block in die Hose, egal ob mit sCodeName oder wsSheet.CodeName ...
Irgendetwas müsste also zwischen dem Set und dem With eingefügt werden, damit der CodeName auch zur Laufzeit und nicht nur bei geöffneter Entwicklungsumgebung verfügbar ist.
Grüße
Burkhard
Anzeige
AW: vbComponent nach Worksheets.Add leer?
16.01.2018 10:34:53
Sepp
Hallo Burkhard,
dann so.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub test1()
Dim objSheet As Object

Set objSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))

Call Application.OnTime(Now, "'insertCode """ & objSheet.CodeName & """'")

Set objSheet = Nothing
End Sub

Sub insertCode(strCodename As String)
Dim i As Long
With ActiveWorkbook.VBProject.VBComponents(strCodename).CodeModule
  i = .CreateEventProc("SelectionChange", "Worksheet")
  .InsertLines i + 1, "ProcessSelectionChange Target"
End With
End Sub

Gruß Sepp

Anzeige
AW: vbComponent nach Worksheets.Add leer?
16.01.2018 12:04:07
Burkhard
Hallo Sepp,
es hilft leider nichts: zur Laufzeit ist objSheet.CodeName nach dem Set und vor dem Call LEER (geprüft mit simpler MsgBox), und damit auch strCodename in der Sub (ebenfalls gesehen in MsgBox). Der With-Block bzw. der Zugriff auf die Components bringt nach wie vor einen Fehler.
Grüße
Burkhard
so ist es zuverlässiger!
16.01.2018 11:13:27
Sepp
Hallo Burkhard,
so sollte es immer funktionieren.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub test1()
Dim objSheet As Object, strCodeName As String, i As Long

Set objSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))

With Application.VBE
  strCodeName = objSheet.CodeName
End With

With ActiveWorkbook.VBProject.VBComponents(strCodeName).CodeModule
  i = .CreateEventProc("SelectionChange", "Worksheet")
  .InsertLines i + 1, "ProcessSelectionChange Target"
End With

Application.VBE.MainWindow.Visible = False

Set objSheet = Nothing
End Sub

Gruß Sepp

Anzeige
so ist es zuverlässiger!
16.01.2018 11:13:28
Sepp
Hallo Burkhard,
so sollte es immer funktionieren.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub test1()
Dim objSheet As Object, strCodeName As String, i As Long

Set objSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))

With Application.VBE
  strCodeName = objSheet.CodeName
End With

With ActiveWorkbook.VBProject.VBComponents(strCodeName).CodeModule
  i = .CreateEventProc("SelectionChange", "Worksheet")
  .InsertLines i + 1, "ProcessSelectionChange Target"
End With

Application.VBE.MainWindow.Visible = False

Set objSheet = Nothing
End Sub

Gruß Sepp

Anzeige
BINGO!
16.01.2018 12:47:46
Burkhard
Hallo Sepp,
BINGO! Es funktioniert! Und sogar das unerwünschte Öffnen der Entwicklungsumgebung (ich wollte schon fast einen neuen Thread aufmachen) ist damit erledigt!
Vielen Dank!
Grüße
Burkhard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige