Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Automatisierungsfehler Codename VBE

Betrifft: Automatisierungsfehler Codename VBE von: Knut
Geschrieben am: 29.08.2007 13:05:20

Hallo !

Ich bin am verzweifeln. Problem : mein Programm laeuft fehlerfrei mit geoeffnetem VBE, aber nicht ohne VBE.
Habe ich den VBE nicht offen bei Programmstart, stuerzt Excel ab (automatisierungsfehler...). Seltsamerweise stuerzt es an der gleichen Stelle auch ab, wenn ich vorher den VBE im Laufe des Makros oeffne.
Das ganze geschieht am Ende meines Progs. Dann, wenn verschiedenen worksheets noch Ereignisprozeduren angefuegt werden sollen.

Hier der Code:

' Am Schluss werden nun noch die Ereignisprozeduren in die Erstellten Diagrammblaetter eingetragen
Dim boolv As Boolean
boolv = False

' den VBE oeffne ich, um an die Codenamen der im Laufe des Makros erstellten Blaetter zu kommen

With Application.VBE.MainWindow
If .Visible = False Then
boolv = True
.SetFocus
.Visible = True
End If
End With

For idia = 1 To UBound(dia)
If dia(idia) = True Then
Select Case idia
Case Is = 1
ereignis "B1_RW"
Case Is = 2
ereignis "B2_RW"
End Select
End If
Next idia

With Application.VBE.MainWindow
If boolv = True Then
.SetFocus
.Visible = False
End If
End With

End Sub

~f~
' in diesem Teil erfolgt der Absturz (beim zweiten durchlauf - also "B2_RW") Die msgBox wird noch angezeigt, aber dann will Excel schon Microsoft verstaendigen - ohne dass ich noch gelegenheit bekomme die msgbox wegzuklicken.
~f~
Option Explicit
Sub ereignis(ByRef blattname1 As String)
Dim ii As Long, zielname As String

' nur zum debuggen
If blattname1 = "B2_RW" Then
MsgBox "Schoenen Gruß"
End If

' Worksheets(blattname1).Activate
zielname = Worksheets(blattname1).CodeName

Select Case blattname1
Case Is = "B1_RW"
With ActiveWorkbook.VBProject.VBComponents(zielname).CodeModule
ii = .CreateEventProc("SelectionChange", "worksheet") + 1
.InsertLines ii, "dim rngg as range"
.InsertLines ii + 1, "i = 0"
.InsertLines ii + 2, "For Each rngg In Target: i = i + 1: Next rngg"
.InsertLines ii + 3, "If i <> 1 Then"
.InsertLines ii + 4, "Exit Sub"
.InsertLines ii + 5, "End If"
.InsertLines ii + 6, "Select Case Target.Column"
.InsertLines ii + 7, "Case 4 To 10, 15 To 21"
.InsertLines ii + 8, "If Target.Row > 4 And Target.Row < 12 Then"
.InsertLines ii + 9, "If Target.value > 0 Then"
.InsertLines ii + 10, "zeiley = Target.row"
.InsertLines ii + 11, "spaltex = Target.column"
.InsertLines ii + 12, "anzahlmonate =" & anzahlmonate
.InsertLines ii + 13, "Mliste.show"
.InsertLines ii + 14, "End If"
.InsertLines ii + 15, "End If"
.InsertLines ii + 16, "End Select"
End With

Case Is = "B2_RW"

With ActiveWorkbook.VBProject.VBComponents(zielname).CodeModule
ii = .CreateEventProc("SelectionChange", "worksheet") + 1
.InsertLines ii, "dim rngg as range"
.InsertLines ii + 1, "i = 0"
.InsertLines ii + 2, "For Each rngg In Target: i = i + 1: Next rngg"
.InsertLines ii + 3, "If i <> 1 Then"
.InsertLines ii + 4, "Exit Sub"
.InsertLines ii + 5, "End If"
.InsertLines ii + 6, "Select Case Target.Column"
.InsertLines ii + 7, "Case 5 To 13"
.InsertLines ii + 8, "If Target.Row > 6 And Target.Row < 14 Then"
.InsertLines ii + 9, "If Target.value > 0 Then"
.InsertLines ii + 10, "zeiley = Target.row"
.InsertLines ii + 11, "spaltex = Target.column"
.InsertLines ii + 12, "anzahlmonate =" & anzahlmonate
.InsertLines ii + 13, "Mliste.show"
.InsertLines ii + 14, "End If"
.InsertLines ii + 15, "End If"
.InsertLines ii + 16, "End Select"
End With
Case Else

End Select

Kann mir jemand helfen ? Vielleicht muss ich eine Function verwenden ? Ob ich mittels byref oder byval uebergebe aendert jedenfalls nichts.

Schoene Grueße,
Knut

  

Betrifft: AW: Automatisierungsfehler Codename VBE von: Herby
Geschrieben am: 29.08.2007 14:16:01

Hallo Knut,

habs mal nachgestellt. Bei dieser Zeile bleibt er hängen:

.InsertLines ii + 12, "anzahlmonate =" & anzahlmonate

nachdem ich anzahlmonate dimensioniert (integer) und einen
Wert zugewiesen habe, klappt es, dh. er hat die Msgbox sowie
diese Ereignisprocedure erstellt:


Private Sub worksheet_SelectionChange(ByVal Target As Range)
Dim rngg As Range
i = 0
For Each rngg In Target: i = i + 1: Next rngg
If i <> 1 Then
Exit Sub
End If
Select Case Target.Column
Case 5 To 13
If Target.Row > 6 And Target.Row < 14 Then
If Target.Value > 0 Then
zeiley = Target.Row
spaltex = Target.Column
anzahlmonate = 5
Mliste.Show
End If
End If
End Select

