我如何才能运行一个macros只作为一个工作簿第一次打开?

我有一个工作簿,它运行一个macros来显示用户窗体Open1打开时,使用(非常基本的)代码:

Private Sub Workbook_Open() Open1.Show End Sub 

这样做很好 – 每次打开工作簿时,用户窗体都会popup并完美运行。

但是,我希望用户窗体只在第一次打开工作簿时出现。 有没有办法让这种情况发生?

您可以使用第一次打开电子表格时被删除的虚拟模块。

就像是:

 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中使用。 这将教会我写代码而不用testing它! 以下更新的代码将工作,但为了访问VB环境,需要信任的Excel。

在“信任中心”>“macros设置”中有一个设置,您可以选中此代码以在“开发人员macros设置”下工作

因此,这可能不会成为安全问题的可能性。

 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 

尝试这个:

 If Sheets("Hide").Cells(1,1) = "1" Then Open1.Show Sheets("Hide").Cells(1,1) = "0" End if 

您必须创build工作表隐藏,并将单元格A1的值为1,在这种情况下将显示该窗体。

创build工作表后,用此隐藏它

 Sheets("Hide").Visible = xlVeryHidden 

并用此显示

 Sheets("Hide").Visible = True 

这里有一个替代的代码将保存在保存之间,并允许您重置它。 不需要创build一个隐藏的表单。 把它放在一个模块中(从Workbook_Open事件处理程序调用DisplayFormIfFirstTime ….)

 Option Explicit Private Const cMoniker As String = "FormHasBeenDisplayed" Private Sub DisplayFormIfFirstTime() If HasBeenOpened = False Then DisplayForm End Sub Public Sub DisplayForm() MsgBox "Ok, its not a form but a dialog box...", vbInformation End Sub Public Function HasBeenOpened() As Boolean Dim oName As Name On Error Resume Next Set oName = Application.Names(cMoniker) On Error GoTo 0 If Not oName Is Nothing Then HasBeenOpened = True Else Call Application.Names.Add(cMoniker, True, False) End If End Function 'Call this to remove the flag... Public Sub ResetOpenOnce() On Error Resume Next Application.Names(cMoniker).Delete End Sub 

基于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