Selection.EntireRow.Delete в нескольких столбцах - PullRequest
0 голосов
/ 03 декабря 2018

Предыстория: Поэтому мне понадобился макрос для удаления всех выбранных строк в шаблоне.После нескольких итераций Selection.EntireRow.Delete, казалось, был лучшим выбором для этого.

Кажется, что он обрабатывает все мои сценарии, кроме одного (этого не должно быть в любом случае). Поэтому, когда я выбираю ту же строку,при множественном выборе Selection.EntireRow.Delete выдаст мне ошибку 1004.

Я написал ErrorHandler, чтобы предупредить о ситуации, а затем возобновить, чтобы не оставлять шаблон разблокированным.

Sub DelRows()

Dim answer As VbMsgBoxResult, LRow As Integer
LRow = Range("D5").Value

If Selection.Cells(1, 1).Row < 9 Or Selection.Cells(1, 1).Row + Selection.Rows.Count > LRow - 1 Then                                            
    MsgBox "Forbidden selection."
ElseIf Selection.Rows.Count > LRow - 11 Then                                                                                                    
    MsgBox "Can't delete all rows."
Else
    On Error GoTo ErrHandler
    ActiveSheet.Unprotect Password:="xx"
    answer = MsgBox("Are you sure you want to delete all rows?", vbOKCancel + vbExclamation, "Warning")
    If answer = 1 Then Selection.EntireRow.Delete                        
    Rows((LRow + 2) & ":1048576").EntireRow.Hidden = True                               
    ActiveSheet.Protect Password:="xx", DrawingObjects:=False, Contents:=True, Scenarios:=True, AllowFormattingCells:=True, AllowFormattingRows:=True, AllowFiltering:=True

End If
Exit Sub

ErrHandler:
    If Err.Number = 1004 Then
        MsgBox "Can't select the same row twice: " & Err.Description
        Resume Next
    Else
        MsgBox Err.Description
        Resume Next
End If
End Sub

Все работает нормально, но мой опыт работы с ошибками неЭто не самое лучшее, поэтому любые указания на то, что я делаю неправильно, очень ценятся.

Вопрос: можно ли полностью избежать этой ошибки каким-либо методом?Могу ли я проверить выбор для нескольких выборок в одной строке, или это не стоит усилий?

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

- Окончательное решение - Я надеюсь, что этот вид редактирования в порядке

Благодаря Pᴇʜ мне удалось не только решить проблему, но и найти и решить еще две одновременно.

Множественный выбор сломал мои Selection.Cells(1, 1).Row и Selection.Rows.Count, так как они заботятся толькоо первой области.И то, и другое можно исправить, зациклив областиТеперь код выглядит так:

Dim answer As VbMsgBoxResult, LRow As Long, i As Long, RowCount As Long, TopRow As Long
LRow = Range("D5").Value
TopRow = Selection.Cells(1, 1).Row

For i = 1 To Selection.Areas.Count
    RowCount = RowCount + Selection.Areas(i).Rows.Count
    If Selection.Areas(i).Cells(1, 1).Row < TopRow Then TopRow = Selection.Areas(i).Cells(1, 1).Row
Next i

If TopRow < 9 Or TopRow + RowCount > LRow - 1 Then                                         
    MsgBox "Forbidden selection."
ElseIf RowCount > LRow - 11 Then                                                                                                    
    MsgBox "Can't delete all rows."
Else
    ActiveSheet.Unprotect Password:="xx"
    answer = MsgBox("Are you sure you want to delete all rows?", vbOKCancel + vbExclamation, "Warning")
    If answer = 1 Then Selection.EntireRow.Delete                        
    Rows((LRow + 2) & ":1048576").EntireRow.Hidden = True                               
    ActiveSheet.Protect Password:="xx", DrawingObjects:=False, Contents:=True, Scenarios:=True, AllowFormattingCells:=True, AllowFormattingRows:=True, AllowFiltering:=True

End If
End sub

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете сделать трюк и использовать метод Application.Union

Union(Selection.EntireRow, Selection).delete

Это позволяет избежать ошибки множественного выбора в одной строке.


Редактировать по комментариям:

Dim i As Long, RowCount As Long
For i = 1 To Selection.Areas.Count
    RowCount = RowCount + Selection.Areas(i).Rows.Count
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...