这是很多问题。:) 对于 3,您需要将事件从它们所在的位置移到处理应用程序级事件的自定义类模块中。首先在您的项目中插入一个新的类模块(插入 - 类模块)。将该模块命名为 CAppEvents(F4 显示属性表,您可以在其中更改名称)。然后将此代码粘贴到类模块中
Option Explicit
Private WithEvents mobjWb As Workbook
Private Sub Class_Terminate()
Set mobjWb = Nothing
End Sub
Public Property Get wb() As Workbook
Set wb = mobjWb
End Property
Public Property Set wb(objwb As Workbook)
Set mobjWb = objwb
End Property
Private Sub mobjWb_SheetActivate(ByVal Sh As Object)
Dim wn As Window
If IsSplitSheet(Sh) Then
If Not IsSplit(Sh) Then
CreateSplitSheets Sh
End If
Else
If IsSplit(Sh) Then
For Each wn In Me.wb.Windows
If wn.Caption Like Me.wb.Name & ":#" Then
wn.Close
End If
Next wn
ActiveWindow.WindowState = xlMaximized
Sh.Activate
End If
End If
End Sub
Private Function IsSplitSheet(Sh As Object) As Boolean
Dim vaNames As Variant
Dim i As Long
IsSplitSheet = False
vaNames = GetSplitSheetNames
For i = LBound(vaNames) To UBound(vaNames)
If vaNames(i) = Sh.Name Then
IsSplitSheet = True
Exit For
End If
Next i
End Function
Private Function IsSplit(Sh As Object) As Boolean
Dim wn As Window
IsSplit = False
For Each wn In Me.wb.Windows
If wn.Caption Like Sh.Parent.Name & ":#" Then
IsSplit = True
Exit For
End If
Next wn
End Function
Private Sub CreateSplitSheets(Sh As Object)
Dim vaNames As Variant
Dim i As Long
Dim wn As Window
Dim wnActive As Window
vaNames = GetSplitSheetNames
Set wnActive = ActiveWindow
For i = LBound(vaNames) To UBound(vaNames)
If vaNames(i) <> Sh.Name Then
Set wn = Me.wb.NewWindow
wn.Activate
On Error Resume Next
wn.Parent.Sheets(vaNames(i)).Activate
On Error GoTo 0
End If
Next i
Sh.Parent.Windows.Arrange xlVertical
wnActive.Activate
Sh.Activate
End Sub
Private Function GetSplitSheetNames() As Variant
GetSplitSheetNames = Array("Notes", "Work Orders", "Contact Info")
End Function
然后插入一个标准模块(Insert - Module)并粘贴此代码
Option Explicit
Public gclsAppEvents As CAppEvents
Sub Auto_Open()
Set gclsAppEvents = New CAppEvents
Set gclsAppEvents.wb = ThisWorkbook
End Sub
这是发生的事情:当您打开工作簿时,Auto_Open 将运行,它会创建您的 CAppEvents 对象的新实例。由于 gclsAppEvents 是公共的(也称为全局),只要工作簿处于打开状态,它就不会失去作用域。它将坐在那里监听事件(因为我们在类中使用了 WithEvents 关键字)。
在类中有一个名为 mobjWb_SheetActivate 的子程序。每当激活此工作簿中的任何工作表时,都会触发此内容。首先,它检查您刚刚激活的工作表(Sh 变量)是否是您要拆分的工作表之一(使用 IsSplitSheet)。如果是,它会检查它是否已经被分割。如果没有,它会将它们分开。
如果 Sh(您刚刚激活的工作表)不是“拆分表”之一,则它会检查是否已完成拆分 (IsSplit)。如果有,它会关闭所有拆分窗口。
如果您甚至想要添加、更改或删除导致拆分的工作表,请转到 GetSplitSheetNames 函数并更改 Array 参数。
因为我们使用自定义类并在工作簿级别嗅探事件,所以您可以随心所欲地添加和删除工作表。