2014-02-07 18 views
0

Я хочу удалить отрицательные значения в диапазоне в excel. У меня есть код, который удаляет, но не все значения.Преобразование значения диапазона от текста до номера

Я узнал, что сначала должен изменить значение на числовой тип. У меня есть код ниже, в котором я пытался сделать это с cDec и Convert.ToInt32, но не был успешным. Я новичок в vba, я мало знаю о его типах данных. Ваша помощь будет весьма значимой:

Sub Button1_Click() 
    Dim ws As Worksheet 
    Dim i As Integer 

    i = 1 

    Set ws = Sheets("Recovered_Sheet1") 
    ws.Activate 

    Dim r As Excel.Range 

    For Each r In Range("A1:A250").Rows 
     If Not IsEmpty(ActiveCell.Value) Then 
      'move to the row below 
      ActiveCell.Offset(1, 0).Select 
      ActiveCell.Value = CDec(ActiveCell.Value) 
     End If 
    Next r 

    Do While Cells(i, 1).Value <> "" 
     If Cells(i, 1) < 0 Then 
      Cells(i, 1).EntireRow.Delete 
     End If 
     i = i + 1 
    Loop 
End Sub 
+1

http://stackoverflow.com/questions/20192371/vba-conver-text-numbe r-multiplying-by-1 –

+1

http://stackoverflow.com/questions/21627250/excel-vba-convert-string-entered-in-user-form-to-number –

ответ

1

Вот один из способов сделать это. Обратите внимание, что при удалении строк вы должны работать снизу вверх. Кроме того, вам не нужно изменять тип данных Excel перед запуском этого макроса, если у вас нет других причин для этого (в этом случае есть более эффективные методы, чем переход ячейки по ячейке).

Редактировать Поскольку текст и пробелы возвращаются False с .Value < 0, нет необходимости проверять что-либо еще.

Option Explicit 
Sub DelNegNumRows() 
    Dim I As Long 
For I = 250 To 1 Step -1 
    With Cells(I, 1) 
     If .Value < 0 Then 
      .EntireRow.Delete 
     End If 
    End With 
Next I 
End Sub 

В зависимости от характеристик вашего диапазона, вы не можете проверить все 250 строк (хотя, если это размер вашей базы данных, вы не будете воспринимать преимущество в скорости, чтобы сделать диапазон меньше). Например, если все ваши строки с данными не являются пустыми, вы можете сделать что-то вроде:

lastrow = cells(1,1).end(xldown).row 

или, если там могут быть пробелы, и вы хотите, чтобы найти последнюю строку в столбце А, который имеет какой-либо данные, что-то вроде:

lastrow = cells(rows.Count,1).end(xlup).row 

Вы могли бы затем цикл, в макросе выше:

for I = lastrow to 1 step -1 
+0

BTW: Если вы хотите, вы можете использовать Autofilter а также удалить строку за пределами цикла. Ваш код будет намного быстрее. –

+0

Поскольку диапазон составляет всего 250 строк, я не стал использовать «более быстрые» методы. Я бы обычно также отключил обновление экрана, вычисление и т. Д. Одна из проблем, которые я думаю с помощью AutoFilter, заключается в том, что вы не можете использовать числовой фильтр, когда цифры являются текстом; и я не думаю, что вы можете удалить несмежные «целые строки», поэтому мне оставалось бы, по крайней мере, прокручивать «области». Кроме того, специальные ячейки видят числа, которые хранятся в виде текста, как текстовые значения, поэтому вы не можете использовать этот метод либо для определения диапазона. Но если диапазон был больше, я бы прочитал его в массиве и проверил значения в VBA –

+0

'1' True. Вы можете использовать метод «.Formula = .Value», чтобы преобразовать его в число, а затем использовать Autofilter '2'. Вы можете удалить непересекающиеся строки. Я ответил на несколько вопросов, где я это продемонстрировал. –

0
Sub Button1_Click() 
Dim I As Long 
Dim lastrow As Long 
lastrow = Cells(Rows.Count, 1).End(xlUp).Row 
For I = lastrow To 1 Step -1 
    With Cells(I, 2) 
     If .Value < 0 Then 
      .EntireRow.Delete 
     End If 
    End With 
Next I 
End Sub 
Смежные вопросы