VBA-获取上次添加的工作表的名称

时间:2019-09-18 15:10:11

标签: excel vba

我正在寻找一个代码,以将最后添加的工作表的名称发送到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

但这并不能真正起作用。

3 个答案:

答案 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事件。

enter image description here

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

enter image description here

现在要获取最新添加的工作表,我们可以引用指定范围内的最后一个单元格:

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可以是ChartWorksheet。 您可以尝试在代码中使用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