Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: TheTreeManОтветов: 2

Эта программа предназначена для преобразования столбца данных из кумулятивных в некумулятивные. На моем листе у меня есть 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

excelvbaexcel-2010

Ответы

Ответ 1 · рейтинг 6 · bonCodigo

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

  • Также лучше сначала проверить, пуст ли диапазон...
  • Затем проверьте, является ли значение числовым.
  • Даже лучше, если вы установите 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 границы массива;)

Ответ 2 · рейтинг 3 · scott

Вам нужно проверить, является ли диапазон 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы