在Excel中引用最近添加的工作表

单击指令工作表上的button时,我的macros将运行。 它设置为在必须作为工作表从另一个工作簿添加到工作簿的数据上运行。

但是,我不确定一旦添加了工作表名称。 有没有办法使我的macros在最近添加的工作表上运行而不是查找特定的工作表名称?

我设想最终用户右键单击工作表选项卡并复制整个工作表。在这种情况下,名称将是Sheet1。 但是,他们可能会创build一个名称我不知道的新选项卡,并从数据工作表中复制并粘贴到此新选项卡中。

我的macros当前激活Sheet1,然后在此工作表上运行macros。 但是,用户可能会创build名为Sheet2或Data等的新工作表。在这种情况下,macros将找不到Sheet1。

macros是否有办法find最新的工作表而不是查找工作表名称?

Dim datasheet As String, location As String, col As String, row As String Dim i As Integer, LastRow As Integer, LastCol As Integer, lCol As Integer Dim t As Long, LasRow As Long, LasCol As Long Dim t As Long, LasRow As Long, LasCol As Long Dim PSheet As Worksheet, DSheet As Worksheet Dim PCache As PivotCache Dim PTable As PivotTable Dim PRange As Range ' Don't show macro as the macro runs Application.ScreenUpdating = False Worksheets("Sheet1").Activate datasheet = ActiveSheet.Name 'Moves active sheet to end of active workbook. ActiveSheet.Move _ After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count) 

假设您不更改各种工作表的代号 ,最后添加的工作表应该具有最高的数字代号,即使其他工作表已被删除。

 dim w as long, lw as long, wsn as string for w = 1 to worksheets.count if clng(replace(worksheets(w).codename, "Sheet", vbnullstring)) > lw then lw = int(replace(worksheets(w).codename, "Sheet", vbnullstring)) wsn = worksheets(w).name end if next w with worksheets(wsn) 'do stuff with the last added worksheet end with 

如果工作表可以被删除,那么在closures并重新打开工作簿之后,您可能要仔细检查代码名序列是否不重新启动。 附录:是的,如果工作簿已closures并重新打开,则删除的工作表的代号将被重新使用。

此方法应忽略最新的工作表已复制到工作表队列中的位置。

在ThisWorkbook模块中,添加:

 Public sheetName As String Private Sub Workbook_NewSheet(ByVal Sh As Object) sheetName = ActiveSheet.Name End Sub 

然后在代码中查找sheetName

 Worksheets(sheetName).Activate 

@cyboashu是正确的,这是从另一个工作簿复制工作表时不起作用。

您可以尝试此操作,它将在打开工作簿时首先用工作表的名称填充数组。 然后,当您运行macros时,它会查找该数组中的每个sheetName,如果未find,则在打开文件后添加该工作表。 将其插入工作簿模块中:

 Public arrBase Private Sub Workbook_Open() Dim i As Integer ReDim arrBase(1 To Sheets.Count) For i = 1 To Sheets.Count arrBase(i) = ThisWorkbook.Sheets(i).Name Next End Sub Sub ActivateNewSheet() Dim i As Integer Dim found As Boolean For i = 1 To Sheets.Count found = Not IsInArray(Sheets(i).Name, arrBase) If found Then Sheets(i).Activate: Exit For Next End Sub Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) End Function