Очистить указанный диапазон содержимого и форм - PullRequest
0 голосов
/ 08 апреля 2020

Мне нужно удалить все содержимое из указанного диапазона ячеек c (Y1: CZ100) на рабочем листе (Рисование) и сбросить стили линий границ всех ячеек, закрасить цвет et c на ноль. Диапазон может иметь разное содержимое, но всегда будет заполняться различными групповыми объектами и автофигурами, а также текстом, объединенными ячейками и границами ячеек / цвет заливки и т. Д. c. Для этого я написал следующий макрос:

Option Explicit


Sub Remove_DOD()  'Remove Drive on Dock drawing, Product Count Table, reset formulae

Dim sh As Shape
Dim DrawRange As Range

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Remove DOD Drawing and Product Count table)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
With Worksheets("Drawing")

    Application.ScreenUpdating = False

    Set DrawRange = Range("Y1:CZ100")

    With DrawRange
        .UnMerge
        .Interior.Color = xlNone
        .Borders.LineStyle = xlNone
        .ClearContents
    End With

    For Each sh In .Shapes
        If Not Application.Intersect(sh.TopLeftCell, DrawRange) Is Nothing Then
            If sh.Type = msoGroup Or sh.Type = msoAutoShape Then sh.Delete
        End If
    Next sh

    Application.ScreenUpdating = True

End With

End Sub

Он работает большую часть времени, но иногда не работает с Run-time error '1004': Application-defined or object-defined error в операторе If Not Application.Intersect(sh.TopLeftCell, DrawRange) Is Nothing Then, и я не могу понять, что вызывает это , Когда ошибка все же возникает, команда With l oop to clearcontent, unmerge et c всегда завершается, но некоторые элементы группы все еще присутствуют в диапазоне, а в других случаях все они очищаются.

Любые сведения о решение будет приветствоваться.

Обновление:

Я попытался изменить метод выбора удаляемых фигур и остановил тестирование для типа формы (поскольку все в диапазоне должны быть удален). Это код, но иногда он все равно не работает с тем же Run-time error 1004 на s = .TopLeftCell.Address & ":" & .BottomRightCell.Address. Похоже, ошибка возникает только после того, как содержимое области рисования было заменено новыми фигурами, и макрос запускается снова. Иногда происходит ошибка сразу, и ни одна из новых фигур не удаляется, но это также может быть, когда и когда достигнут конец удаления всех этих новых фигур (т. Е. На последней итерации With sh). Я думаю, что ошибка в том, что значение sh недопустимо, но не понимаю, почему это происходит. Возможно, мне нужно вставить какой-нибудь способ проверки значения sh? Кроме того, я видел старые сообщения на других форумах со схожими проблемами, но решения никогда не предлагались.

Option Explicit


Sub Remove_DOD()  'Remove Drive on Dock drawing, Product Count Table, reset formulae

Dim sh As Shape
Dim S As String
Dim DrawRange As Range

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Remove DOD Drawing and Product Count table)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
With Worksheets("Drawing")

    Application.ScreenUpdating = False

    Set DrawRange = Range("Y1:CZ100")

    With DrawRange
        .UnMerge
        .Interior.Color = xlNone
        .Borders.LineStyle = xlNone
        .ClearContents
    End With

    For Each sh In .Shapes
        With sh
            s = .TopLeftCell.Address & ":" & .BottomRightCell.Address
        End With
        If Not Intersect(DrawRange, .Range(s)) Is Nothing Then
            sh.Delete
        End If
    Next

    Application.ScreenUpdating = True

End With

End Sub

Это не так в выражении Set shRange = Range(sh.TopLeftCell.Address & ":" & sh.BottomRightCell.Address):

Option Explicit


Sub Remove_DOD()  'Remove Drive on Dock drawing, Product Count Table, reset formulae

Dim sh As Shape
Dim s As String
Dim DrawRange, shRange As Range

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Remove DOD Drawing and Product Count table)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
With Worksheets("Drawing")

    Application.ScreenUpdating = False

    Set DrawRange = Range("Y1:CZ100")

    With DrawRange
        .UnMerge
        .Interior.Color = xlNone
        .Borders.LineStyle = xlNone
        .ClearContents
    End With

    For Each sh In .Shapes
        Set shRange = Range(sh.TopLeftCell.Address & ":" & sh.BottomRightCell.Address)
        If Not Intersect(shRange, DrawRange) Is Nothing Then sh.Delete
    Next

    Application.ScreenUpdating = True

End With

End Sub

Не очень удовлетворительно, но теперь работает следующее. Обратите внимание на включение On Error Resume Next в For Each sp l oop. Это вынуждает l oop выйти при возникновении ошибки.

Option Explicit


Sub Remove_DODTest()  'Remove Drive on Dock drawing, Product Count Table, reset formulae

Dim sh As Shape
Dim DrawRange As Range

With Worksheets("Drawing")

    Application.ScreenUpdating = False

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Remove DOD Drawing and Product Count table
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Set DrawRange = .Range("Y1:CZ100")

    With DrawRange
        .UnMerge
        .Interior.Color = xlNone
        .Borders.LineStyle = xlNone
        .ClearContents
    End With

    For Each sh In .Shapes
        On Error Resume Next
        If Not Application.Intersect(sh.TopLeftCell, DrawRange) Is Nothing Then sh.Delete
    Next sh

End With

Application.ScreenUpdating = True

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...