VBA Excel выберите и удалите все фигуры с тем же идентификатором и удалите

Я хочу удалить все фигуры со своего листа. У них одинаковые ID.

введите описание изображения здесь

Нашел два кода:

Первый:

Public Sub ActiveShapes()
    Dim ShpObject As Variant

    If TypeName(Application.Selection) = "Firestop" Then
        Set ShpObject = Application.Selection
        ShpObject.Delete
    Else
        Exit Sub
    End If
End Sub

не работает. Ошибок нет, но и реакции нет.

Второй: Выбор формы в Excel с помощью VBA

 Sub Firestopshapes()
     ActiveSheet.Shapes("Firestop").Delete
 End Sub

работает, но удаляет только один элемент за другим. В моем случае все элементы имеют идентификатор Firestop. Я хочу удалить их сразу все. Как я могу это сделать?


person MKR    schedule 27.02.2020    source источник


Ответы (2)


Проблема в том, что If TypeName(Application.Selection) = "Firestop" Then никогда не бывает правдой. Взгляните на TypeName функция не возвращает имя Application.Selection, а вместо этого возвращает тип Application.Selection. Здесь он, вероятно, возвращает Object, потому что фигура - это объект.

На самом деле имена уникальны. Вы не можете добавить 2 фигуры с одинаковым именем. Вот почему ActiveSheet.Shapes("Firestop").Delete удаляет только одну фигуру.

Кажется, есть ошибка, заключающаяся в том, что при копировании именованной фигуры существуют две фигуры с тем же именем (что не должно быть возможным). Вы можете обойти это, удалив эту фигуру в цикле, пока не получите сообщение об ошибке (не останется фигуры с таким именем).

On Error Resume Next
Do
    ActiveSheet.Shapes("Firestop").Delete
    If Err.Number <> 0 Then Exit Do
Loop
On Error GoTo 0 'don't forget this statement after the loop
person Pᴇʜ    schedule 27.02.2020
comment
Привет, Раньше я использовал: ActiveSheet.Range (D24) .PasteSpecial Selection.Name = Firestop, что сделало Firestop ID для всех из них. Вот почему у меня больше нет уникального идентификатора. - person MKR; 27.02.2020
comment
@MariuszKrukar да, эта ошибка до сих пор не исправлена. Взгляните на мой отредактированный ответ. Вы можете использовать этот обходной путь. - person Pᴇʜ; 27.02.2020

Не рекомендуется использовать On Error Resume Next часто. Мы рекомендуем использовать его только тогда, когда это необходимо.

Sub test()
    Dim shp As Shape
    Dim Ws As Worksheet

    Set Ws = ActiveSheet
    For Each shp In Ws.Shapes
        If shp.Name = "Firestop" Then
            shp.Delete
        End If
    Next shp
End Sub
person Dy.Lee    schedule 27.02.2020
comment
Хотя в целом вы правы, если существует больше фигур с другими именами, кроме Firestop, то подход On Error Resume Next все равно может быть быстрее. Зависит от соотношения Firestop vs other names. В любом случае вы получите мой голос. - person Pᴇʜ; 27.02.2020
comment
Посмотрите, я улучшил свой ответ, выбив On Error … за пределы цикла, поэтому мы используем его только один раз :) Теперь это определенно будет быстрее, чем цикл по всем фигурам. - person Pᴇʜ; 27.02.2020
comment
Ради удовольствия @ Pᴇʜ: Оба метода быстрые. Однако в моем тестировании метод Dy.Lees примерно на 1 микросекунду быстрее. : P Может отличаться по разным тестам. Я проверил оба кода на листе с 717 формами. где 229 формы имели то же имя. использовал ЭТО для измерения времени. Дайте мне знать, если вы оба получите разные результаты ... Кстати, проголосовали за оба ответа ... Хорошая работа! - person Siddharth Rout; 27.02.2020
comment
@SiddharthRout, Хорошая работа. - person Dy.Lee; 27.02.2020
comment
@SiddharthRout Из любопытства я провел несколько тестов: 1000 различных форм + 5 форм с именами AAA. Мой код 3,68E-02 dy.lee's 4,85E-02. В лучшем случае (1000 форм, AAA нет, поэтому удалять нечего) мне 5,91E-03 (примечание E-03) и dy.lee 4,51E-02. Худший случай (1000 фигур AAA, все удалить): me 0,65 и dy.lee 0,59. • Именно так я и догадался ^^. Если есть много уникальных форм и только несколько повторяющихся имен, мой будет немного быстрее (намного меньше, чем я на самом деле предполагал, я должен сказать). Dy.Lee работает быстрее, если есть много дубликатов и очень мало уникальных посетителей. На самом деле оба быстро мигают. - person Pᴇʜ; 27.02.2020
comment
хорошее тестирование @ Pᴇʜ :) - person Siddharth Rout; 27.02.2020