【问题标题】:I want to auto-run my macro when opening the excel file我想在打开 excel 文件时自动运行我的宏
【发布时间】:2020-01-15 04:37:23
【问题描述】:

我想在打开 Excel 表格时自动运行这个私有子。

我尝试使用 Private Sub Workbook_Open() 方法,但由于第一个私有子没有名称,所以它不起作用。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet: Set ws = Sheets("Budget- Reporting")
    If Range("W6").Value = 0 Then
        HideFG
    Else
        HideF
    End If
End Sub

Sub HideF()
'
' HideF Macro
'

'
    For i = 1 To ActiveSheet.Shapes.Count
    ActiveSheet.Shapes(i).Visible = msoTrue
    Next i
    ActiveSheet.Shapes.Range(Array("F")).Visible = msoFalse
    Application.CommandBars("Selection").Visible = False
End Sub

Sub HideFG()
'
' HideFG Macro
'

'
    For i = 1 To ActiveSheet.Shapes.Count
    ActiveSheet.Shapes(i).Visible = msoTrue
    Next i
    ActiveSheet.Shapes.Range(Array("FG")).Visible = msoFalse
    Application.CommandBars("Selection").Visible = False
End Sub

我希望它在打开 excel 文件时自动检查单元格 W16 并继续使用 HideF 宏或 HideFG 宏。目前,这两个宏会在您打开文件后在单元格上实际键入时运行。

【问题讨论】:

  • 这不是私人子,这是工作表更改Event 每次在该特定工作表上发生更改时都会触发它。

标签: excel vba autorun


【解决方案1】:

你有几个问题。首先,您不想要Worksheet_Change(ByVal Target As Range) ,因为这是针对工作簿更改的事件触发器,您想要Workbook_Open()。这存储在ThisWorkbook 下,而不是单独的模块/工作表。

这是工作代码,我注释掉了您的 ws 声明以进行测试。

Private Sub Workbook_Open()
'Dim ws As Worksheet: Set ws = Sheets("Budget- Reporting")
    If Range("W6").Value = 0 Then
        HideFG
    Else
        HideF
    End If
End Sub

Sub HideF()
 MsgBox "HideF"
End Sub

Sub HideFG()
 MsgBox "HideFG"
End Sub

这是我的编辑器的截图。

通用汽车在这里发布了一个很棒的资源 --> https://support.office.com/en-us/article/automatically-run-a-macro-when-opening-a-workbook-1e55959b-e077-4c88-a696-c3017600db44

我只是将模块放在屏幕截图的同一位置,但是如果您想将模块与workbook_open 事件分开存储,您可以将它们分开放置并仍然使用Call HideFG 方法,就像我想要的那样。

【讨论】:

  • 你是个天才 :) 非常感谢你的帮助!现在解决了。祝你有美好的一天!
  • 请投票/接受答案,以便其他人知道您的问题已得到解决,并且用户会因提供帮助而获得代表:)。很高兴它已修复。
  • 坏建议:“最后,你想使用Call HideFG 而不仅仅是HideFG”。坦率地说,什么都不做,建议人们使用过时的代码 sn-ps 简直是不负责任!
  • 似乎使用 call stackoverflow.com/q/2573597/5079799 没什么大不了的
  • @FreeSoftwareServers:这里经常提到“呼叫”的使用——引用一个 9 年前的帖子可能无法提供最新的评论。 github.com/rubberduck-vba/Rubberduck/issues/34 提到它,stackoverflow.com/questions/2573597/…(也是 9 岁)提供了更深入的讨论。仅仅因为一个可以,并不意味着一个应该。但是,您在这里回答的真正关键是您说“您想使用Call [...]”,因为当前代码非常好,不需要任何技巧。
【解决方案2】:

最简单的方法是使用打开 excel 文件时执行的默认模块“ThisWorkbook”。您可以在窗口左侧的 VBA 项目资源管理器中找到它。 只需将您要执行的子程序复制到空间中即可。

这里有详细解释: https://support.office.com/en-us/article/automatically-run-a-macro-when-opening-a-workbook-1e55959b-e077-4c88-a696-c3017600db44

如果您的用例有必要,这可以帮助您调用私有子:

Private Sub PrivateCallDemo()
'Module2
Application.Run "Module1.Worksheet_Change"
End Sub

这样你的实际 Sub 可以留在另一个模块中。

【讨论】:

  • 非常欢迎您,FreeSoftwareServers 说,请接受并投票给有用的答案(我们都希望获得更多代表;))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多