[[20230405113831]] 『Nextに対応するForがありませんと出るのですが』(AR) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Nextに対応するForがありませんと出るのですが』(AR)

下記VBAを回そうとしているのですがNextに対応するForがありませんと出るのですが
何が足りていないのでしょうかすみませんがご教授ください

Sub データまとめ()

C = 1

T = 2
t2 = T - 1
y = 1

kT = 3
ky = 7
R = Worksheets("PowerQuery").Cells(Rows.Count, 2).End(xlUp).Row
Dim rowsData As Long

        Cells(1, 1) = 7 - WorksheetFunction.CountIf(Worksheets("PowerQuery").Range("K" & T & ":  P" & T), "")

        Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)  
        Cells(kT, 2) = Worksheets("PowerQuery").Cells(T, y)        
        Cells(kT, 3) = Worksheets("PowerQuery").Cells(T, y + 2)    
        Cells(kT, 4) = Worksheets("PowerQuery").Cells(T, y + 3)    
        Cells(kT, 5) = Worksheets("PowerQuery").Cells(T, y + 5)    
        Cells(kT, 6) = Worksheets("PowerQuery").Cells(1, y + 10)   
ky = ky + 1
        T = T + 1
        t2 = T - 1

Dim i
Dim q
For i = 4 To R

     If Worksheets("PowerQuery").Cells(T, y) = Worksheets("PowerQuery").Cells(t2, y) Then         
     If Worksheets("PowerQuery").Cells(T, y + 2) = Worksheets("PowerQuery").Cells(t2, y + 2) Then 
     If Worksheets("PowerQuery").Cells(T, y + 3) = Worksheets("PowerQuery").Cells(t2, y + 3) Then 
     If Worksheets("PowerQuery").Cells(T, y + 5) = Worksheets("PowerQuery").Cells(t2, y + 5) Then 
     If Worksheets("PowerQuery").Cells(T, y + 10) = "" Then                                 

     T = T + 1

     Else

        Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)
        ky = ky + 1
        T = T + 1
        t2 = T - 1
  End If

      Else
        ky = 7
        kT = kT + 1
        Cells(kT, 2) = Worksheets("PowerQuery").Cells(T, y)        
        Cells(kT, 3) = Worksheets("PowerQuery").Cells(T, y + 2)    
        Cells(kT, 4) = Worksheets("PowerQuery").Cells(T, y + 3)    
        Cells(kT, 5) = Worksheets("PowerQuery").Cells(T, y + 5)    
        Cells(kT, 6) = Worksheets("PowerQuery").Cells(1, y + 10)   
        Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)  
        ky = ky + 1
        T = T + 1
        t2 = T - 1

    End If

    Else

        kT = kT + 1
        ky = 7
        Cells(kT, 2) = Worksheets("PowerQuery").Cells(T, y)        
        Cells(kT, 3) = Worksheets("PowerQuery").Cells(T, y + 2)    
        Cells(kT, 4) = Worksheets("PowerQuery").Cells(T, y + 3)    
        Cells(kT, 5) = Worksheets("PowerQuery").Cells(T, y + 5)    
        Cells(kT, 6) = Worksheets("PowerQuery").Cells(1, y + 10)   
        Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)  
        ky = ky + 1
        T = T + 1
        t2 = T - 1
    End If

 Next i

End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


インデントをつけるとこうなります。(ツールにさせています)
間違いの修正はそちらで検討してみてください。

