2014-02-19 2 views
2

Я использую следующий код, чтобы удалить строку, если первая ячейка не является числом (текст или пустые ячейки)Удалить строку, если первая ячейка не является числовым VBA Excel

Dim LR3 As Long, i3 As Long 
With Sheets("Productos") 
LR3 = Range("A" & Rows.Count).End(xlUp).Row 
For i3 = LR3 To 2 Step -1 
    If IsNumeric(Sheets("Productos").Range("A" & i3).Value) Then 
    Else 
    Rows(i3).Delete 
    End If 
Next i3 
End With 

LR3 до 2 используется, потому что первая строка - строка заголовка, и я не хочу, чтобы она была удалена. Я не вижу ничего плохого в коде, и я даже не ошибаюсь. Вы видите что-то не так? Это может быть ложная процедура?

+0

Я просто напомнил об этом в 2010 году, и он прошел, как ожидалось. Что происходит для вас? –

ответ

3

Проблема с вашим кодом, который, как я подозреваю, заключается в том, что Sheets("Productos") не является активом. Таким образом, Rows(i3).Delete имеет в виду действующую схему, которая может не быть Sheets("Productos")

Обратите внимание на использование ДОТС в приведенном ниже коде.

Попробуйте это (испытанный)

Sub Sample() 
    Dim LR3 As Long, i3 As Long 

    With Sheets("Productos") 
     LR3 = .Range("A" & .Rows.Count).End(xlUp).Row 

     For i3 = LR3 To 2 Step -1 
      If Not IsNumeric(.Range("A" & i3).Value) Then .Rows(i3).Delete 
     Next i3 
    End With 
End Sub 

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

Измененный Кодекс

Sub Sample() 
    Dim LR3 As Long, i3 As Long 

    With Sheets("Productos") 
     LR3 = .Range("A" & .Rows.Count).End(xlUp).Row 

     For i3 = LR3 To 2 Step -1 
      If Not IsNumeric(.Range("A" & i3).Value) Or _ 
      .Range("A" & i3).Value = "" Then .Rows(i3).Delete 
     Next i3 
    End With 
End Sub 
+0

добавление выбора листа не помешает .. – gbianchi

+2

'добавление выбора листа не помешает .. - gbianchi 27 секунд назад' @gbianchi. Вы имеете в виду 'Таблицы (« Productos »). Выберите'? Если да, то вы можете увидеть [ЭТО] (http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select) –

+2

@SiddharthRout имеет правильную идею. При программировании в VBA для excel вы никогда не хотите использовать активный или выбирать, поскольку он будет прерываться почти все время. Создайте переменные для листов. Dim ws как рабочий лист; Установите ws = ThisWorkbook.Sheets («Productos»); –

3

Если ячейка пуста, IsNumeric возвращает истину. Вы можете попробовать использовать len,

Dim LR3 As Long, i3 As Long 

With Sheets("Productos") 
    LR3 = .Range("A" & .Rows.Count).End(xlUp).Row 

    For i3 = LR3 To 2 Step -1 
     If IsNumeric(.Range("A" & i3).Value) And _ 
     len(.Range("A" & i3).Value) > 0 Then 

     Else 
      .Rows(i3).Delete 
     End If 
    Next i3 
End With 
+1

+ 1 за то, что не пропустил часть Blank Cell :) Однако, 'Rows (i3) .Delete' по-прежнему не полностью квалифицирован и не будет работать, если' Sheets («Productos») ' не активен :) –

+0

Спасибо, я отредактировал, чтобы полностью квалифицироваться, а С блоком проще на глаза :) –

+0

@JimmySmith это редкость. Я использовал ваш фрагмент кода, но не удалял пустые или нечисловые строки. Это действительно странно, потому что Сиддхарт выполнил эту работу :( – agustin

 Смежные вопросы

  • Нет связанных вопросов^_^