2017-05-02 8 views
0

Ich möchte meine PERSONAL.XLSB UDFs registrieren, sobald ich eine neue Arbeitsmappe öffne. Ich habe eine Workbook_Open() Veranstaltung rufen Sie das folgende:PERSONAL.XLSB MacroOptions beim Start

Sub RegisterUDF() 
    Dim s As String 
    s = "Enter 0 for x resolution" & vbLf _ 
    & "1 for y resolution" 

    Application.MacroOptions Macro:="GetSystemMetrics", Description:=s, Category:=9, HelpFile:="https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx" 
End Sub 

wo GetSystemMetrics meine UDF ist und der Code wird in dem Arbeitsobjekt und ein Modul meiner Personal.xlsb platziert

Auf eine neue Arbeitsmappe zu öffnen, etwas erscheint Ich bekomme die Fehlermeldung: Error

Wie soll ich meinen Code beheben, um die UDF bei jeder neuen Arbeitsmappe zu registrieren?

Antwort

0

Nach @Peh den Ansatz und das Lesen der Fehlermeldungen versuchen, finde ich, das funktioniert:

Private Sub Workbook_Activate() 
Dim t As String 
t = ActiveWorkbook.Name 
Application.ScreenUpdating = False 
Windows("PERSONAL.XLSB").Visible = True 
Call RegisterUDF 
Windows("PERSONAL.XLSB").Visible = False 
Windows(t).Visible = True 
Application.ScreenUpdating = True 
End Sub 
0

Dies kann verursacht werden, wenn die RegisterUDF ausgeführt wird, bevor die Arbeitsmappe vollständig geladen ist. Versuchen Sie Folgendes in das Workbook_Open Ereignis vor Sie RegisterUDF aufrufen.

Do Until Application.Ready = True 
DoEvents: Loop 

Wenn über die Lösung nicht die folgenden könnte eine alternative Art und Weise sein, funktioniert:

Versuchen Sie, das Workbook_Activate Ereignis, das nach Workbook_Open passiert. Andernfalls, wenn es notwendig ist, um eine Verzögerung zu verursachen, können Sie die OnTime Methode im Workbook_Open Ereignisse verwenden:

Application.OnTime Now + TimeValue("00:00:02"), "RegisterUDF" 

Das die RegisterUDF Verfahren nach einer Verzögerung von 2 Sekunden ausgeführt wird.

+0

Nice one. Nur eine Nebenfrage. Warum 2 Sekunden? Wann immer ich in meinem Skript die Wartezeit fest codieren muss, habe ich diese Frage. Nicht speziell für diesen, sondern zum Beispiel Shell aufrufen. Abgesehen von 'Do Until' muss ich manchmal etwas warten. Hast du irgendeine Methode oder etwas dafür? – Masoud

+1

@Masoud Nur zufällig 2 Sekunden, weil die meisten Male 2 Sekunden genug Zeit sind, um andere Aktionen zu beenden. Viele Aktionen benötigen nur ein paar Millisekunden, aber es kann immer noch sein, dass 2 Sekunden nicht genug sind, also müssen Sie dies auf Ihrem Setup testen, da dies auch von der Leistung Ihres Systems abhängt. Wir müssen daran denken, dass dies immer noch nur ein Workaround ist, weil Excel uns hasst. –