Sub データまとめ()

    c = 1
    T = 2
    t2 = T - 1
    y = 1

    kT = 3
    ky = 7
    r = Worksheets("PowerQuery").Cells(Rows.Count, 2).End(xlUp).Row
    Dim rowsData As Long

    Cells(1, 1) = 7 - WorksheetFunction.CountIf(Worksheets("PowerQuery").Range("K" & T & ":  P" & T), "")

    Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)
    Cells(kT, 2) = Worksheets("PowerQuery").Cells(T, y)
    Cells(kT, 3) = Worksheets("PowerQuery").Cells(T, y + 2)
    Cells(kT, 4) = Worksheets("PowerQuery").Cells(T, y + 3)
    Cells(kT, 5) = Worksheets("PowerQuery").Cells(T, y + 5)
    Cells(kT, 6) = Worksheets("PowerQuery").Cells(1, y + 10)
    ky = ky + 1
    T = T + 1
    t2 = T - 1

    Dim i
    Dim q
    For i = 4 To r
        If Worksheets("PowerQuery").Cells(T, y) = Worksheets("PowerQuery").Cells(t2, y) Then
            If Worksheets("PowerQuery").Cells(T, y + 2) = Worksheets("PowerQuery").Cells(t2, y + 2) Then
                If Worksheets("PowerQuery").Cells(T, y + 3) = Worksheets("PowerQuery").Cells(t2, y + 3) Then
                    If Worksheets("PowerQuery").Cells(T, y + 5) = Worksheets("PowerQuery").Cells(t2, y + 5) Then
                        If Worksheets("PowerQuery").Cells(T, y + 10) = "" Then
                            T = T + 1
                        Else
                            Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)
                            ky = ky + 1
                            T = T + 1
                            t2 = T - 1
                        End If
                    Else
                        ky = 7
                        kT = kT + 1
                        Cells(kT, 2) = Worksheets("PowerQuery").Cells(T, y)
                        Cells(kT, 3) = Worksheets("PowerQuery").Cells(T, y + 2)
                        Cells(kT, 4) = Worksheets("PowerQuery").Cells(T, y + 3)
                        Cells(kT, 5) = Worksheets("PowerQuery").Cells(T, y + 5)
                        Cells(kT, 6) = Worksheets("PowerQuery").Cells(1, y + 10)
                        Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)
                        ky = ky + 1
                        T = T + 1
                        t2 = T - 1
                    End If
                Else
                    kT = kT + 1
                    ky = 7
                    Cells(kT, 2) = Worksheets("PowerQuery").Cells(T, y)
                    Cells(kT, 3) = Worksheets("PowerQuery").Cells(T, y + 2)
                    Cells(kT, 4) = Worksheets("PowerQuery").Cells(T, y + 3)
                    Cells(kT, 5) = Worksheets("PowerQuery").Cells(T, y + 5)
                    Cells(kT, 6) = Worksheets("PowerQuery").Cells(1, y + 10)
                    Cells(kT, ky) = Worksheets("PowerQuery").Cells(T, y + 10)
                    ky = ky + 1
                    T = T + 1
                    t2 = T - 1
                End If
            Next i
        End Sub

(xyz) 2023/04/05(水) 11:48:25


>Nextに対応するForがありません

馬鹿正直にこれに反応してはダメだよ。

(名無し) 2023/04/05(水) 11:57:26


そのエラーはステートメントの始めと終わりが不完全なときに出てきます。
(必ずしもForとNextだけに限りません)

 For...Next
 If...End If
 With...End With

これらがちゃんとできているか調べてみましょう。
(火災報知器) 2023/04/05(水) 12:17:17


IFの入れ子は、解らなくなるから

If aaa Then
と書いたら、

If aaa Then

end if

