Предыстория: Поэтому мне понадобился макрос для удаления всех выбранных строк в шаблоне.После нескольких итераций 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