Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1104to1108
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

x1 = .CreateEventProc("Change", "Worksheet")

x1 = .CreateEventProc("Change", "Worksheet")
Oliver
Hallo Kollegen,
ich habe ein Problem bei der .CreateEventProc("Change", "Worksheet")
Mein Code sieht wie folgt aus

Sub Makro_in_Worksheet_zufügen()
Dim x As Variant, x1 As Long, x2 As Long, Anzahl_der_Zeilen As Long, Tabellennummer As  _
String
DIM Tabellenname As String
Application.EnableEvents = False
Tabellennummer = ActiveSheet.Index
Tabellenname = ActiveSheet.Name
If Tabellenname  "Arbeitsunterlagen" Then
With ActiveWorkbook.VBProject.VBComponents("Tabelle" & Tabellennummer).CodeModule
On Error GoTo error_1
x1 = .ProcBodyLine("Worksheet_Change", vbext_pk_Proc)
On Error GoTo 0
Anzahl_der_Zeilen = .CountOfLines
If x1 > 0 Then
x2 = .ProcBodyLine("Worksheet_Change", vbext_pk_Proc)
.DeleteLines 1, Anzahl_der_Zeilen
End If
continue_1:
x1 = .CreateEventProc("Change", "Worksheet")
.InsertLines x1 + 1, "'dieses Change Makro wurde dper Makro eingefügt"
.InsertLines x1 + 2, "'Dies diehnt zum Speichern des Users der die Eingaben gemacht hat" _
End With
End If
Exit Sub
error_1:
On Error GoTo 0
GoTo continue_1
End Sub
Der Code soll in der stehenden Routine in jedes Arbeitsblatt eingefügt werden
For i = 1 To Val(Anzahl_der_Kopien)
Fortschrittsbar.ProgressBar1.Value = i
Sheets(Bezeichnung_des_Blattes).Copy Before:=Sheets(i + 1)
Application.EnableEvents = False
Makro_in_Worksheet_zufügen
Application.EnableEvents = True
Next i
das Problem ist, ein Automatisierungsfehler auftritt: das aufgerufene Object wurde von den Clients getrennt

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: x1 = .CreateEventProc("Change", "Worksheet")
05.10.2009 20:46:33
fcs
Hallo Oliver,
bei Änderungen am Code von VBA-Modulen sollte man mit dem Code-Namen und nicht mit einem aus Name und Index-Nummer zusammengesetzten Namen arbeiten. Es kommt sonst schnell zum Desaster.
Die angegebene Fehlermeldung kann ich mit diesen Prozeduren überhaupt nicht in Verbindung bringen.
Diese tritt meines Wissens immer dann auf, wenn Datenverbindungen von einer Excel-Datei zu einer anderen Anwendung bestehen (möglicherweise auch einer 2. Excelinstanz) bestehen. Sind in deinen Tabellenblättern irgendwelche Abfragen auf externe Daten vorhanden oder rufen andere Anwendungen Daten aus der Datei ab?
Auf alle Fälle muss du im Excel-VBA-Editor unter Extras--Verweise den Verweis auf "Microsoft Visual Basisc for Applications Extensibilty x.y" aktivieren und unter den Einstellungen für Makrosichertheit muss du "Zugriff auf das VBA-Projektobjektmodell vertrauen" aktivieren.
Bei mir funktionieren deine Prozeduren mit ein paar Testdaten reibungslos. Aller Code, der sich im zu kopierenden Blatt befindet wird gelöscht und es wird die folgende Prozedur eingefügt:
Private Sub Worksheet_Change(ByVal Target As Range)
'dieses Change Makro wurde dper Makro eingefügt
'Dies dient zum Speichern des Users der die Eingaben gemacht hat
End Sub
Gruß
Franz
Deine Prozedur angepasst bzgl. Modul-Name
Sub Makro_in_Worksheet_zufügen()
Dim x As Variant, x1 As Long, x2 As Long, Anzahl_der_Zeilen As Long, _
Tabellennummer As Long
Dim Tabellenname As String
Dim wks As Worksheet
Application.EnableEvents = False
Tabellenname = ActiveSheet.Name
If Tabellenname  "Arbeitsunterlagen" Then
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
On Error GoTo error_1
x1 = .ProcBodyLine("Worksheet_Change", vbext_pk_Proc)
On Error GoTo 0
Anzahl_der_Zeilen = .CountOfLines
If x1 > 0 Then
x2 = .ProcBodyLine("Worksheet_Change", vbext_pk_Proc)
.DeleteLines 1, Anzahl_der_Zeilen
End If
continue_1:
x1 = .CreateEventProc("Change", "Worksheet")
.InsertLines x1 + 1, "'dieses Change Makro wurde per Makro eingefügt"
.InsertLines x1 + 2, "'Dies dient zum Speichern des Users der die Eingaben gemacht hat"
End With
End If
Exit Sub
error_1:
On Error GoTo 0
GoTo continue_1
End Sub
Sub NewSheets()
'Testmakro
Dim Anzahl_der_Kopien As Long, i As Long, Bezeichnung_des_Blattes As String
'Der Code soll in der stehenden Routine in jedes Arbeitsblatt eingefügt werden
'Testwerte
Bezeichnung_des_Blattes = "Muster"
Anzahl_der_Kopien = 3
For i = 1 To Val(Anzahl_der_Kopien)
'Fortschrittsbar.ProgressBar1.Value = i
Sheets(Bezeichnung_des_Blattes).Copy Before:=Sheets(i + 1)
Application.EnableEvents = False
Makro_in_Worksheet_zufügen
Application.EnableEvents = True
Next i
End Sub

