Excel VBA-获取上次添加的图纸的名称
我正在寻找一个代码来获取最后添加到Excel的工作表的名称 我试过这个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
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。当您打算迭代工作表时,迭代工作表是一个很好的建议,在这种特殊情况下,这没有什么区别,因为图表表也有代码名。这也不起作用。不过,谢谢你的建议。当你打算迭代工作表时,迭代工作表是一个很好的建议,在这种特殊情况下,这没有什么区别,因为图表表也有一个代码名。这也不起作用。不过,谢谢你的建议。让我们。让我们。