Vba PERSONAL.XLSB启动时的宏选项
我想在打开新工作簿后立即注册PERSONAL.XLSB UDF。我有一个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
工作簿\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讨厌我们。