Anzeige
AW: x1 = .CreateEventProc("Change", "Worksheet")
05.10.2009 23:14:18
Oliver
hallo Franz,
danke für deine Antwort, aber leider habe ich alle Verweise und den "Zugriff auf das VBA-Projektobjektmodell vertrauen" aktiviert.
warscheinlich liegt mein Problem darin, dass ich den beschriebenen Code aus einem AddIn heraus starte. Komischerweise funktioniert ein anderer Aufruf sehr gut:
Sub clsMakro_in_Workbook_zufügen()
'Fügt in erste Tabelle des Workbooks ein Macro in Activate_Ereignis
Dim x As Variant, x1 As Long, x2 As Long, Anzahl_der_Zeilen As Long, Macrotext As String
Dim Envirotext As String, Benutzertext As String
Macrotext = "Range(" & Chr$(34) & "A1" & Chr$(34) & ").Select"
Envirotext = "UserName = LCase(Environ(" & Chr$(34) & "USERNAME" & Chr$(34) & "))"
Benutzertext = "Case " & Chr$(34) & "julia.brunner" & Chr$(34) & ", " & Chr$(34) & "renate. _
ruetsch" & Chr$(34) & ", " & Chr$(34) & "sonja.throm" & Chr$(34) & ", " & Chr$(34) & "angelika.hofer" & Chr$(34) & ", " & Chr$(34) & "felix.heppeler" & Chr$(34) & ", " & Chr$(34) & "axel.heppeler" & Chr$(34) & ""
With ActiveWorkbook.VBProject.VBComponents("DieseArbeitsmappe").CodeModule
On Error GoTo error_1
x1 = .ProcBodyLine("Workbook_Activate", vbext_pk_Proc)
On Error GoTo 0
Anzahl_der_Zeilen = .CountOfLines
If x1 > 0 Then
x2 = .ProcBodyLine("Workbook_Activate", vbext_pk_Proc)
.DeleteLines 1, Anzahl_der_Zeilen
End If
continue_1:
x1 = .CreateEventProc("Activate", "Workbook")
.InsertLines x1 + 1, "'dieses Activate Makro wurde durch das Add-In per Makro eingefügt" _
.InsertLines x1 + 2, "Dim Sheetzähler as Integer"
.InsertLines x1 + 3, "Sheetzähler = 1"
.InsertLines x1 + 4, "Application.ScreenUpdating = False"
.InsertLines x1 + 5, "Sheets(1).select"
.InsertLines x1 + 6, "do until Sheetzähler = ActiveWorkbook.Sheets.Count"
.InsertLines x1 + 7, Macrotext    '"Range(" & Chr$(34) & "A1" & Chr$(34) & ").Select"
.InsertLines x1 + 8, Envirotext    '"UserName = LCase(Environ(" & Chr$(34) & "USERNAME"  _
& Chr$(34) & "))"
.InsertLines x1 + 9, "Select Case UserName"
.InsertLines x1 + 10, Benutzertext    '"Case " & Chr$(34) & "renate.ruetsch" & Chr$(34)  _
& ", " & Chr$(34) & "sonja.throm" & Chr$(34) & ", " & Chr$(34) & "angelika.hofer" & Chr$(34) & ", " & Chr$(34) & "felix.heppeler" & Chr$(34) & ", " & Chr$(34) & "axel.heppeler" & Chr$(34) & ""
.InsertLines x1 + 11, "ActiveSheet.Unprotect"
.InsertLines x1 + 12, "Sheetzähler=Sheetzähler+1"
.InsertLines x1 + 13, "Case Else"
.InsertLines x1 + 14, "ActiveSheet.Protect DrawingObjects:=True, Contents:=True,  _
Scenarios:=True"
.InsertLines x1 + 15, "Sheetzähler=Sheetzähler+1"
.InsertLines x1 + 16, "End Select"
.InsertLines x1 + 17, "Sheets(Sheetzähler).select"
.InsertLines x1 + 18, "Loop"
.InsertLines x1 + 19, "Sheets(1).select"
.InsertLines x1 + 20, "Call set_App"
.InsertLines x1 + 21, "Application.ScreenUpdating = true"
End With
Exit Sub
error_1:
On Error GoTo 0
GoTo continue_1
End Sub
Dieses Macro wird an gleicher Stelle geschrieben, wie das zuvor nicht funktionsfähige Worksheet_Change Macro
Vielleicht sollte ich dir einmal meine Programmidee vermitteln.
Die Makros sollen in bestehende Excelauswerteblätter geschrieben werden um den Scheibschutz beim Büropersonal aufzuheben. -->Dieses klappt
Freigegebene Zellen sollen beim Verlassen (wenn Wert eingegeben) geschützt werden, damit nachträglich keine Manipulation mehr möglich ist.
Dieses wollte ich in das Worksheet_Change Ereignis schreiben ---->das klappt aber nicht
Hast du dafür eventuell eine andere Idee? gibt es eine bedingte Formatierung, welche Zellen schützt?
Gruß
Oliver
Anzeige

