我有一个工作簿,它运行一个宏来显示打开的用户窗体Open1,使用(非常基本的)代码:
Private Sub Workbook_Open()
Open1.Show
End Sub
这样做很好 - 每次打开工作簿时,用户窗体都会弹出并完美运行。
但是,我希望userform在第一次打开工作簿时显示 。有没有办法让这种情况发生?
答案 0 :(得分:2)
您可以使用虚拟模块,在您第一次打开电子表格时将其删除...
类似的东西:
If ModuleExists("DummyModule") Then
Open1.Show
DoCmd.DeleteObject acModule, "DummyModule"
End If
Function ModuleExists(strModuleName As String) As Boolean
Dim mdl As Object
For Each mdl In CurrentProject.AllModules
If mdl.Name = strModuleName Then
ModuleExists = True
Exit For
End If
Next
End Function
更新:如上所述,DoCmd并未在excel vba中使用。这将教我编写代码而不进行测试! 以下更新的代码将起作用,但为了访问VB环境,需要信任excel。
信任中心>宏设置中有一个设置,您可以勾选此代码以在开发人员宏设置下工作
因此,这可能不是可行的方法,因为它可以解决安全问题......
Sub RemoveModule()
If ModuleExists("DummyModule") Then
Open1.Show
Dim vbCom As Object: Set vbCom = Application.VBE.ActiveVBProject.VBComponents
vbCom.Remove VBComponent:=vbCom.Item("DummyModule")
End If
End Sub
Function ModuleExists(strModuleName As String) As Boolean
Dim mdl As Object
For Each mdl In Application.VBE.ActiveVBProject.VBComponents
If mdl.Name = strModuleName Then
ModuleExists = True
Exit For
End If
Next
End Function
答案 1 :(得分:0)
试试这个:
If Sheets("Hide").Cells(1,1) = "1" Then
Open1.Show
Sheets("Hide").Cells(1,1) = "0"
End if
您必须创建工作表隐藏,并为单元格A1指定值1,在这种情况下,将显示表单。
创建工作表后,使用此
隐藏它Sheets("Hide").Visible = xlVeryHidden
用这个显示它
Sheets("Hide").Visible = True
答案 2 :(得分:0)
这是一个替代的代码,它将在保存之间保留并允许您重置它。无需创建隐藏工作表。 把它放在一个模块中(从你的Workbook_Open事件处理程序中调用DisplayFormIfFirstTime ......)
{{1}}
答案 3 :(得分:0)
基于PaulG提供的想法,我编写了一个升级版,它将检查名称,如果没有找到运行函数,请添加名称并保存工作簿以获得更加无缝的方法解决此问题...
放在ThisWorkbook中
Private Sub Workbook_Open()
Run "RunOnce"
End Sub
放置在模块中
Sub RunOnce()
Dim Flag As Boolean: Flag = False
For Each Item In Application.Names
If Item.Name = "FunctionHasRun" Then Flag = True
Next
If Flag = False Then
Call Application.Names.Add("FunctionHasRun", True, False)
Application.DisplayAlerts = False
ActiveWorkbook.Save
Application.DisplayAlerts = True
Call RunOnceFunction
End If
End Sub
Private Function RunOnceFunction()
Open1.Show
End Function
Sub ResetRunOnce()
For Each Item In Application.Names
If Item.Name = "FunctionHasRun" Then
Application.Names.Item("FunctionHasRun").Delete
Application.DisplayAlerts = False
ActiveWorkbook.Save
Application.DisplayAlerts = True
End If
Next
End Sub