kansai5963
@kansai5963

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【VBA】7回ごとに同じ処理を繰り返す

解決したいこと

シート2にある項目を検索して左右の値をシート1に返す。
7回繰り返したら5行下に移動する。
8回目以降も同様に7回繰り返したら5行下に移動する。
メッセージボックスに空白が入力されたら処理を完了する。
7回目までの繰り返しはうまくいきましたが、8回目以降で失敗します。

発生している問題・エラー

withのブロック数が設定されていません。

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

Sub Macro1()
'
' Macro1 Macro
'
    Dim x As Variant
    Dim myprompt As String
    Dim mytitle As String
    Dim foundCell As Range
    Dim ex1 As Variant
    Dim ex2 As Variant
    Dim ex3 As Variant
    Dim koumoku1 As Variant
    Dim koumoku2 As Variant
    Dim koumoku3 As Variant
    Dim koumoku4 As Variant
    Dim koumoku5 As Variant
    Dim i As Integer
    Dim cnt As Integer
    Dim searchResult As String
    
    i = 1
    cnt = i + 1
    
    Do While True
        'i = 1
        cnt = i + 1
        For i = 1 To cnt
        
            myprompt = "項目を入力してください"
            mytitle = "作成"
            x = Application.InputBox(myprompt, mytitle)
        
            If x = "" Then
                MsgBox "空白が入力されました。ループを終了します。"
                Exit Do ' Forループを抜ける
        
            ' ユーザーが「キャンセル」を押した場合(xがvbCancelの場合)
            ElseIf x = False Then
                MsgBox "処理がキャンセルされました。ループを終了します。"
                Exit Do ' Forループを抜ける
            
            ElseIf Len(Trim(x)) = 0 Then
                MsgBox "該当はありませんでした。。ループを終了します。"
                Exit Do ' Forループを抜ける
            
            End If

            foundCell.Activate

            ex1 = ActiveCell.Offset(0, -2).Value
            ex2 = ActiveCell.Offset(0, -1).Value
            ex3 = ActiveCell.Offset(0, 1).Value
            koumoku1 = ActiveCell.Offset(0, 2).Value
            koumoku2 = ActiveCell.Offset(0, 3).Value
            koumoku3 = ActiveCell.Offset(0, 4).Value
            koumoku4 = ActiveCell.Offset(0, 5).Value
            koumoku5 = ActiveCell.Offset(0, 6).Value

            If Not foundCell Is Nothing Then
        
                If i = 1 Then
        
                    Sheets("フォーマット").Activate
            
                    Range("C7").Activate
                    Range("C7").Value = ex1
        
                    ActiveCell.Offset(0, 2).Activate
                    ActiveCell.Value = ex2
            
                    ActiveCell.Offset(1, 0).Activate
                    ActiveCell.Value = foundCell
        
                    ActiveCell.Offset(1, 0).Activate
                    ActiveCell.Value = "【メーカー】:" + ex3
    
                    ActiveCell.Offset(-2, 0).Activate
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku1
        
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku2
        
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku3
        
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku4
        
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku5
                    
                    ActiveCell.Offset(2, 0).Activate
                    ActiveCell.Offset(0, -7).Activate
                
                ElseIf i Mod 7 = 0 Then

                    MsgBox i & "回目の処理です。"
                    Sheets("フォーマット").Activate
                
                    ActiveCell.Value = ex1
    
                    ActiveCell.Offset(0, 2).Activate
                    ActiveCell.Value = ex2
            
                    ActiveCell.Offset(1, 0).Activate
                    ActiveCell.Value = foundCell
    
                    ActiveCell.Offset(1, 0).Activate
                    ActiveCell.Value = "【メーカー】:" + ex3
    
                    ActiveCell.Offset(-2, 0).Activate
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku1
    
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku2
    
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku3
    
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku4
    
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku5
                
                    ActiveCell.Offset(5, 0).Activate
                    ActiveCell.Offset(0, -7).Activate
                    
                    'i = i + 1
            
            
                Else
            
                    Sheets("フォーマット").Activate
            
                    ActiveCell.Value = ex1
    
                    ActiveCell.Offset(0, 2).Activate
                    ActiveCell.Value = ex2
            
                    ActiveCell.Offset(1, 0).Activate
                    ActiveCell.Value = foundCell
    
                    ActiveCell.Offset(1, 0).Activate
                    ActiveCell.Value = "【メーカー】:" + ex3

                    ActiveCell.Offset(-2, 0).Activate
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku1
    
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku2
        
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku3
    
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku4
    
                    ActiveCell.Offset(0, 1).Activate
                    ActiveCell.Value = koumoku5
                
                    ActiveCell.Offset(2, 0).Activate
                    ActiveCell.Offset(0, -7).Activate
                

                
                End If
    
            Else
                MsgBox "見つかりませんでした。", vbExclamation
            End If

        Next i
    Loop
    
    MsgBox "処理が完了しました。", vbExclamation
    