301 Forumthreads zu ähnlichen Themen


Hallo zusammen,
Markus hat in https://www.herber.de/forum/archiv/1012to1016/t1013729.htm ein IMHO interessantes Problem gepostet.
Da der Thread jetzt bald ins Archiv wandert, wir aber noch keine Erklärung gefunden haben,
stelle ich die Frage hier nochmal ein.
In der Beispielmapp...
Anzeige

Guten Abend!
ich versuche mich gerade ein bißchen in VBA insbesondere das worksheet change event zu vertiefen und würde mich über einen Rat freuen.
In A1:A5 habe ich sich verändernde Zahlen von 1 bis 3. Wenn sich in der Spalte A ein Wert verändert, sollen in der entsprechenden Zeile - u...

Hallo,
beim Wechsel auf eine bestimmte Seite einer MultiPage werden (ausgelöst durch MultiPage1_Change) umfangreiche Berechnungen durchgeführt. Da die Berechnungen einige Sekunden dauern können und der Rechner wie "abgestürzt" wirkt, möchte ich das Caption von Page1 zwischenzeitlich auf "Bi...
Anzeige

Hallo zusammen,
gibt es eine Möglichkeit in einem Addin ein Worksheet_change-Event einer anderen Datei zu erkennen?
Beispiel:
MeinAddin.xla ist geladen
Mappe1.xls ist geöffnet und wird geändert.
MeinAddin.xla weiß, dass eine Änderung stattgefunden hat.
Ziel wäre eine Erk...

Servus,
versuche gerade das explizite Einlesen von Ranges in eine Variable zu minimieren. Dazu lese ich den Range nur einmal in eine globale Variable ein und möchte dann bei späteren Aufrufen einfach nur die Range-Variable übergeben.
Wenn ich das Folgende nun in einer WorksheetChange-Pr...

Hallo VBA Experten,
ich habe eine persönliche Herausforderung mit dem SelectionChange Event.
Ich möchte, dass Excel eine Zelle mit einem "#" überschreibt / editiert, wenn eine beliebige Zelle in einer Zeile selektiert ist. Dies soll für mehrere Zeilen geschehen. Wenn also eine beliebige...

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige