Vba PERSONAL.XLSB启动时的宏选项

Vba PERSONAL.XLSB启动时的宏选项,vba,excel,user-defined-functions,Vba,Excel,User Defined Functions,我想在打开新工作簿后立即注册PERSONAL.XLSB UDF。我有一个工作簿\u Open()事件调用,如下所示: Sub RegisterUDF() Dim s As String s = "Enter 0 for x resolution" & vbLf _ & "1 for y resolution" Application.MacroOptions Macro:="GetSystemMetrics", Description:=s, C

我想在打开新工作簿后立即注册PERSONAL.XLSB UDF。我有一个
工作簿\u Open()
事件调用,如下所示:

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
其中
GetSystemMetrics
是我的UDF,代码放在工作簿对象和my Personal.xlsb的模块中

打开新工作簿时,由于收到错误消息,某些内容似乎正在运行:


如何修复代码以在每个新工作簿上注册UDF?

这可能是由于在工作簿完全加载之前运行了
RegisterUDF
而导致的。在调用
RegisterUDF
之前,请尝试在
Workbook\u Open
事件中添加以下内容

Do Until Application.Ready = True
DoEvents: Loop

如果上述解决方案不起作用,以下可能是另一种方法:

请尝试在
工作簿\u打开后发生的
激活
事件。
否则,如果需要造成延迟,您可以在
工作簿_Open
事件中使用
OnTime
方法:

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

这将在2秒延迟后运行
RegisterUDF
过程。

在尝试@Peh的方法并读取错误消息后,我发现这是有效的:

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

不错。只是个附带问题。为什么是2秒?每当我必须定义脚本中硬编码的等待时间时,我就有这个问题。不是专门针对这个,而是例如调用shell。除了使用
Do-Until
之外,有时我还需要添加一些等待。你有什么方法吗?@Masoud随机选择2秒,因为大多数时候2秒足够完成其他动作。许多操作只需要几毫秒,但可能2秒还不够,因此必须在设置中进行测试,因为这也取决于系统的性能。我们必须记住,这仍然只是一个解决办法,因为Excel讨厌我们。