Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1854 / 13645 ツリー ←次へ | 前へ→

【71488】意味がいまいち分かりません 掛橋 12/3/11(日) 12:18 質問[未読]
【71489】Re:意味がいまいち分かりません hint 12/3/11(日) 12:56 発言[未読]
【71490】Re:意味がいまいち分かりません UO3 12/3/11(日) 14:29 発言[未読]
【71491】Re:意味がいまいち分かりません UO3 12/3/11(日) 17:49 発言[未読]

【71488】意味がいまいち分かりません
質問  掛橋  - 12/3/11(日) 12:18 -

引用なし
パスワード
   次のプロシージャがあります。
1. Sub 練習4()
2. Dim total As Single
3. Range ("C11").Select
4. Do While ActiveCell.Value<>""
5. total = total + ActiveCell.Value
6. ActiveCell.Offset(0,1).Value = total
7. ActiveCell.Offset(1,0).Select
8. Loop
9. End Sub
質問
7.行の命令で、アクティブセルは「D12」になっていると思います。
「D12」は空白ですから、4.以降の処理ができないのではないでしょうか。

【71489】Re:意味がいまいち分かりません
発言  hint  - 12/3/11(日) 12:56 -

引用なし
パスワード
   ▼掛橋 さん:
>7.行の命令で、アクティブセルは「D12」になっていると思います。
>「D12」は空白ですから、4.以降の処理ができないのではないでしょうか。
たぶん勘違いされていると思いますが、
6行目の処理は、
ActiveCell自体は動いていないですよ。
そこはいいですか?

なお、Selectを使わずに書くほうが一般的だと思います。
そうしたことは次のステップということになりますが、
頭の片隅に入れておいてください。

【71490】Re:意味がいまいち分かりません
発言  UO3  - 12/3/11(日) 14:29 -

引用なし
パスワード
   ▼掛橋 さん:

こんにちは
hintさんから指摘があるとおりです。
参考まで以下に、3.〜8.のコードを擬似コードにして補足します。
ところで、hintさんも指摘されていますが、このコードは、必ずしも模範的なものではありません。
むしろ、できるだけ、このようには、書かない方がいいよ というサンプルといってもいいかもしれません。
どこかの参考書に掲載されているのでしょうか?
VBAを始めて間もない人が、よく、このコードの流れで記述しておられるのを見かけます。

3. C11 をアクティブセルにします
4. アクティブセルの値が空白になるまで、以下の処理を繰り返します。
5. その値を total に足し込みます。
6. アクティブセルの1つ右のセルに、現時点の Total の値をセットします。
  注)アクティブセルは動いていません。ただ参照しているだけです。
7. アクティブセルを現在のセルの1つ下にします。
8. 4.からの処理を繰り返します。

【71491】Re:意味がいまいち分かりません
発言  UO3  - 12/3/11(日) 17:49 -

引用なし
パスワード
   ▼掛橋 さん:

ご参考までに。

まず、アップされたコードはすべて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

1854 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free