End Sub





viele Grüße
Herby


  

Betrifft: AW: Automatisierungsfehler Codename VBE von: Knut
Geschrieben am: 29.08.2007 14:39:00

Großmeister !!! Vielen Dank !!

Ich sehe immer noch keine Moeglichkeit es selber zu debuggen, da es bei mir ja immer abstuerzt - wie hast du das geschafft ?

Seltsam ist, dass anzahlmonate public integer ist, im ersten Schleifendurchlauf noch einen Wert hat und nur an dieser Stelle im ganzen Programm auftaucht (außer bei der Initialisierung ganz am Anfang.

Also ich habe es jetzt vorerst so geloest - bis mir was besseres einfaellt, oder ich verstehe was in VBE vorgeht:
Ich habe die Initialisierung der Variabla anzahlmonate in die schon gezeigte Schleife gelegt - was das Prog nicht gerade beschleunigt - Hauptsache es geht jetzt erstmal.

For idia = 1 To UBound(dia)
If dia(idia) = True Then

' anzahlmonate bestimmen
Set rngg = Worksheets("Datenmatrix").Range("a1:ac7").Find(what:="Monat*", LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If rngg Is Nothing Then
MsgBox "In Datenmatrix fehlt die Spalte mit ""Monat"""
Exit Sub
End If
i = 1
Do
i = i + 1
Set rngf = rngg.Offset(i, 0)
Loop Until rngf.Offset(1, 0).Value = rngf.Offset(i, 0).Value
anzahlmonate = i - 1
Select Case idia
Case Is = 1
ereignis "B1_RW_Verbraeuche"
Case Is = 2
ereignis "B2_RW_WBZ"
End Select
End If
Next idia

Viele Grueße,
Knut


  

Betrifft: AW: Automatisierungsfehler Codename VBE von: Knut
Geschrieben am: 29.08.2007 15:45:56

jetzt laeufts wieder nicht - geht nur wenn ich anzahlmonate immer eine feste zahl bei jedem schleifendurchlauf zuweise - also z.B.: anzahlmonate=12
egal wie ichs mit public und local variablen versuche es funktioniert nicht.


  

Betrifft: AW: Automatisierungsfehler Codename VBE von: Herby
Geschrieben am: 29.08.2007 17:04:11

Hallo Knut,

ich habs nochmal probiert und es funktioniert ohne Probleme.

So sieht die Übergabe der Variablen aus:

Select Case idia
Case Is = 1
ereignis "B1_RW", anzahlmonate
Case Is = 2
ereignis "B2_RW", anzahlmonate
End Select
End If
Next idia
....

und so die ereignisprocedure:


Sub ereignis(ByRef blattname1 As String, ByRef anzahlmonate As Integer)
Dim ii As Long, zielname As String
' nur zum debuggen
MsgBox anzahlmonate
If blattname1 = "B2_RW" Then
MsgBox "Schoenen Gruß"
End If

' Worksheets(blattname1).Activate
zielname = Worksheets(blattname1).CodeName

Select Case blattname1
Case Is = "B1_RW"

With ActiveWorkbook.VBProject.VBComponents(zielname).CodeModule
ii = .CreateEventProc("SelectionChange", "worksheet") + 1
.InsertLines ii, "dim rngg as range"
.InsertLines ii + 1, "i = 0"
.InsertLines ii + 2, "For Each rngg In Target: i = i + 1: Next rngg"
.InsertLines ii + 3, "If i <> 1 Then"
.InsertLines ii + 4, "Exit Sub"
.InsertLines ii + 5, "End If"
.InsertLines ii + 6, "Select Case Target.Column"
.InsertLines ii + 7, "Case 4 To 10, 15 To 21"
.InsertLines ii + 8, "If Target.Row > 4 And Target.Row < 12 Then"
.InsertLines ii + 9, "If Target.value > 0 Then"
.InsertLines ii + 10, "zeiley = Target.row"
.InsertLines ii + 11, "spaltex = Target.column"
.InsertLines ii + 12, "anzahlmonate =" & anzahlmonate
.InsertLines ii + 13, "Mliste.show"
.InsertLines ii + 14, "End If"
.InsertLines ii + 15, "End If"
.InsertLines ii + 16, "End Select"
End With

Case Is = "B2_RW"

With ActiveWorkbook.VBProject.VBComponents(zielname).CodeModule
ii = .CreateEventProc("SelectionChange", "worksheet") + 1
.InsertLines ii, "dim rngg as range"
.InsertLines ii + 1, "i = 0"
.InsertLines ii + 2, "For Each rngg In Target: i = i + 1: Next rngg"
.InsertLines ii + 3, "If i <> 1 Then"
.InsertLines ii + 4, "Exit Sub"
.InsertLines ii + 5, "End If"
.InsertLines ii + 6, "Select Case Target.Column"
.InsertLines ii + 7, "Case 5 To 13"
.InsertLines ii + 8, "If Target.Row > 6 And Target.Row < 14 Then"
.InsertLines ii + 9, "If Target.value > 0 Then"
.InsertLines ii + 10, "zeiley = Target.row"
.InsertLines ii + 11, "spaltex = Target.column"
.InsertLines ii + 12, "anzahlmonate =" & anzahlmonate
.InsertLines ii + 13, "Mliste.show"
.InsertLines ii + 14, "End If"
.InsertLines ii + 15, "End If"
.InsertLines ii + 16, "End Select"
End With
Case Else

End Select

End Sub





wenns bei dir nicht funktionieren sollte, kannst du den wert in einer Tabelle zwischenspeichern und
über die Ereignisprocedure wieder auslesen ?! (Notlösung)


Viele Grüße
Herby