と初めに書いておくのも手。
私は、こうしてます。
(三個) 2023/04/05(水) 12:37:19


 Select caseに変更するっていうのもありかも
	Sub データまとめ()
	    Dim wsPQ As Worksheet: Set wsPQ = Worksheets("PowerQuery")
	    Dim c As Long, T As Long, t2 As Long, y As Long
	    Dim kT As Long, ky As Long
	    Dim r As Long
	    Dim i As Long
	    Dim q As Long
	    c = 1
	    T = 2
	    t2 = T - 1
	    y = 1
	    kT = 3
	    ky = 7
	    r = wsPQ.Cells(Rows.Count, 2).End(xlUp).Row
	    Dim rowsData As Long
	    Cells(1, 1) = 7 - WorksheetFunction.CountIf(wsPQ.Range("K" & T & ":  P" & T), "")
	    Cells(kT, ky) = wsPQ.Cells(T, y + 10)
	    Cells(kT, 2) = wsPQ.Cells(T, y)
	    Cells(kT, 3) = wsPQ.Cells(T, y + 2)
	    Cells(kT, 4) = wsPQ.Cells(T, y + 3)
	    Cells(kT, 5) = wsPQ.Cells(T, y + 5)
	    Cells(kT, 6) = wsPQ.Cells(1, y + 10)
	    ky = ky + 1
	    T = T + 1
	    t2 = T - 1
	    For i = 4 To r
	        Select Case False
	            Case wsPQ.Cells(T, y) = wsPQ.Cells(t2, y)
	                '何もしない
	            Case wsPQ.Cells(T, y + 2) = wsPQ.Cells(t2, y + 2)
	                '何もしない
	            Case wsPQ.Cells(T, y + 3) = wsPQ.Cells(t2, y + 3)
	                'y + 3 より前がTrue且つ、y + 3がFalseの場合の処理
	                kT = kT + 1
	                ky = 7
	                Cells(kT, 2) = wsPQ.Cells(T, y)
	                Cells(kT, 3) = wsPQ.Cells(T, y + 2)
	                Cells(kT, 4) = wsPQ.Cells(T, y + 3)
	                Cells(kT, 5) = wsPQ.Cells(T, y + 5)
	                Cells(kT, 6) = wsPQ.Cells(1, y + 10)
	                Cells(kT, ky) = wsPQ.Cells(T, y + 10)
	                ky = ky + 1
	                T = T + 1
	                t2 = T - 1
	            Case wsPQ.Cells(T, y + 5) = wsPQ.Cells(t2, y + 5)
	                'y + 5 より前がTrue且つ、y + 5がFalseの場合の処理
	                ky = 7
	                kT = kT + 1
	                Cells(kT, 2) = wsPQ.Cells(T, y)
	                Cells(kT, 3) = wsPQ.Cells(T, y + 2)
	                Cells(kT, 4) = wsPQ.Cells(T, y + 3)
	                Cells(kT, 5) = wsPQ.Cells(T, y + 5)
	                Cells(kT, 6) = wsPQ.Cells(1, y + 10)
	                Cells(kT, ky) = wsPQ.Cells(T, y + 10)
	                ky = ky + 1
	                T = T + 1
	                t2 = T - 1
	            Case Else
	                '上記がすべてTrueの場合の処理
	                If wsPQ.Cells(T, y + 10) = "" Then
	                    T = T + 1
	                Else
	                    Cells(kT, ky) = wsPQ.Cells(T, y + 10)
	                    ky = ky + 1
	                    T = T + 1
	                    t2 = T - 1
	                End If
	        End Select
	    Next
	End Sub
 13:35シートの変数が中途半端に置換されていたので修正
(稲葉) 2023/04/05(水) 12:52:20

下記だと回るのですが何故だかわかりますか?

Sub 結果まとめ()

c = 1

t = 2
t2 = t - 1
y = 1

kT = 3
ky = 5
r = Worksheets("test").Cells(Rows.Count, 2).End(xlUp).Row
Dim rowsData As Long
Cells(1, 1) = 7 - WorksheetFunction.CountIf(Worksheets("test").Range("C" & t & ": I" & t), "")

Cells(kT, ky) = Worksheets("test").Cells(t, y + 2)
Cells(kT, 2) = Worksheets("test").Cells(t, y)
Cells(kT, 3) = Worksheets("test").Cells(t, y + 1)
Cells(kT, 4) = Worksheets("test").Cells(1, y + 2)
ky = ky + 1

        t = t + 1
        t2 = t - 1

Dim i
Dim q
For i = 4 To r

If Worksheets("test").Cells(t, y) = Worksheets("test").Cells(t2, y) Then

   If Worksheets("test").Cells(t, y + 1) = Worksheets("test").Cells(t2, y + 1) Then 

     If Worksheets("test").Cells(t, y + 2) = "" Then

     t = t + 1

     Else

        Cells(kT, ky) = Worksheets("test").Cells(t, y + 2)
        ky = ky + 1
        t = t + 1
        t2 = t - 1
  End If

      Else
        ky = 5
        kT = kT + 1
        Cells(kT, 2) = Worksheets("test").Cells(t, y)
        Cells(kT, 3) = Worksheets("test").Cells(t, y + 1)
        Cells(kT, 4) = Worksheets("test").Cells(1, y + 2)
        Cells(kT, ky) = Worksheets("test").Cells(t, y + 2)
        ky = ky + 1
        t = t + 1
        t2 = t - 1

    End If

    Else

        kT = kT + 1
        ky = 5
        Cells(kT, 2) = Worksheets("test").Cells(t, y)
        Cells(kT, 3) = Worksheets("test").Cells(t, y + 1)
        Cells(kT, 4) = Worksheets("test").Cells(1, y + 2)
        Cells(kT, ky) = Worksheets("test").Cells(t, y + 2)
        ky = ky + 1
        t = t + 1
        t2 = t - 1
    End If

    Next i
