|
▼掛橋 さん:
ご参考までに。
まず、アップされたコードはすべて1桁目から記述されています。
このようなコードを「インデントがつけられていないコード」といいます。
たとえば Do/Loopの内側等、ある条件下で実行されるコードは、その条件を制御しているコードより
3桁ないしは4桁右から記述を始めます。
(コードを打つときにタブキーをおすと、設定されたインデントの桁数分、右にカーソルが自動スキップします)
Sample1は、アップされたコードのまま、インデントをつけたものです。
で、次に、hintさんからもでていましたが、Select は、できるだけ避けるように記述します。
マクロ記録すると、Selectのオンパレードになりますので、VBA始めてbもない人にとっては、
理解しづらいかもしれません。
でも、「無駄な動き」ですし、場合によっては、Selectのためにエラーになるケースもあります。
また、ActiveCellを相手にしたコードもできるだけ避けたほうがよろしいです。
ちゃんと、処理するセルを明記しましょう。
もう1つ、total をSingle型で定義しておられます。実際のデータは、これぐらいで、十分だという判断でしょうけど
(入力間違いも含めて)もっと大きな数値がセルに入っているかもしれません。
小数点付きの変数の定義は Double型で行ったほうが無難です。
ほんの少々、確保されるメモリーサイズが増えますが「顕微鏡でのぞく」ぐらいの差ですので。
同じように、整数の場合は、それが、どんなに小さな数値を相手にする場合でも、Integer ではなく Long 規定が
望ましいですね。こちらの場合は、内部の計算効率がLong型のほうが、Integer型より優れているということもあります。
上記のようなことを加味したものが、Sample2です。
で、実は、このケース、Do/LoopよりFor/Nextのほうが適しています。
For/NextにかえたものがSample3です。
Sub Sample1()
Dim total As Single
Range("C11").Select
Do While ActiveCell.Value <> ""
total = total + ActiveCell.Value
ActiveCell.Offset(0, 1).Value = total
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Sub Sample2()
Dim total As Double
Dim i As Long
i = 11 '開始行
Do While Range("C" & i).Value <> ""
total = total + Range("C" & i).Value
Range("C" & i).Offset(0, 1).Value = total
i = i + 1
Loop
End Sub
Sub Sample3()
Dim total As Double
Dim i As Long
Dim z As Long
Range("C11").Select
i = 11 '開始行
z = Range("C" & Rows.Count).End(xlUp).Row 'C列のデータ最終行番号
For i = 11 To z '11行目からデータ最終行まで処理する
total = total + Range("C" & i).Value
Range("C" & i).Offset(0, 1).Value = total
Next
End Sub
|
|