Правильно ли я использую isnumeric функцию?

Эта программа предназначена для преобразования столбца данных из кумулятивных в некумулятивные. На моем листе у меня есть A1, B1 и C1 с текстом Non-Cumulative, Cumulative и Converted соответственно. У меня есть числа от 1 до 10 под A1, затем они суммируются под B1. C1 - это место, где я хочу преобразовать столбец B обратно в некумулятивный.

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

Моя проблема в том, что он не работает. Я думаю, причина в том, что IsNumeric() продолжает возвращаться как false. Есть ли другая функция, которую я должен использовать? Ссылки на ячейки не работают в IsNumeric?

Вот программа!

Option Explicit

Dim i As Variant

Sub Conversion()

Sheets("Test Sheet").Select

For i = 1 To 10
    If IsNumeric("B" & i) = False Then
        Range("C" & i + 1) = Range("B" & i + 1)
    Else: Range("C" & i + 1) = Range("B" & i + 1) - Range("B" & i - 1)
    End If
Next

End Sub

person TheTreeMan    schedule 20.12.2012    source источник


Ответы (2)


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

  • Также лучше сначала проверить, пуст ли диапазон...
  • Затем проверьте, является ли значение числовым.
  • Даже лучше, если вы установите Range в объект Range и используете offset

Код:

Option Explicit '-- great that you use explicit declaration :)

Sub Conversion()
  Dim i As Integer '-- integer is good enough
  Dim rngRange as Range

  '-- try not to select anything. And for a cleaner code
  Set rngRange = Sheets("Test Sheet").Range("B1") 

    For i = 1 To 10
      If (rangeRange.Offset(i,0).value) <> "" then '-- check for non-empty
        If IsNumeric(rangeRange.Offset(i,0).value) = False Then
           rangeRange.Offset(i+1,1) = rangeRange.Offset(i+1,0)
        Else
           rangeRange.Offset(i+1,1) = rangeRange.Offset(i+1,0) - rangeRange.Offset(i-1,0)
        End If
      End if
    Next i '-- loop
End Sub

Чтобы сделать ваш код более динамичным:

  • Еще одно предложение: вы можете просто Application.WorkSheetFunction.Transpose() все B column range, которые вам нужно проверить, в variant array
  • Обработайте массив и Transpose обратно в диапазон со столбцами B и C.
  • Таким образом, вы можете пропустить установку размера цикла вручную, но установить его, используя Lower и Upper границы массива;)
person bonCodigo    schedule 20.12.2012
comment
@TheTreeMan, пожалуйста, попробуйте код и дайте свои комментарии :) - person bonCodigo; 21.12.2012
comment
Благодарю вас! Я все еще очень новичок в программировании и все еще пытаюсь научиться чему-то новому. Ваш совет был выдающимся. Спасибо! - person TheTreeMan; 22.12.2012
comment
@TheTreeMan Я рад, что у вас все получилось :) Рад помочь. Удачи! - person bonCodigo; 22.12.2012

Вам нужно проверить, является ли диапазон B i числовым, а не строкой «B» & i, а не выбирать лист, просто используя родительский идентификатор, например:

sheets("sheet1").range("B" & i)  

Это поможет вам избежать ошибок в коде.

For i = 1 To 10
    If IsNumeric(sheets("test sheet").range("B" & i).value) = False Then
        Range("C" & i + 1) = Range("B" & i + 1)
    Else: Range("C" & i + 1) = Range("B" & i + 1) - Range("B" & i - 1)
    End If
Next
person scott    schedule 20.12.2012