繰り返し処理の途中で飛ばされてしまいます。
- 評価
- クリップ 0
- VIEW 165
現したいこと
H列のデータを3つずつ平均して、U列のセルに書き込んで表を作りたいです。H列の最後の端数は、2つのデータの平均か1つのデータをそのままU列に書き込みたいです。
発生している問題・エラーメッセージ
H2からH16までは順調に処理してくれるのですが、そのあとH27とH28のセルを平均してしまい、そのあとになぜかH20からまた正常に処理を再開します。
エラーメッセージは出ません
前提・実現したいこと
Sub 表作成()
Dim i
For i = 1 To 3
Sheets(i).Select
Range("T1").Value = "西進(6H)"
Range("U1").Value = "経度平均(12H)"
Range("V1").Value = "西進(12H)"
Range("W1").Value = "経度平均(24H)"
Range("X1").Value = "西進(24H)"
Columns("U").ColumnWidth = 12
Columns("V").ColumnWidth = 8.5
Columns("W").ColumnWidth = 12
Columns("X").ColumnWidth = 8.5
Dim t
For t = 3 To 100
If Cells(t, 8) = "" Then
Exit For
End If
Cells(t, 20).Value = "=IF(H" & CStr(t) & "-H" & CStr(t - 1) & "<0,""0"",""1"")"
Next t
Dim u
For u = 2 To 100
If Cells(3 * u - 4, 8) = "" Then
Exit For
ElseIf Cells(3 * u - 3, 8) = "" Then
Cells(u, 21) = Cells(3 * u - 4, 8)
Exit For
ElseIf Cells(3 * u - 2, 8) = "" Then
Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 3) & ")"
Exit For
End If
Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 2) & ")"
Next u
Dim v
For v = 3 To 100
If Cells(v, 21) = "" Then
Exit For
End If
Cells(v, 22).Value = "=IF(U" & CStr(v) & "-U" & CStr(v - 1) & "<0,""0"",""1"")"
Next
Dim w
For w = 2 To 100
If Cells(5 * w - 8, 8) = "" Then
Exit For
ElseIf Cells(5 * w - 7, 8) = "" Then
Cells(w, 21) = Cells(5 * w - 8, 8)
Exit For
ElseIf Cells(5 * w - 6, 8) = "" Then
Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 7) & ")"
Exit For
ElseIf Cells(5 * w - 5, 8) = "" Then
Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 6) & ")"
Exit For
ElseIf Cells(5 * w - 4, 8) = "" Then
Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 5) & ")"
Exit For
End If
Cells(w, 23).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 4) & ")"
Next w
Dim x
For x = 3 To 100
If Cells(x, 23) = "" Then
Exit For
End If
Cells(x, 23).Value = "=IF(W" & CStr(x) & "-W" & CStr(x - 1) & "<0,""0"",""1"")"
Next x
Next i
End Sub
試したこと
最初にただifを重ねて条件分岐をしていたので、elseifに書き換えました。
ステップインで実行したりもしたのですが、繰り返しが飛ばされてしまって、よく原因が分かりませんでした。
他に試す方法があれば、教えていただきたいです。
補足情報(FW/ツールのバージョンなど)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
最後が3つの組にならない場合の範囲を変化させるため。Dim w以下で数式を上書きされているようですが、ここの部分にバグがあり、特定の場合に想定しない式または数字が上書きされています。
Average関数は空白セルを無視するので、最後が3つの組にならない場合であっても、数式をあえて変化させる必要はありません。
(赤色に塗られている行は削除)
Sub 表作成()
Dim i
For i = 1 To 3
Sheets(i).Select
Range("T1").Value = "西進(6H)"
Range("U1").Value = "経度平均(12H)"
Range("V1").Value = "西進(12H)"
Range("W1").Value = "経度平均(24H)"
Range("X1").Value = "西進(24H)"
Columns("U").ColumnWidth = 12
Columns("V").ColumnWidth = 8.5
Columns("W").ColumnWidth = 12
Columns("X").ColumnWidth = 8.5
Dim t
For t = 3 To 100
If Cells(t, 8) = "" Then
Exit For
End If
Cells(t, 20).Value = "=IF(H" & CStr(t) & "-H" & CStr(t - 1) & "<0,""0"",""1"")"
Next t
Dim u
For u = 2 To 100
If Cells(3 * u - 4, 8) = "" Then
Exit For
- ElseIf Cells(3 * u - 3, 8) = "" Then
- Cells(u, 21) = Cells(3 * u - 4, 8)
- Exit For
- ElseIf Cells(3 * u - 2, 8) = "" Then
- Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 3) & ")"
- Exit For
End If
Cells(u, 21).Value = "=AVERAGE(H" & CStr(3 * u - 4) & ":H" & CStr(3 * u - 2) & ")"
Next u
Dim v
For v = 3 To 100
If Cells(v, 21) = "" Then
Exit For
End If
Cells(v, 22).Value = "=IF(U" & CStr(v) & "-U" & CStr(v - 1) & "<0,""0"",""1"")"
Next
- Dim w
- For w = 2 To 100
- If Cells(5 * w - 8, 8) = "" Then
- Exit For
- ElseIf Cells(5 * w - 7, 8) = "" Then
- Cells(w, 21) = Cells(5 * w - 8, 8)
- Exit For
- ElseIf Cells(5 * w - 6, 8) = "" Then
- Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 7) & ")"
- Exit For
- ElseIf Cells(5 * w - 5, 8) = "" Then
- Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 6) & ")"
- Exit For
- ElseIf Cells(5 * w - 4, 8) = "" Then
- Cells(w, 21).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 5) & ")"
- Exit For
- End If
- Cells(w, 23).Value = "=AVERAGE(H" & CStr(5 * w - 8) & ":H" & CStr(5 * w - 4) & ")"
- Next w
Dim x
For x = 3 To 100
If Cells(x, 23) = "" Then
Exit For
End If
Cells(x, 23).Value = "=IF(W" & CStr(x) & "-W" & CStr(x - 1) & "<0,""0"",""1"")"
Next x
Next i
End 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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
For文の中で毎回次のループではなくForループを抜ける実装になっていませんか?
For文の使い方
また、処理のロジックを日本語で書いてみると思考が整理されて読みやすくなります。コメントを書くのもそういった理由の場合もあります。
あと、H列の値が空欄の時にH列の平均値を計算するという処理になっていますが、処理開始前の状態はこれであっていますか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2021/01/23 16:12
ご指摘の行を削除したところ、正常に作動しました。
>Average関数は空白セルを無視するので、
この知識がないまま、まわりくどい?マクロを書いてしまいました。
関数を使うときには、その関数の持つ機能をよく理解して使いたいと思います。未熟な質問にご回答いただき、ありがとうございました。