Невозможно получить доступ к ячейкам в Sub из переданного в рабочем листе

Я пытаюсь написать пользовательский элемент DeleteRows Sub, который я могу вызывать из разных точек в моем коде, но у меня возникает проблема, когда лист, который я передаю, кажется, не имеет связанных с ним ячеек, и сталкивается с ним Ошибки «Тип несоответствия» при запуске. Я сортирую, чтобы получить определенное значение в начале, а затем прокручивать, чтобы увидеть, сколько ячеек оно появляется, а затем удалять эти строки.

Option Explicit Public Sub DeleteRows(ByRef MySheet As Worksheet, RowsToDelete As Long, ColumnToUse As String, ValueToSearch As String, UseAsInt As Boolean) Dim MyLong As Long If UseAsInt Then 'We are looking for a numeric value MyLong = CLng(ValueToSearch) Do While MySheet.Cells(RowsToDelete, ColumnToUse).Value = MyLong RowsToDelete = RowsToDelete + 1 Loop Else Do While MySheet.Cells(RowsToDelete, ColumnToUse).Value = ValueToSearch RowsToDelete = RowsToDelete + 1 Loop End If If RowsToDelete > 2 Then 'If the row is 2 then no rows were found MySheet.Rows(2 & ":" & RowsToDelete - 1).Delete 'Delete the rows up to the lastRowToDelete minus 1 row(because it started at 2) End If End Sub 

Я называю это из другого Sub:

 Dim CurDay as Worksheet Set CurDay = Sheets("Current Day") Call DeleteRows(CurDay, 2, "L","#N/A", False) 

Однако, когда я добавляю часы на MySheet в SubRequire DeleteRows, он говорит, что в массиве нет ячеек, и я получаю ошибку несоответствия типа. Где я здесь не так? VBA так расстраивает время от источника C # / VB.Net …

UPDATE: обнаружено, что я должен был проверить .Text вместо .Value или .Value2, и он работает …

Это не то, как вы должны сравнивать ячейки ошибок. Когда ячейка #N/A вы не можете сравнивать ее с чем-то другим, как строка или число. Вы должны сначала проверить, является ли значение ошибкой с использованием IsError(cel) .

В качестве альтернативы вы можете использовать свойство .Text , которое отлично работает с ошибочными ячейками, возвращая строку "#N/A" вместо Error Variant .

Затем вам придется столкнуться с проблемой сравнения строк с числами. Самый простой, UseAsInt параметр UseAsInt ; всегда используйте строку и сравнивайте ее с свойством .Text .

 Public Sub DeleteRows(ByRef MySheet As Worksheet, RowsToDelete As Long, ColumnToUse As String, ValueToSearch As String) Do While MySheet.Cells(RowsToDelete, ColumnToUse).Text = ValueToSearch RowsToDelete = RowsToDelete + 1 Loop If RowsToDelete > 2 Then 'If the row is 2 then no rows were found MySheet.Rows(2 & ":" & RowsToDelete - 1).Delete 'Delete the rows up to the lastRowToDelete minus 1 row(because it started at 2) End If End Sub 
  • Скрипт запускает, но ничего не делает
  • VBA Сохранить как ошибку времени выполнения 1004
  • Ошибка времени выполнения «13» «Несоответствие типа» в случае If Then Statement
  • Ошибка времени выполнения '1004': выбор метода класса Range не удалось VBA
  • Ошибка времени выполнения «1004» при прохождении через большой выборки строк
  • Excel - ошибка 400 для операции SaveAs
  • Объект Var или с блоком не установлен VBA
  • Ошибка времени выполнения «1004» Невозможно установить текстовое свойство диапазона
  • Ошибка времени выполнения VBA 91 на второй итерации
  • Ошибка 6 с длинной переменной в Excel VBA
  • Цикл VBA выходит из строя вокруг 88-й итерации
  • Давайте будем гением компьютера.