我想在选择特定工作表时运行宏。但诀窍是我想在打开工作簿后第一次选择工作表时才运行它。
答案 0 :(得分:2)
抱歉,我原本误读了你的问题。
将此代码放在工作表代码中:
Public sheetOpenned As Boolean ' should go at the top of the page
Private Sub Worksheet_Activate()
If sheetOpenned = False Then
' run your macro
sheetOpenned = True
End If
End Sub
请注意,在打开工作簿并且工作表是默认工作表时,此子服务器不会运行。我怀疑你必须添加另一段代码来处理Workbook_Open()
事件中的那个场景。
答案 1 :(得分:0)
在Excel VB编辑器帮助中查找事件。有很多事件,你可以编写一个例程,以便在感兴趣的时候调用它们。
下面的例程不会处理用户创建新工作表或更改现有工作表的顺序,但应该为您提供有关如何实现所寻求效果的一些想法。
打开工作簿,然后打开VB编辑器。项目浏览器位于左侧。如有必要,请点击针对它的加号展开Microsoft Excel Objects
。单击ThisWorkbook
,将显示空代码区域。复制该代码区域中的以下代码。保存并关闭工作簿。重新打开工作簿并在工作表之间切换。打开VB Editor以查看Debug.Print输出。关闭工作簿以查看最终显示。
希望这有帮助。
Option Explicit
Dim ActivateCount() As Long
Sub Workbook_Open()
Dim InxS As Long
Debug.Print "Workbook """ & ActiveWorkbook.Name & """ opened"
ReDim ActivateCount(1 To Sheets.Count)
' Entries will be initialised to zero.
' SheetActivate is not called for the initial sheet
For InxS = 1 To Sheets.Count
If Sheets(InxS).Name = ActiveSheet.Name Then
ActivateCount(InxS) = ActivateCount(InxS) + 1
Debug.Print "Worksheet """ & ActiveSheet.Name & """ activation count = " & ActivateCount(InxS)
Exit For
End If
Next
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim InxS As Long
For InxS = 1 To Sheets.Count
If Sheets(InxS).Name = Sh.Name Then
ActivateCount(InxS) = ActivateCount(InxS) + 1
Exit For
End If
Next
Debug.Print "Worksheet """ & Sh.Name & """ activation count = " & ActivateCount(InxS)
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim InxS As Long
Dim Text As String
Text = "Activation counts"
For InxS = 1 To Sheets.Count
Text = Text & vbLf & " " & ActivateCount(InxS) & " " & Sheets(InxS).Name
Next
Call MsgBox(Text, vbOKOnly)
End Sub