3

このプログラムは、データの列を累積から非累積に変換するためのものです。私のシートには、A1、B1、C1があり、それぞれテキストがNon-Cumulative、Cumulative、Convertedです。A1の下に1から10の数字があり、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
4

2 に答える 2

6

コードの記述方法は論理的であり、最初に必要な構文のマイナーな変更のみです。でも、

  • また、最初に範囲が空かどうかを確認することをお勧めします...
  • 次に、値が数値かどうかを確認します。
  • 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 rangevariant array
  • 配列を処理し、Transpose列 B と C を含む範囲に戻ります。
  • そうすることで、ループサイズの手動設定を省略できますが、配列の境界を使用して設定できます; Lower)Upper
于 2012-12-20T22:41:27.007 に答える
3

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
于 2012-12-20T20:24:41.137 に答える