如何在打开工作簿后第一次激活特定工作表时运行宏?

时间:2014-06-24 08:47:13

标签: excel-vba vba excel

我想在选择特定工作表时运行宏。但诀窍是我想在打开工作簿后第一次选择工作表时才运行它。

2 个答案:

答案 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
相关问题