2014-12-09 19 views
0

Я пишу проблему VBA, которая находит строки, которые считаются недействительными, сохраняет номер строки в массиве с именем invalidRowsToDelete и удаляет выбранные строки, создавая строка недопустимых строк (например, 1:1, 4:4, 7:7).Выбор диапазона ячеек вызывает ошибку времени выполнения '1004'

Однако он иногда работает, иногда это не так, но с большей вероятностью не работает с большим количеством недопустимых строк.

Ошибка возвращается в: «Ошибка выполнения„1004“: Диапазон Метод объекта" _global»Ошибка на линии Set rng = Range(invalidRowsToDelete)

Public rng As Range 
__________________________ 


Dim invalidRowsToDelete As String 
Dim i As Long 

For i = LBound(InvalidFilesArr) To UBound(InvalidFilesArr) 

    If InvalidFilesArr(i) <> "" Then 
     invalidRowsToDelete = invalidRowsToDelete & InvalidFilesArr(i) & ":" & InvalidFilesArr(i) &  "," 
    Else 
     Exit For 
    End If 
Next i 

'Build range statement and delete trailing comma from rowsToDeleteStatement 
invalidRowsToDelete = "" & Left(invalidRowsToDelete, Len(invalidRowsToDelete) - 1) & "" 
Debug.Print invalidRowsToDelete 

Worksheets("Sheet1").Activate 

Set rng = Range(invalidRowsToDelete) #### Problem line 

rng.Select 
rng.Delete 

Это было у меня довольно долгое время, и я не может решить причину его возникновения этой ошибки.

Благодаря

+1

Мое предположение, хотя я не могу найти что-либо для его поддержки, заключается в том, что ваша строка слишком длинная и переполняет метод «range». – Degustaf

+0

Предел, кажется, 255. –

ответ

2

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

Public rng As Range 
__________________________ 


Dim invalidRowsToDelete As String 
Dim i As Long 

i = LBound(InvalidFilesArr) 
Set rng = Worksheets("Sheet1").Rows(InvalidFilesArr(i)) 

For i = LBound(InvalidFilesArr) + 1 To UBound(InvalidFilesArr) 
    If InvalidFilesArr(i) = "" Then 
     Exit For 
    End If 
    Set rng = Union(rng, Worksheets("Sheet1").Rows(InvalidFilesArr(i))) 
Next i 

rng.Delete 
0

Почему не просто удалять строки там и тогда, когда вы их найдете?

Public rng As Range 

Dim invalidRowsToDelete As String 
Dim i As Long 

Worksheets("Sheet1").Activate 
For i = LBound(InvalidFilesArr) To UBound(InvalidFilesArr) 
    If InvalidFilesArr(i) <> "" Then 
     Set rng = Range(InvalidFilesArr(i) & ":" & InvalidFilesArr(i)) 
     rng.Select 
     rng.Delete 
    Else 
     Exit For 
    End If 
Next i 
+2

Вам нужно быть осторожным, делая это так. После удаления строки 5, то, что было в строке 10, теперь является строкой 9. Как написано, вы удалите неправильные строки. – Degustaf

+0

Это будет отлично работать, если вы измените 'For i = LBound (InvalidFilesArr) на UBound (InvalidFilesArr)' на 'для i = UBound (InvalidFilesArr) на LBound (InvalidFilesArr) Шаг -1'. – TheEngineer

0

Ваша строка "bad"; выяснить, почему заменить:

Set rng = Range(invalidRowsToDelete) 

с:

On Error GoTo GhostBusters 
Set Rng = Range(invalidRowsToDelete) 

и в нижней части переводника включают в себя:

GhostBusters: 
MsgBox Len(invalidRowsToDelete) 
MsgBox invalidRowsToDelete 
On Error GoTo 0 
0

Используйте Union, чтобы получить диапазон, который будет удален, а затем позвоните по телефону Delete. HTH

Dim rngToDelete As Range 
Dim rngRow As Range 
Dim rowsToDelete(0 To 5) As Long 
Dim i As Long 

rowsToDelete(0) = 2 
rowsToDelete(1) = 5 
rowsToDelete(2) = 7 
rowsToDelete(3) = 9 
rowsToDelete(4) = 10 
rowsToDelete(5) = 12 

For i = LBound(rowsToDelete) To UBound(rowsToDelete) 
    Set rngRow = ActiveSheet.Rows(rowsToDelete(i)) 
    If rngToDelete Is Nothing Then 
     Set rngToDelete = rngRow 
    Else 
     Set rngToDelete = Application.Union(rngToDelete, rngRow) 
    End If 
Next i 

if Not rngToDelete Is Nothing Then rngToDelete.Delete 
Смежные вопросы