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