End Sub
(AR) 2023/04/05(水) 14:13:03

>下記だと回るのですが何故だかわかりますか?

皆して散々言っているの分かってんの? 皆さんのご意見・ご忠告ちゃんと聞いたらどないやねん。

(名無し) 2023/04/05(水) 15:14:48


 Sub データまとめ()
    Dim ws As Worksheet
    Dim T As Long, t2 As Long
    Dim kt As Long, ky As Long
    Dim R As Long, y As Long
    Dim buf As Boolean

    '転記元シートを設定
    Set ws = Worksheets("PowerQuery")
    '転記元最終行を設定
    R = ws.Cells(Rows.Count, 2).End(xlUp).Row - 1
    '転記元先頭列を設定
    y = 1

    '転記先先頭行-1を設定(転記部分のコードで転記前に+1するため)
    kt = 2

    '転記元先頭行から最終行まで巡回
    For T = 2 To R
        '転記判定をリセット
        buf = False
        '比較行が設定されているかで分岐
        If t2 > 0 Then
            '比較行が設定されている(1以上)場合は転記元行の値と比較行の値を比較する
            '転記元の4つの列(基準列、基準列+2、基準列+3、基準列+5)の値を比較行の同一列の値と比較し
            '一つ以上異なる値がある(「すべて同一」ではない)場合は転記判定をTrue
            buf = (ws.Cells(T, y) <> ws.Cells(t2, y) Or _
                   ws.Cells(T, y + 2) <> ws.Cells(t2, y + 2) Or _
                   ws.Cells(T, y + 3) <> ws.Cells(t2, y + 3) Or _
                   ws.Cells(T, y + 5) <> ws.Cells(t2, y + 5))
        Else
            '比較行が設定されていない場合は転記判定をTrueにする(転記元先頭行のみ)
            buf = True
        End If

        '転記判定Trueの場合
        If buf Then
            '転記先の行を+1
            kt = kt + 1
            '転記先最終列を7にリセット
            ky = 7
            'アクティブシートのB〜F列(のkt行)に転記元T行の4つの列の値及び転記元基準列+10列目の1行目の値を転記
            Cells(kt, 2) = ws.Cells(T, y)
            Cells(kt, 3) = ws.Cells(T, y + 2)
            Cells(kt, 4) = ws.Cells(T, y + 3)
            Cells(kt, 5) = ws.Cells(T, y + 5)
            Cells(kt, 6) = ws.Cells(1, y + 10)
            '転記した行を比較行に再設定(次行はこの転記行と比較する)
            t2 = T
        End If
        '転記判定True、または転記元基準列+10列T行目の値が""出ない場合は
        '(上記で転記しなかった(4つの列が上の行と同一)でy+10列に値がある場合はその値を最終列+1に転記する)
        If buf Or ws.Cells(T, y + 10) <> "" Then
            '転記先最終列に転記
            Cells(kt, ky) = ws.Cells(T, y + 10)
            '転記先最終列を一列右に移す
            ky = ky + 1
        End If
    Next
 End Sub

なんとなくこんな感じと想像。
(火災報知器) 2023/04/05(水) 15:15:56 ※20:45コード修正


>下記だと回るのですが何故だかわかりますか?
マウスのカーソルがくるくる回っているということ。
実行してみたけど
 r = Worksheets("test").Cells(Rows.Count, 2).End(xlUp).Row
でエラーになりましたよ。

(arar) 2023/04/05(水) 15:32:34


