Excel VBA-获取上次添加的图纸的名称

Excel VBA-获取上次添加的图纸的名称,excel,vba,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(las

我正在寻找一个代码来获取最后添加到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
但它实际上不起作用。

您无法可靠地知道上次添加的工作表,因为工作表可以插入工作簿中任何现有工作表之前或之后,请参阅

除非是你加的。在这种情况下,只需捕获Add方法返回的工作表对象:

从代码名中提取数字也不可靠——特别是假设每张工作表的代码名都以5个字母开头。在一台德国机器上,我们看到的Sheet1的代码名是Tabelle1,但该数字的作用是严格确保VBA项目中VBComponent项目名称的唯一性,并且没有一个表示它与任何形式的订购有任何关系。

您无法可靠地知道最后添加的是哪张表,由于工作表可以插入工作簿中任何现有工作表之前或之后,请参见

除非是你加的。在这种情况下,只需捕获Add方法返回的工作表对象:

从代码名中提取数字也不可靠——特别是假设每张工作表的代码名都以5个字母开头。在德国机器上,我们所看到的Sheet1的代码名是Tabelle1,但同样,该数字的作用是严格确保VBA项目中VBComponent项名称的唯一性,并且没有一个表示它与任何排序有关。

工作表可以是图表或工作表。 您可以尝试在代码中使用工作表而不是工作表

子测试 将最后添加的工作表设置为工作表 将一张工作表设置为工作表 使用此工作簿 设置lastAddedSheet=.WorkSheets1 对于.工作表中的每个工作表 如果ValMidoneSheet.CodeName,6>ValMidlastAddedSheet.CodeName,则6 设置lastAddedSheet=oneSheet 如果结束 下一页 以 MsgBox lastAddedSheet.Name&上次添加。 端接头 工作表可以是图表或工作表。 您可以尝试在代码中使用工作表而不是工作表

子测试 将最后添加的工作表设置为工作表 将一张工作表设置为工作表 使用此工作簿 设置lastAddedSheet=.WorkSheets1 对于.工作表中的每个工作表 如果ValMidoneSheet.CodeName,6>ValMidlastAddedSheet.CodeName,则6 设置lastAddedSheet=oneSheet 如果结束 下一页 以 MsgBox lastAddedSheet.Name&上次添加。 端接头
根据@MathieuGuindon的回答,我想不出任何简单的方法来安全地返回最新添加的工作表的名称。但是,如果您愿意牺牲项目中的一些指定空间来存储代码名,您可以尝试利用工作簿\新闻纸事件

显然,您需要对此进行优化,以便在运行时添加图纸时添加名称。在这个简化的示例中,我手动添加了现有的工作表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

我的看法是,使用代码名是最安全的,因为它们最不可能被更改,而且是唯一的。我们还可以安全地继续使用rng变量,因为在您的项目中始终至少有一个工作表,如果您保护它,它可能就是指定的工作表。在这个项目中工作现在将跟踪最新添加的工作表。

根据@MathieuGuindon的回答,我想不出任何简单的方法来安全地返回最新添加的工作表的名称。但是,如果您愿意牺牲项目中的一些指定空间来存储代码名,您可以尝试利用工作簿\新闻纸事件

显然,您需要对此进行优化,以便在运行时添加图纸时添加名称。在这个简化的示例中,我手动添加了现有的工作表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

我的看法是,使用代码名是最安全的,因为它们最不可能被更改,而且是唯一的。我们还可以安全地继续使用rng变量,因为在您的项目中始终至少有一个工作表,如果您保护它,它可能就是指定的工作表。在这个项目中工作,现在将跟踪最新添加的工作表。

什么工作表不起作用?你能更详细地描述一下这个问题吗?我不确定有没有可靠的方法来做你想做的事情。有代码名和索引,它们都不是基于创建日期或时间的顺序。此外,工作表和代码名的名称不保证递增。我可以打开一个新工作簿,创建两个
额外选项卡sheet2和sheet3、删除sheet1、添加新工作表sheet4保存并重新打开工作簿、添加新工作表sheet1,现在sheet1是上次添加的,并在4张工作表的索引中显示在第3位。它的代码名和索引都没有可识别的顺序。请保留工作簿的一部分,以便在工作簿\新闻纸事件时存储工作表代码名。它没有提供正确的答案。什么不起作用?你能更详细地描述一下这个问题吗?我不确定有没有可靠的方法来做你想做的事情。有代码名和索引,它们都不是基于创建日期或时间的顺序。此外,工作表和代码名的名称不保证递增。我可以打开一个新工作簿,创建两个额外的选项卡sheet2和sheet3,删除sheet1,添加一个新的工作表sheet4保存并重新打开工作簿,添加一个新的工作表sheet1,现在sheet1是最后添加的,并在4张工作表的索引中显示在第3位。它的代码名和索引都没有可识别的顺序。保留工作簿的一部分,以便在工作簿\新闻纸事件时存储工作表代码名。它没有提供正确的答案。此外,关于代码名问题的更多信息是工作簿,一旦关闭并重新打开,将从可用的最低代码名开始,这就是为什么我们从未在大量使用的工作簿中看到Sheet512381。此外,关于代码名问题,工作簿,一旦关闭并重新打开,将从最低的可用代码名开始,这就是为什么我们从未在大量使用的工作簿中看到Sheet512381。当您打算迭代工作表时,迭代工作表是一个很好的建议,在这种特殊情况下,这没有什么区别,因为图表表也有代码名。这也不起作用。不过,谢谢你的建议。当你打算迭代工作表时,迭代工作表是一个很好的建议,在这种特殊情况下,这没有什么区别,因为图表表也有一个代码名。这也不起作用。不过,谢谢你的建议。让我们。让我们。