如何在Excel中重置工作表命名

时间:2014-10-24 22:00:32

标签: excel vba

如果我打开Excel工作簿,然后手动删除“Sheet2”和“Sheet3”,当我下次单击“插入工作表”按钮时,它会将新工作表命名为“Sheet4”。

但是,删除“Sheet2”和“Sheet3”后,如果我保存并重新打开工作簿,当我下次单击“插入工作表”按钮时,它会将新工作表命名为“Sheet2”。

因此,Excel会在某处存储“最高工作表编号”变量,并在工作表关闭时重置。我想用VBA重置它。

非常感谢和祝福。

4 个答案:

答案 0 :(得分:4)

不,没有保存,关闭和重新打开工作簿,没有办法“自然地”执行此操作。 sheet.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

答案 1 :(得分:2)

嗯,你可以尝试入侵它,我正在查看内存,看起来有两个整数可以保持工作表的数量。但是如果你删除了一些工作表,那么计数也会减少,所以你可能需要扩大你的搜索范围以找到你正在寻找的那个

一旦找到正确的内存地址,请尝试将其归零(它可能是4个字节,但我会尝试将重要的字节归零)。

这是我用来查看内存的函数(它获取了worksheets.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

答案 2 :(得分:0)

这将更改工作表编号并保留名称

    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

答案 3 :(得分:-1)

我参加聚会很晚,但是我今天才研究这个问题,找到了另一种解决方案。

如果打开Visual Basic窗口并在“图纸属性”部分中对其进行更改,则可以手动更改图纸编号(Sheet1,Sheet2等)。这还具有重置计数的额外好处,因此下一张新工作表将按顺序继续。

image of properties window