如何在第一次打开工作簿时运行宏?

时间:2015-04-29 10:27:12

标签: excel vba excel-vba

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

Private Sub Workbook_Open()

    Open1.Show

End Sub

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

但是,我希望userform在第一次打开工作簿时显示 。有没有办法让这种情况发生?

4 个答案:

答案 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