将ActiveWindow.SelectedSheets存储为稍后参考的对象

我正在尝试编写一个macros,它将创build一个目录,列出当前用户select的每个工作表的名称,以及打印时从其开始的页码。 我已经从这个页面的代码,并适应了一下,如下所示。

但是,当创build新的工作表(“内容”)时,该工作表将成为活动的选定工作表,这样我就不能再使用ActiveWindow.SelectedSheets重新引用用户select的工作表集合。 所以我想在创build新表之前存储这些信息。 我怎样才能做到这一点?

我已经尝试将它分配给一个types为Worksheets的variables,如你所见,但是这会产生一个错误信息。 (我也尝试Collection但无济于事。)

 Sub CreateTableOfContents() ' Determine if there is already a Table of Contents ' Assume it is there, and if it is not, it will raise an error ' if the Err system variable is > 0, you know the sheet is not there Dim WST As Worksheet Dim SelSheets As Worksheets Set SelSheets = ActiveWindow.SelectedSheets On Error Resume Next Set WST = Worksheets("Contents") If Not Err = 0 Then ' The Table of contents doesn't exist. Add it Set WST = Worksheets.Add(Before:=Worksheets("blankMagnitude")) WST.Name = "Contents" End If On Error GoTo 0 ' Set up the table of contents page WST.[A2] = "Table of Contents" With WST.[A6] .CurrentRegion.Clear .Value = "Subject" End With WST.[B6] = "Page(s)" WST.Range("A1:B1").ColumnWidth = Array(36, 12) TOCRow = 7 PageCount = 0 ' Do a print preview on all sheets so Excel calcs page breaks ' The user must manually close the PrintPreview window Msg = "Excel needs to do a print preview to calculate the number of pages." & vbCrLf & "Please dismiss the print preview by clicking close." MsgBox Msg SelSheets.PrintPreview ' Loop through each sheet, collecting TOC information For Each S In SelSheets If S.Visible = -1 Then S.Select ThisName = ActiveSheet.Name HPages = ActiveSheet.HPageBreaks.Count + 1 VPages = ActiveSheet.VPageBreaks.Count + 1 ThisPages = HPages * VPages ' Enter info about this sheet on TOC WST.Select Range("A" & TOCRow).Value = ThisName Range("B" & TOCRow).NumberFormat = "@" If ThisPages = 1 Then Range("B" & TOCRow).Value = PageCount + 1 & " " Else Range("B" & TOCRow).Value = PageCount + 1 & " " ' & - " & PageCount + ThisPages End If PageCount = PageCount + ThisPages TOCRow = TOCRow + 1 End If Next S End Sub 

我只是修改你的代码。 这是你正在尝试? 老实说,你所要做的只是

更改Dim SelSheets As Worksheets Dim SelSheets和您的原代码将工作:)

 Option Explicit Sub CreateTableOfContents() Dim WST As Worksheet, S As Worksheet Dim SelSheets Dim msg As String Dim TOCRow As Long, PageCount As Long, ThisPages As Long Dim HPages As Long, VPages As Long Set SelSheets = ActiveWindow.SelectedSheets On Error Resume Next Application.DisplayAlerts = False Worksheets("Contents").Delete Application.DisplayAlerts = True On Error GoTo 0 Set WST = Worksheets.Add(Before:=Worksheets("blankMagnitude")) With WST .Name = "Contents" .[A2] = "Table of Contents" .[A6] = "Subject" .[B6] = "Page(s)" .Range("A1:B1").ColumnWidth = Array(36, 12) End With TOCRow = 7: PageCount = 0 msg = "Excel needs to do a print preview to calculate the number of pages." & vbCrLf & "Please dismiss the print preview by clicking close." MsgBox msg SelSheets.PrintPreview For Each S In SelSheets With S HPages = .HPageBreaks.Count + 1 VPages = .VPageBreaks.Count + 1 ThisPages = HPages * VPages WST.Range("A" & TOCRow).Value = .Name WST.Range("B" & TOCRow).NumberFormat = "@" If ThisPages = 1 Then WST.Range("B" & TOCRow).Value = PageCount + 1 & " " Else WST.Range("B" & TOCRow).Value = PageCount + 1 & " " ' & - " & PageCount + ThisPages End If PageCount = PageCount + ThisPages TOCRow = TOCRow + 1 End With Next S End Sub 

编辑 :一件重要的事情。 它总是很好使用OPTION EXPLICIT 🙂

您可以存储对每张纸的参考;

 function getSheetsSnapshot() as Worksheet() dim shts() As Worksheet, i As long redim shts(ActiveWindow.SelectedSheets.Count - 1) for i = 0 to ActiveWindow.SelectedSheets.Count - 1 set shts(i) = ActiveWindow.SelectedSheets(i + 1) next getSheetsSnapshot = shts end function 

取出并存储它们:

 dim oldsel() as Worksheet: oldsel = getSheetsSnapshot() 

做你的东西,然后回到原来选定的工作表;

 for i = 0 to ubound(oldsel) msgbox oldsel(i).name next 
 Dim wks as Worksheet, strName as String For each wks in SelSheets strName = strName & wks.Name & "," Next strName = Left(strName, Len(strName) -1) Dim arrWks() as String arrWks = Split(strName,",") End Sub 

你将会把所有选定的表格,按名称,在一个arrwks,然后你可以通过处理。 您也可以将每个图纸名称添加到一个集合中,并在循环中使其更平滑。

尽可能远离ActiveSheet是最好的。 用这种方法,你可以用一个计数器和进程来遍历数组

所以:

 Dim intCnt as Ingeter For intCnt = Lbound(arrWks) to UBound(arrWks) Worksheets(arrWks(intCnt)).Activate .... rest of code .... Next 

取代

 For Each S In SelSheets