Hallo zusammen,
hab leider etwas Stress (Die alten Weiber sinds nicht alleine …). Daher auch zugegebenermassen keine intensive Rechereche!
Kann ich in einer „peronal.xls“, die also eh geöffnet wird, das Öffnen eines weiteren WorkBooks abfangen? Also beim Öffnen „reagieren“? In den zu öffnenenden EXCEL Sheets entsteht ein Fehler, den ich gerne so „abfangen“ würde, da ich nicht mehr der Herr der Dateien bin, die verteilt wurden, und einzelnen Usern nict zumuten kann jedesma erst ein Makro anzustoßen.
mfg
Dirk.Pegasus
Das geht sehr einfach mit wenigen Codezeilen
Kann ich in einer „peronal.xls“, die also eh geöffnet wird,
das Öffnen eines weiteren WorkBooks abfangen? Also beim Öffnen
„reagieren“? In den zu öffnenenden EXCEL Sheets entsteht ein
Fehler, den ich gerne so „abfangen“ würde, da ich nicht mehr
der Herr der Dateien bin, die verteilt wurden, und einzelnen
Usern nict zumuten kann jedesma erst ein Makro anzustoßen.
Hi Dirk,
und zwar mit einem Klassenmodul in der personl.xls. Leider verstehe ich davon nix. Ich hatte aber mal solchen Code und weiß noch dass er sehr kurz war. leider ist er im Nirwana bei meiner alten Festplatte.
Aber mir wurde ein andrer klassenmodul-Code geschrieben der bei jeder Datei die man öffnet, egal ob alte oder ganz neue Datei, einen Verweis setzt auf die Ms Form 2.0.
Vielleicht kannst du ja den umstricken, bzw nach einzelnen Wörtern daraus „googeln“.
Füge in der person(a)l.xls ein Klassenmodul dazu. Das benennst du um in „clsApplication“. dahinein kommt folgender Code:
Option Explicit
Private WithEvents mobjApplication As Application
Public Property Set prpApplication(objApplication As Application)
Set mobjApplication = objApplication
End Property
Private Sub mobjApplication\_NewWorkbook(ByVal Wb As Workbook)
Call prcAddReverence(Wb)
End Sub
Private Sub mobjApplication\_WorkbookOpen(ByVal Wb As Workbook)
Call prcAddReverence(Wb)
End Sub
In „DieseArbetsmappe“ kommt:
Option Explicit
Private objApplication As clsApplication
Private Sub Workbook\_Open()
Set objApplication = New clsApplication
Set objApplication.prpApplication = Application
End Sub
in ein Modul1 kommt:
Option Explicit
Private Const FM20\_GUID = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}"
Public Sub prcAddReverence(objWorkbook As Workbook)
Dim intIndex As Integer
Dim blnFound As Boolean
On Error GoTo err\_exit
With objWorkbook.VBProject.References
For intIndex = 1 To .Count
If .Item(intIndex).GUID = FM20\_GUID Then
If .Item(intIndex).IsBroken Then
.Remove .Item(intIndex)
Else
blnFound = True
End If
End If
Next
If Not blnFound Then \_
.AddFromGuid GUID:=FM20\_GUID, Major:=2, Minor:=0
End With
Exit Sub
err\_exit:
MsgBox "Fehler " & CStr(Err.Number) & vbLf & \_
vbLf & Err.Description, vbCritical, "Fehler"
End Sub
Profis bennenen ihre Variablen mit System. Also „intZeile“ bedeutet Variable ist ein Integer, „strWort“ dito für String usw.
Also wurde „clsApplication“ als Klassenmodul benannt.
Mit Glück kanst du beim Googeln nach „clsApplication“, „clsApp“ o.ä. etwas Passendes finden.
Gruß
Reinhard
Hallo Reinhard, passt, werds anpassen! OwT
öö
Ich wäre an der Lösung interessiert m.T.
Hallo Dirk,
da ich Klassenmodule nicht „kapiert“ habe, poste bitte deine Lösung.
Vielleicht kann ich mir dann damit was basteln für meine Wünsche.
Ein Wunsch ist, ich öffne oft „unbekannte“ Exceldateien mit Makros.
Aus Selbstschutz muss ich sie erst mit deaktivierten Makros öffnen, den Code in Diesearbeitsmappe und den tabeklllen prüfen, dann schliessen, mit aktivierten makros öffnen usw.
Wie schön wäre es, in der personl.xls ist eine Routine die gleich mit enableevents=false alles in der Datei unterbindet, mir dann die Codes aus DieseArbeitsamppe, den Tabellen auflistet und mich dann fragt, Datei mit Makros öffnen oder nicht.
Es sind Dateien aus einem Excelforum wie hier, klar keine Killermakros, aber es ist halt lästig wenn meine Symbolleiste verändert ist, irgednwas in den Optionen verstellt ist oder ähnliches.
Das war jetzt nur eine Idee von mehreren, dafür bräuchte ich halt ein Klassenmodul in personl.xls, was anscheinennd ausgeführt wird bevor Code in z.B. Workbook_Open ausgeführt wird.
Gruß
Reinhard
Hallo Reinhard,
du hast doch alles geliefert!
Deinen Code habe ich in meine personl.xls, die im xLstart Verzeichnis liegt, eingebaut. Damit wird dieser „Eventhandler“ immer eingebaut, wenn du Excel öffnest.
Zum Code selber:
Public Sub prcAddReverence(objWorkbook As Workbook)
Dim intIndex As Integer
Dim blnFound As Boolean
MsgBox („Was soll ich machen, Meister?“)
On Error GoTo err_exit
'viel arbeit …
MsgBox („Fertig Meister mit:“ & objWorkbook.Name)
Exit Suberr_exit:
MsgBox "Meister ich habe einen Fehler " & CStr(Err.Number) & vbLf & _
vbLf & Err.Description, vbCritical, „Fehler“
End Sub
Die sub hattest du geliefert. Die läuft ab, wenn ein Workbook geöffnet wird. Baus mal ein. (natürlich auch den Rest, den du gepostet hattest
) Du kriegst immer zwei Meldungen. (Die können ja dann anzeigen: „Da ist ein Makro!“. Leider auch beim Start von Excel, da ja eine Mappe geöffnet wird.
Die Zeile 'viel Arbeit kannst gegen deinen Code austauschen.
Die Zeile danach gibt als Beispiel den Namen des neu geöffneten Workbooks aus. Über das objWorkbook solltest du alle „Eigenschaften“ des Fremdlings im Griff haben.
Was ich nicht probiert habe ist, ob die Abfrage „böse makros“ von Excel vor oder nach dem Handler abläuft. Hab gerade keine Zeit, aber wenn dus verwendest solltest du es merken. Ggfs. kannst du immer Makros zulassen (Extras, makros Sicherheit), wenn dass Abfangen so klappt. Klar, das das eigentlich keine „Lösung“ ist.
Eventuell kann man auch den Dialog mit der Meldung „Achtung …“ (is das auch ein Excel Pop Up!) ja umbiegen, wie ich die Seitenvorschau umgebogen habe. (Hattest du mir das erklärt?) Oder gleich das Pop Up zum Dateiöffnen? Danach ein Dialog „Wie hätten wirds denn gerne?“
Falls noch Fragen sind, immer gerne … (Man lernt ja selber auch nie aus!)
mfg
Dirk.Pegasus
können ja dann anzeigen: „Da ist ein Makro!“. Leider auch beim
Start von Excel, da ja eine Mappe geöffnet wird.
Hallo Dirk,
danke für deine Mühe, werde es ausprobieren.
Meinst du mit Öffnene einer Mappe die neue leere Mappe oder die Personl.xls?
Ersteres läßt sich mit dem Startparameter „/e“ umgehen oder mit einer Schleife die die dateinamn prüft nach =„personl.xls“ und like „mappe*“.
Das andere müßte man ja im Code der personl.xls abfangen können. (Excelstartparameter: Im F1-Index nacht Start suchen, 2ter Eintrag)
Gruß
Reinhard
Hallo Reinhard,
ich meine jedes öffnen eines Workbooks. Im Standard (ohne Schalter oder ähnliches) sin das die Personl.xls und die Mappe1.xls. Klar, wenn keine leere geöffnet wird (ich kannte diesen Schalter nicht) wird das Makro auch nur einmale geöffnet. Das kann man sicher auch abfangen (.name „personl.xls“) oder so.
mfg
Dirk.Pegasus