End Sub

自分で試したこと

chatGPTに聞いたりしましたが明確な回答は出ませんでした。

0

2Answer

まず i が「1」から始まっていますが
コンピュータのアルゴリズムとして 0 から始めた方が式がわかりやすくなります

7回目の処理なら

ElseIf i Mod 7 = 0 Then

の代わりに

ElseIf i Mod 7 = 6 Then

これで 7回目の処理条件になり、さらに1回目の判定も不要です
どうしても i を 1 から回したい場合は

ElseIf (i-1) Mod 7 = 6 Then

こうやって条件式のみ 0から始まってるようにします

この条件式はプログラムのアルゴリズムを覚えるときの良い題材になるかと思います

0Like

Comments

  1. @kansai5963

    Questioner

    回答ありがとうございます。
    これで 7回目の処理条件になり、さらに1回目の判定も不要です
    との記載がありましたが、1回目の処理で1行分転記し、次の行に移動する設定に
    しております。
    そのため、1回目は最初のセルを指定しておりますが、こちらが不要になるということでしょうか?その場合はセルの設定をifの外に記載する形になるのでしょうか?

  2. 1回目に専用の処理がある場合は必要です
    ですが固定セルの指定であればその処理をループ前にしておけば良いのでは?
    最初の条件文内の処理と最後のElse処理が下記だけの違いで ※少し見比べただけです
    ここは1回目通るのならループに入る前に処理すべきかと思います
    そしたら最初の処理という専用処理は不要になります

    Range("C7").Activate
    Range("C7").Value = ex1
    
  3. @kansai5963

    Questioner

    回答ありがとうございます。
    構文もシンプルになり7回目まではうまくいきました。
    8回目の処理がうまくいかないため未解決です。

  4. @kansai5963

    Questioner

    ちなみにiの値をメッセージボックスで見ましたが、4回目実施の際にi=1に戻ってしまいます。

項目を入力してくださいの直前で、変数i と cnt の値を出力すると、以下のような値でした。
これは期待した動作による変数の更新なのでしょうか?

i:1, cnt:2
i:2, cnt:2
i:1, cnt:4
i:2, cnt:4
i:3, cnt:4
i:4, cnt:4
i:1, cnt:6
i:2, cnt:6
i:3, cnt:6
i:4, cnt:6
i:5, cnt:6
i:6, cnt:6
i:1, cnt:8
i:2, cnt:8
i:3, cnt:8
i:4, cnt:8
i:5, cnt:8
i:6, cnt:8
i:7, cnt:8
i:8, cnt:8
i:1, cnt:10
i:2, cnt:10
i:3, cnt:10
i:4, cnt:10
i:5, cnt:10
i:6, cnt:10
i:7, cnt:10
i:8, cnt:10
i:9, cnt:10
i:10, cnt:10
i:1, cnt:12
i:2, cnt:12
i:3, cnt:12
i:4, cnt:12
i:5, cnt:12
i:6, cnt:12
i:7, cnt:12
i:8, cnt:12
i:9, cnt:12
i:10, cnt:12
i:11, cnt:12
i:12, cnt:12
i:1, cnt:14
i:2, cnt:14
i:3, cnt:14
i:4, cnt:14
i:5, cnt:14
i:6, cnt:14
i:7, cnt:14
i:8, cnt:14
i:9, cnt:14
i:10, cnt:14
i:11, cnt:14
i:12, cnt:14
i:13, cnt:14
i:14, cnt:14
i:1, cnt:16
i:2, cnt:16
i:3, cnt:16
i:4, cnt:16
i:5, cnt:16
i:6, cnt:16
i:7, cnt:16
: :
つづく

変数 i は 1からcntまでを繰り返す、変数 cnt は 2づつ増える

0Like

Your answer might help someone💌