🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

2回答

2496閲覧

繰り返し処理の途中で飛ばされてしまいます。

k_m_rad8sfttns

総合スコア1

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

0クリップ

投稿2021/01/22 14:51

編集2021/01/22 14:55

##イメージ説明現したいこと
H列のデータを3つずつ平均して、U列のセルに書き込んで表を作りたいです。H列の最後の端数は、2つのデータの平均か1つのデータをそのままU列に書き込みたいです。

####発生している問題・エラーメッセージ
H2からH16までは順調に処理してくれるのですが、そのあとH27とH28のセルを平均してしまい、そのあとになぜかH20からまた正常に処理を再開します。

エラーメッセージは出ません

前提・実現したいこと

VBA

1Sub 表作成() 2 3Dim i 4For i = 1 To 3 5Sheets(i).Select 6 7 Range("T1").Value = "西進(6H)" 8 Range("U1").Value = "経度平均(12H)" 9 Range("V1").Value = "西進(12H)" 10 Range("W1").Value = "経度平均(24H)" 11 Range("X1").Value = "西進(24H)" 12 13 Columns("U").ColumnWidth = 12 14 Columns("V").ColumnWidth = 8.5 15 Columns("W").ColumnWidth = 12 16 Columns("X").ColumnWidth = 8.5 17 18 Dim t 19 For t = 3 To 100 20 If Cells(t, 8) = "" Then 21 Exit For 22 End If 23 24 Cells(t, 20).Value = "=IF(H" & CStr(t) & "-H" & CStr(t - 1) & "<0,""0"",""1"")" 25 26 Next t 27 28 Dim u 29 For u = 2 To 100 30 If Cells(3 * u - 4, 8) = "" Then 31 Exit For 32 33 ElseIf Cells(3 * u - 3, 8) = "" Then 34 Cells(u, 21) = Cells(3 * u - 4, 8) 35 Exit For 36 37 ElseIf Cells(3 * u - 2, 8) = "" Then 38 Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 3) & ")" 39 Exit For 40 End If 41 42 Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 2) & ")" 43 44 Next u 45 46 Dim v 47 For v = 3 To 100 48 If Cells(v, 21) = "" Then 49 Exit For 50 End If 51 52 Cells(v, 22).Value = "=IF(U" & CStr(v) & "-U" & CStr(v - 1) & "<0,""0"",""1"")" 53 54 Next 55 56 Dim w 57 For w = 2 To 100 58 If Cells(5 * w - 8, 8) = "" Then 59 Exit For 60 61 ElseIf Cells(5 * w - 7, 8) = "" Then 62 Cells(w, 21) = Cells(5 * w - 8, 8) 63 Exit For 64 65 ElseIf Cells(5 * w - 6, 8) = "" Then 66 Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 7) & ")" 67 Exit For 68 69 ElseIf Cells(5 * w - 5, 8) = "" Then 70 Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 6) & ")" 71 Exit For 72 73 ElseIf Cells(5 * w - 4, 8) = "" Then 74 Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 5) & ")" 75 Exit For 76 End If 77 78 Cells(w, 23).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 4) & ")" 79 80 Next w 81 82 Dim x 83 For x = 3 To 100 84 If Cells(x, 23) = "" Then 85 Exit For 86 End If 87 88 Cells(x, 23).Value = "=IF(W" & CStr(x) & "-W" & CStr(x - 1) & "<0,""0"",""1"")" 89 90 Next x 91 92 93Next i 94 95End Sub 96

試したこと

最初にただifを重ねて条件分岐をしていたので、elseifに書き換えました。
ステップインで実行したりもしたのですが、繰り返しが飛ばされてしまって、よく原因が分かりませんでした。
他に試す方法があれば、教えていただきたいです。

補足情報(FW/ツールのバージョンなど)

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

最後が3つの組にならない場合の範囲を変化させるため。Dim w以下で数式を上書きされているようですが、ここの部分にバグがあり、特定の場合に想定しない式または数字が上書きされています。

Average関数は空白セルを無視するので、最後が3つの組にならない場合であっても、数式をあえて変化させる必要はありません。

(赤色に塗られている行は削除)

diff

