2016-05-10 2 views
0

У меня есть столбец, который имеет либо строковые типы (например, «N/A»), либо числа в нем. Я пытаюсь написать код vba, который, если цикл FOR встречается с типом строки, будет преобразован в 0. По сути, это то, что код сбрасывается по столбцу (K) значений (например, $ 10, $ 600, $ 5200, N/A, $ 5) и сохраняет значение ячейки, если это число, и если в ячейке есть текст, тогда текст преобразуется в 0. Диапазон (K6: K10), формула будет выглядеть примерно так: ,Если цикл «iserror» FOR с переменным типом объекта

=If(iserror(K6/10) = TRUE, 0, K6) 

Код:

Dim a As Integer 
Dim DilutedRev As Integer 
For a = 6 To 10 
    DilutedRev = ActiveCell(a, 11).Value 
    If IsError(DilutedRev/100) = True Then 
     ActiveCell(a, 11) = 0 
    Else 
     ActiveCell(i, 11) = DilutedRev 
    End If 
+2

Нет сомнений ... – gtwebb

+1

Sigh. Почему люди никогда не узнают из своего [последнего вопроса] (http://stackoverflow.com/questions/37142200/applying-if-statement-to-range-of-cells-using-vba) XD – findwindow

+0

Ничего не происходит, когда я запускаю этот код, поэтому мне любопытно узнать, что случилось.Я не уверен, что вы можете установить DilutedRev как целочисленный тип, когда в столбце есть разные типы объектов. – Davey

ответ

4

Используйте IsNumeric function, чтобы определить, содержит ли ячейка номер.

Dim a As Long 

With ActiveSheet 
    For a = 6 To 10 
     If IsNumeric(.Cells(a, "K").Value2) Then 
      .Cells(a, 11) = CLng(.Cells(a, "K").Value2) 
     Else 
      .Cells(a, 11) = 0 
     End If 
    Next a 
End With 

Используя ActiveCell property, как вы делали не «лучшей практикой», из-за относительное происхождение point¹ был; лучше использовать Range.Cells property.

Функции VBA, возвращающие логические значения (например, IsNumeric, IsError и т. Д.), Не нужно сравнивать с True или False. Они уже либо Верны, либо Ложные.

Я использовал Range.Value2 property для проверки, но Range.Value property может быть использован так же хорошо.

Обычно стоит указать явно свойство листа Range.Parent, а не полагаться на ActiveSheet property.


¹ Строго говоря, нет ничего плохого в том компенсируя ActiveCell как вы сделали, но результат полностью относительно текущего выбора на листе, и, как правило, не считается «лучшей практики». С D5, выбранным на листе, activecell(1,1) ссылки D5 и activecell(2,3) ссылки F6. В очень особенном случае это поведение может быть желательным, но, как правило, это лучше использовать Range.Cells property и использовать row_number и column_number для ссылки на ячейку с точки зрения Worksheet Object, а не на позицию смещения от ActiveCell.

+1

Ничего себе, сколько пропущенных сносок?!?! tsk tsk Jeeped. – findwindow

+0

/скрывается от стыда XD – findwindow

4

во-первых, как это было указано в последнем вопросе; Activecell ссылается только на то, что activecell - это одна ячейка, а не диапазон. Вы хотите Cells().

Затем, переопределяя переменную внутри цикла, она позволяет Excel определять свой тип каждый раз. Если это не тот тип, который excel присваивает в первый раз, и вы не можете сохранить текстовое значение в типе Integer.

Затем мы проверяем эту переменную, если она является числовой или нет.

Но вы можете пропустить это и сделать то, что предлагает @Jeeped.

Dim a As Integer 

For a = 6 To 10 
    Dim DilutedRev 
    DilutedRev = Cells(a, 11).Value 
    If Not isnumeric(DilutedRev) Then 
     Cells(a, 11) = 0 
    Else 
     Cells(a, 11) = DilutedRev 
    End If 
+2

'Cell()'? или 'Ячейки()'? Я думаю, что ваш компьютер был захвачен/скомпрометирован! – BruceWayne

+1

@BruceWayne да, да ... Иногда я прыгаю на одну вещь и скучаю по другим. Именно поэтому я окружаю себя такими людьми, как вы, ребята. Я хожу быстро и ожидаю, что другие скажут мне, когда я испортил это. Благодарю. –

+1

Так много для того, чтобы быть Богом. Угадайте, что супергерой - это путь. – findwindow

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