使用VBA从Excel工作表中删除形状

relj7zay  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(269)

我正在编写一系列宏,以便在分发每周版本的文件之前清理工作表。
任务之一是移除宏的所有控件对象。
我已经列出了具体的对象,以消除每个表,所以有一个像下面的少数行。

Sheets("Open SO").Shapes.Range(Array("Button 6", "Button 7", "Button 11", "Button 12")).Delete

但是它给了我一个错误,我不知道为什么。运行时错误是1004,消息(粗略翻译)“指定的对象找不到”。
工作表存在(我尝试了“Sheets”和“Worksheets”,但是因为我命名了工作表,所以应该没有区别)。按钮名称确实存在。
我从“开发人员”菜单手动运行宏,它位于同一工作簿的模块中。
语法错误吗?
编辑
看起来对象名称发生了变化,但变化是在语言上。
在第一张工作表中,我录制了一个宏,以获取表单中的按钮名称,使它们易于复制和粘贴。第一次录制宏时,它给了我以下代码:

ActiveSheet.Shapes.Range(Array("Button 12", "Button 11", "Button 6", "Button 7")). _
Select
Selection.Delete

当我今天通过记录宏再次检查时,代码是:

ActiveSheet.Shapes.Range(Array("ボタン 12", "ボタン 11", "ボタン 6", "ボタン 7")). _
  Select
  Selection.Delete

编辑文件的电脑有日文版Windows和日文版Office,但由于通常都是英语,所以我没有考虑最初的标签是英文。最初代码确实工作,但在整理到一行后就停止工作了。
如果我更改原始代码行以包含日语标签,它确实可以工作。
我现在有一个相关但不同的问题(也许我应该开始一个新的线程)。两个人需要使用这些宏。我们中的一个使用日语,另一个使用英语。日语宏在我的机器上工作。日语宏和英语宏在另一个运行英语Windows和Office的机器上都不工作(第二个机器上的按钮名称仍为日语)。
我在另一台计算机上遇到了同样的问题。

tp5buhyn

tp5buhyn1#

按钮之谜

  • 当您开始添加按钮时,它们的名称和文本是相同的,例如Button 1Button 2 ...等。
  • 一旦你开始删除和重命名它们并添加新的,它们的文本和名称可能(将)最终会不同。
  • 使用以下工具了解您的特定案例中发生了什么。希望您提供反馈,例如 "我的Button 6奇迹般地变成了Button 13,而其文本仍然是Button 6 ..."
Sub DeMystifyButtons()
    
    Dim ButtonNames()
    ButtonNames = Array("Button 6", "Button 7", "Button 11", "Button 12")
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Open SO")
    
    Dim btn As Button, i As Long, IsFound As Boolean
    
    Debug.Print "Index", "Name", "Text", "Is Found"
    
    For Each btn In ws.Buttons
        IsFound = IsNumeric(Application.Match(btn.Name, ButtonNames, 0))
        Debug.Print btn.Index, btn.Name, btn.Text, IsFound
    Next btn
    
End Sub
    • 附加内容:列表**
Sub ListAllButtons(ByVal ws As Worksheet)
    If ws.Buttons.Count = 0 Then Exit Sub
    Debug.Print "Index", "Name", "Text"
    Dim btn As Button
    For Each btn In ws.Buttons
        Debug.Print btn.Index, btn.Name, btn.Text
    Next btn
End Sub
    • 附加内容:删除**
Sub DeleteAllButtons(ByVal ws As Worksheet)
    ws.Buttons.Delete
End Sub
    • 附加项:用法**
Sub Test()

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Open SO")

    ListAllButtons ws
    'DeleteAllButtons ws
     
End Sub
    • 编辑**
Sub DeleteByID()

    Dim ButtonIDs(): ButtonIDs = Array("6", "7", "11", "12")

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Sheets("Open SO")

    DeleteButtonsByID ws, ButtonIDs
     
End Sub

Sub DeleteButtonsByID(ByVal ws As Worksheet, ByVal ButtonIDs As Variant)
    Dim btn As Button
    For Each btn In ws.Buttons
        If IsNumeric(Application.Match(Trim(Right(btn.Name, 2)), ButtonIDs, 0)) _
            Then btn.Delete
    Next btn
End Sub
elcex8rz

elcex8rz2#

命令的语法正确。该错误表示(至少)其中一个形状不存在。可能是名称中有打字错误,或者该形状已被删除。
例如,尝试下面的例程,它将删除您指定的所有形状,但如果一个形状不存在(或由于其他原因无法删除),它将只把形状名称写入即时窗口并继续工作。

Sub DeleteShapes(ws As Worksheet, shapeNames)
    Dim shapeName
    For Each shapeName In shapeNames
        On Error Resume Next
        ws.shapes(shapeName).Delete
        If Err.Number <> 0 Then
            Debug.Print "Error when deleting shape '" & shapeName & "': " & Err.Number & " " & Err.Description
        End If
        On Error GoTo 0
    Next
End Sub

例如,您可以使用

DeleteShapes ThisWorkbook.Sheets("Open SO"), _
                Array("Button 6", "Button 7", "Button 11", "Button 12")

相关问题