1Sub 表作成() 2 3Dim i 4For i = 1 To 3 5Sheets(i).Select 6 7 Range("T1").Value = "西進(6H)" 8 Range("U1").Value = "経度平均(12H)" 9 Range("V1").Value = "西進(12H)" 10 Range("W1").Value = "経度平均(24H)" 11 Range("X1").Value = "西進(24H)" 12 13 Columns("U").ColumnWidth = 12 14 Columns("V").ColumnWidth = 8.5 15 Columns("W").ColumnWidth = 12 16 Columns("X").ColumnWidth = 8.5 17 18 Dim t 19 For t = 3 To 100 20 If Cells(t, 8) = "" Then 21 Exit For 22 End If 23 24 Cells(t, 20).Value = "=IF(H" & CStr(t) & "-H" & CStr(t - 1) & "<0,""0"",""1"")" 25 26 Next t 27 28 Dim u 29 For u = 2 To 100 30 If Cells(3 * u - 4, 8) = "" Then 31 Exit For 32 33- ElseIf Cells(3 * u - 3, 8) = "" Then 34- Cells(u, 21) = Cells(3 * u - 4, 8) 35- Exit For 36 37- ElseIf Cells(3 * u - 2, 8) = "" Then 38- Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 3) & ")" 39- Exit For 40 End If 41 42 Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 2) & ")" 43 44 Next u 45 46 Dim v 47 For v = 3 To 100 48 If Cells(v, 21) = "" Then 49 Exit For 50 End If 51 52 Cells(v, 22).Value = "=IF(U" & CStr(v) & "-U" & CStr(v - 1) & "<0,""0"",""1"")" 53 54 Next 55 56- Dim w 57- For w = 2 To 100 58- If Cells(5 * w - 8, 8) = "" Then 59- Exit For 60 61- ElseIf Cells(5 * w - 7, 8) = "" Then 62- Cells(w, 21) = Cells(5 * w - 8, 8) 63- Exit For 64 65- ElseIf Cells(5 * w - 6, 8) = "" Then 66- Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 7) & ")" 67- Exit For 68 69- ElseIf Cells(5 * w - 5, 8) = "" Then 70- Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 6) & ")" 71- Exit For 72 73- ElseIf Cells(5 * w - 4, 8) = "" Then 74- Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 5) & ")" 75- Exit For 76- End If 77 78- Cells(w, 23).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 4) & ")" 79 80- Next w 81 82 Dim x 83 For x = 3 To 100 84 If Cells(x, 23) = "" Then 85 Exit For 86 End If 87 88 Cells(x, 23).Value = "=IF(W" & CStr(x) & "-W" & CStr(x - 1) & "<0,""0"",""1"")" 89 90 Next x 91 92 93Next i 94 95End Sub

あえて、最後の数字の組数に応じてAverage関数の範囲を変化させたいならば、Dim u以下は下記のようにすればよいと思います。
(Dim wの段は削除)

Dim u For u = 2 To 100 a = Cells(3 * u - 4, 8) b = Cells(3 * u - 3, 8) c = Cells(3 * u - 2, 8) If a = "" Then Exit For ElseIf b = "" Then k = CStr(3 * u - 4) ElseIf c = "" Then k = CStr(3 * u - 3) Else k = CStr(3 * u - 2) End If Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & k & ")" Next u

投稿2021/01/22 15:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_m_rad8sfttns

2021/01/23 07:12

早々のご回答ありがとうございます。 ご指摘の行を削除したところ、正常に作動しました。 >Average関数は空白セルを無視するので、 この知識がないまま、まわりくどい?マクロを書いてしまいました。 関数を使うときには、その関数の持つ機能をよく理解して使いたいと思います。未熟な質問にご回答いただき、ありがとうございました。
guest

0

For文の中で毎回次のループではなくForループを抜ける実装になっていませんか?
For文の使い方

また、処理のロジックを日本語で書いてみると思考が整理されて読みやすくなります。コメントを書くのもそういった理由の場合もあります。

あと、H列の値が空欄の時にH列の平均値を計算するという処理になっていますが、処理開始前の状態はこれであっていますか?

投稿2021/01/22 15:36

scor1215

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_m_rad8sfttns

2021/01/23 07:16

早々のご回答ありがとうございました。自分の実現したいことの説明が言葉足らずだったようです…マクロなどを書くときにはご指摘の通り、コメントをつけて思考が整理できるようにしたいと思います。未熟な質問にご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問