如何重置Excel中的表格命名

如果我打开一个Excel工作簿,然后手动删除“Sheet2”和“Sheet3”,当我下一次点击“插入工作表”button时,它将命名新的工作表“Sheet4”。

但是,在删除“Sheet2”和“Sheet3”之后,如果我保存并重新打开工作簿,当我下一次点击“插入工作表”button时,它将命名新的工作表“Sheet2”。

所以,Excel正在存储一个“最高的纸张编号”variables,并在工作表closures时重置。 我想用VBA重置这个。

非常感谢和最好的祝愿。

那么你可以尝试黑客攻击,我正在检查内存,看起来有两个整数,保持工作表的数量。 但是,如果您删除一些工作表,计数也会减less,所以您可能需要扩大search范围以find所需的工作表

一旦你find了正确的内存地址,试着将其归零(可能是4字节,但是我会尽量把重要的字节归零)。

下面是我用来查看内存的函数(它获取工作表.Count的内存地址之后的前100个字节,然后添加一个表,并再次获取100个字节)

Option Explicit Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Sub test2() 'void ZeroMemory( ' [in] PVOID Destination, ' [in] SIZE_T Length '); 'void CopyMemory( ' _In_ PVOID Destination, ' _In_ const VOID *Source, ' _In_ SIZE_T Length '); Dim b(0 To 99) As Byte Call CopyMemory(b(0), VarPtr(ActiveWorkbook.Worksheets.Count), 100) Dim output Dim i For Each i In b output = output & " " & Hex(i) Next i ActiveWorkbook.Worksheets.Add output = output & vbNewLine output = output & vbNewLine DoEvents Call CopyMemory(b(0), VarPtr(ActiveWorkbook.Worksheets.Count), 100) For Each i In b output = output & " " & Hex(i) Next i MsgBox output End Sub 

不,没有办法“自然地”这样做,没有保存,closures和重新打开工作簿。 sheets.count属性的确是只读的。

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.sheets.count(v=office.15).aspx

但是你可以用vba改名字,正如你显然知道的那样。 我同意这并不令人满意。

补充/更正 :在Excel中,图纸对象有两个不同的“名称”属性:sheet.Name和sheet.CodeName。 Name属性是可读/写的(即可以读取,很好,但也可以更改),并包含您看到的名称,该名称出现在Excel的工作表选项卡上。 CodeName属性是只读的。参见:

http://msdn.microsoft.com/en-us/library/office/ff837552(v=office.15).aspx

这将改变图纸编号,并保留名字

  Sub BatchChange_WSRefName() ' THIS IS MAINTENANCE CODE ONLY RUN MANUALLY ' Changes the Reference Names for all Worksheets ' in the active Workbook to Sheet + incrementing integer Dim i As Integer, ws As Worksheet i = 0 ' Change to Temp first to prevent Naming errors For Each ws In ActiveWorkbook.Worksheets i = i + 1 On Error Resume Next ws.Parent.VBProject.VBComponents(ws.CodeName).Properties("_CodeName") = _ "Temp" & i On Error GoTo 0 Next ws ' Change to Sheet + incrementing integer i = 0 For Each ws In ActiveWorkbook.Worksheets i = i + 1 On Error Resume Next ws.Parent.VBProject.VBComponents(ws.CodeName).Properties("_CodeName") = _ "Sheet" & i On Error GoTo 0 Next ws Set ws = Nothing End Sub