質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.19%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/23 16:12

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/23 16:16

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

    キャンセル

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

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る