我正在寻找一个代码,以将最后添加的工作表的名称发送到Excel。
我已经尝试过了...
Sub test()
Dim lastAddedSheet As Worksheet
Dim oneSheet As Worksheet
With ThisWorkbook
Set lastAddedSheet = .Sheets(1)
For Each oneSheet In .Sheets
If Val(Mid(oneSheet.CodeName, 6)) > Val(Mid(lastAddedSheet.CodeName, 6)) Then
Set lastAddedSheet = oneSheet
End If
Next oneSheet
End With
MsgBox lastAddedSheet.Name & " was last added."
End Sub
但这并不能真正起作用。
答案 0 :(得分:4)
您无法可靠地知道最后添加的工作表,因为可以在工作簿中的任何现有工作表之前或之后插入工作表,请参见{{3} }。
除非您是添加它的人。在这种情况下,您要做的就是捕获Worksheet
方法返回的Add
对象:
Dim newSheet As Worksheet
Set newSheet = wb.Worksheets.Add
Debug.Print newSheet.Name
从CodeName
提取数字也不可靠-特别是如果您假设每张纸的代号以5个字母开头。在德国的机器上,我们看到的CodeName
中的Sheet1
将是Tabelle1
-但同样,该数字的作用是严格确保{{1 }}项目在VBA项目中,但没有一个项目与任何排序有关。
答案 1 :(得分:2)
按照@MathieuGuindon的回答,我想不出任何“简单”的方法来安全地返回最新添加的工作表的名称。但是,如果您愿意在项目中牺牲一些指定的空间来存储CodeNames
,则可以尝试利用Workbook_NewSheet
事件。
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim lr As Long
With Sheets("Blad1")
lr = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
.Cells(lr, 1) = ActiveSheet.CodeName
End With
End Sub
显然,您需要对其进行优化以在运行时添加表时添加名称。在这个简化的示例中,我手动添加了现有的工作表“ Blad1”,并且在添加新工作表后,列表也随之增加。
删除时,您可以利用SheetBeforeDelete
事件,如下所示:
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
Dim ws As Object
Dim lr As Long, x As Long
Dim rng1 As Range, rng2 As Range, cl As Range
With Sheets("Blad1")
lr = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
Set rng1 = .Range("A2:A" & lr)
For Each ws In ActiveWindow.SelectedSheets
For Each cl In rng1
If cl = ws.CodeName Then
If Not rng2 Is Nothing Then
Set rng2 = Union(rng2, cl)
Else
Set rng2 = cl
End If
End If
Next cl
Next ws
End With
If Not rng2 Is Nothing Then
rng2.Delete
End If
End Sub
现在要获取最新添加的工作表,我们可以引用指定范围内的最后一个单元格:
Sub LastAdded()
Dim lr As Long
With ThisWorkbook.Sheets("Blad1")
lr = .Cells(.Rows.Count, "A").End(xlUp).Row
Debug.Print "Last added sheet is codenamed: " & .Cells(lr, 1)
End With
End Sub
我认为使用CodeName
是最安全的,因为它们最不可能被更改并且是唯一的。我们还可以安全地继续使用rng
变量,因为您的项目中始终至少有一个工作表(如果您保护它,它可能就是指定的工作表)。现在,从事该项目的工作将跟踪最新添加的工作表。
答案 2 :(得分:0)
Sheets
可以是Chart
或Worksheet
。
您可以尝试在代码中使用Worksheets
代替Sheets
。
sub test()
Dim lastAddedSheet As Worksheet
Dim oneSheet As Worksheet
With ThisWorkbook
Set lastAddedSheet = .WorkSheets(1)
For Each oneSheet In .WorkSheets
If Val(Mid(oneSheet.CodeName, 6)) > Val(Mid(lastAddedSheet.CodeName, 6)) Then
Set lastAddedSheet = oneSheet
End If
Next oneSheet
End With
MsgBox lastAddedSheet.Name & " was last added."
End Sub