すみません
回答のほどありがとうございます
上記回答踏まえて作ってみます
(AR) 2023/04/05(水) 16:03:42

 Sub データまとめ()
    Dim mWs As Worksheet
    Dim mTLCell As Range
    Dim sTLCell As Range, sTRCell As Range
    Dim cprVar1(3) As Variant, cprVar2(3) As Variant
    Dim mData1 As String, mData2 As String
    Dim mTopRow As Long, mLastRow As Long
    Dim mTopColumn As Long
    Dim mRow As Long
    Dim i As Long
    Dim buf As Boolean

    '転記元シートを設定
    Set mWs = Worksheets("PowerQuery")
    '転記元先頭行を設定
    mTopRow = 2
    '転記元最終行を設定
    mLastRow = mWs.Cells(Rows.Count, "B").End(xlUp).Row - 1
    '転記元先頭列を設定
    mTopColumn = 1
    '転記用変数1にデータ入力
    mData1 = mWs.Cells(1, mTopColumn).Offset(, 10).Value
    '転記先先頭セルを設定
    Set sTLCell = ActiveSheet.Range("B3")
    '転記先末端列を転記先基準セルから6列目に設定
    Set sTRCell = sTLCell.Offset(, 5)
    '転記先A1セルにデータ転記
    ActiveSheet.Cells(1, 1) = 7 - WorksheetFunction.CountIf(mWs.Range("K" & mTopRow & ":  P" & mTopRow), "")
    '転記元先頭行から最終行まで巡回
    For mRow = mTopRow To mLastRow

        '転記元先頭セルを設定
        With mWs.Cells(mRow, mTopColumn)
            '転記判定用比較配列1にデータを入力
            cprVar1(0) = .Value
            cprVar1(1) = .Offset(, 2).Value
            cprVar1(2) = .Offset(, 3).Value
            cprVar1(3) = .Offset(, 5).Value
            '転記用変数2にデータ入力
            mData2 = .Offset(, 10).Value
        End With

        '比較用配列1と2が「すべて同一」ではない場合は転記判定をTrue
        For i = 0 To 3
            buf = (cprVar1(i) <> cprVar2(i))
            If buf Then Exit For
        Next

        '転記判定
        If buf Then
            '転記先基準セルから4列に比較用配列1のデータを入力
            For i = 0 To 3
                sTLCell.Offset(, i).Value = cprVar1(i)
               '比較用配列2に比較用配列1のデータを代入
                cprVar2(i) = cprVar1(i)
            Next
            '転記先基準セルから5列目に転記用変数1のデータを入力
            sTLCell.Offset(, 4).Value = mData1
            '転記先末端列を転記先基準セルから6列目にリセット
            Set sTRCell = sTLCell.Offset(, 5)
            '転記先基準セルを一つ下の行に移す
            Set sTLCell = sTLCell.Offset(1)
        End If

        '転記用変数2が空白でなければ
        If mData2 <> "" Then
            '転記先末端列に転記
            sTRCell.Value = mData2
            '転記先末端列を一列右に移す
            Set sTRCell = sTRCell.Offset(, 1)
        End If
    Next
 End Sub

20:45のものと処理内容は大きく変わっていません
(火災報知器) 2023/04/05(水) 22:28:17


火災報知器さん
ありがとうございます
上記で運用してみます
(AR) 2023/04/06(木) 11:09:38

 言わずもがなと思っていましたが、念のため。

 インデントは非常に重要です。
 コードの構造がわかりやすくなるので是非きちんとつけることを推奨します。
 最初のコードでは、そこがわかりにくく、ハンディキャップを背負っているようなものです。

 コードを記入してエンターを押すと、前行と同じ個所にカーソルが行きます。
 段下げには、スペースキーではなく、タブキーを使って下さい。(一段上げるにはシフト+タブ です)
 そうすれば、普通はインデントが揃いまし、スペースで余計な神経を使う必要もありません。

 IFと End Ifは同数が無いといけません。(一行で終わるIfステートメントはその限りではありませんが。)
 今回はEnd Ifが足りていないので、そのメッセージが出ました。
 Nextにとっては思わぬ濡れ衣ですな。
 同一もしくは、それ以下の深さのコードの中に、そのNextに対する Forが見つからないので、その指摘だされたのでしょう。
 根本原因は If と End Ifの対が不完全だったからです。

 ロジックを分かりやすいものにする方法も大切ですが、
 上記の基本もきちんと押さえることを推奨します。
 今後も常に出てくる話ですから。
(xyz) 2023/04/07(金) 07:36:14

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.