如果我打开Excel工作簿,然后手动删除“Sheet2”和“Sheet3”,当我下次单击“插入工作表”按钮时,它会将新工作表命名为“Sheet4”。
但是,删除“Sheet2”和“Sheet3”后,如果我保存并重新打开工作簿,当我下次单击“插入工作表”按钮时,它会将新工作表命名为“Sheet2”。
因此,Excel会在某处存储“最高工作表编号”变量,并在工作表关闭时重置。我想用VBA重置它。
非常感谢和祝福。
答案 0 :(得分:4)
不,没有保存,关闭和重新打开工作簿,没有办法“自然地”执行此操作。 sheet.count属性确实是只读的。
但你可以用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等)。这还具有重置计数的额外好处,因此下一张新工作表将按顺序继续。