[[20140924113723]] 『ループ』(イッコウ) ページの最後に飛ぶ

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

 

『ループ』(イッコウ)

 シート1=個人情報
 シート2=基本マスター

 シート2の基本マスターに
 B9・・・転記判定用(○)
 C9〜200まで・・・個人コード
 D9〜200まで・・・整理番号
 E9〜200まで・・・氏名

 を入力しています。
 B9に○が入力された人のみシート1の個人情報にデータを転記したいのです。
 個人情報はA4用紙の指定した位置に転記するように6カ所設けています。
 そこで

 Do While sh2.Cells(i, 2).Value = "○"
       sh1.Cells(3, 20) = sh2.Cells(i, 3)      '個人コード
       sh1.Cells(3, 24) = sh2.Cells(i, 4)      '整理番号
       sh1.Cells(3, 28) = sh2.Cells(i, 5)      '氏名
 i = i + 1

       sh1.Cells(26, 20) = sh2.Cells(i, 3)      '個人コード
       sh1.Cells(26, 24) = sh2.Cells(i, 4)      '整理番号
       sh1.Cells(26, 28) = sh2.Cells(i, 5)      '氏名
 i = i + 1

       sh1.Cells(49, 20) = sh2.Cells(i, 3)      '個人コード
       sh1.Cells(49, 24) = sh2.Cells(i, 4)      '整理番号
       sh1.Cells(49, 28) = sh2.Cells(i, 5)      '氏名
 i = i + 1

       sh1.Cells(3, 53) = sh2.Cells(i, 3)      '個人コード
       sh1.Cells(3, 57) = sh2.Cells(i, 4)      '整理番号
       sh1.Cells(3, 61) = sh2.Cells(i, 5)      '氏名
 i = i + 1

       sh1.Cells(26, 53) = sh2.Cells(i, 3)      '個人コード
       sh1.Cells(26, 57) = sh2.Cells(i, 4)      '整理番号
       sh1.Cells(26, 61) = sh2.Cells(i, 5)      '氏名
 i = i + 1

       sh1.Cells(49, 53) = sh2.Cells(i, 3)      '個人コード
       sh1.Cells(49, 57) = sh2.Cells(i, 4)      '整理番号
       sh1.Cells(49, 61) = sh2.Cells(i, 5)      '氏名
 i = i + 1

       'sh1.PageSetup.PrintArea = "B2:R49"
       'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

   Loop

 Next i
 End If
 End Sub
 と作成したのですがこのマクロではB列に○を入力した人以降6名が転記されてしまい
 ますので、これを基本マスターの○の人の行のみ個人情報に転記を行いたいのですが、ご教授ください。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 詳細はわかりませんが、こんなことでしょうか。

 Sub Sample()
    Dim idx As Long, r As Long
    For r = 1 To sh2.Cells(Rows.Count, "B").End(xlUp).Row
        If sh2.Cells(r, "B").Value = "〇" Then
            Select Case idx Mod 6
                Case 0: c = 20: r = 3
                Case 1: c = 20: r = 26
                Case 2: c = 20: r = 49
                Case 3: c = 53: r = 3
                Case 4: c = 53: r = 26
                Case 5: c = 53: r = 49
            End Select
            sh1.Cells(r, c) = sh2.Cells(i, 3)      '個人コード
            sh1.Cells(r, c + 4) = sh2.Cells(i, 4)  '整理番号
            sh1.Cells(r, c + 8) = sh2.Cells(i, 5)  '氏名
            If idx Mod 6 = 5 Then 印刷処理: データクリア
            idx = idx + 1
        End If
    Next
    If idx Mod 6 <> 0 And idx <> 0 Then 印刷処理 '// 端数処理
 End Sub

(Mook) 2014/09/24(水) 12:15


 実践しようと思いましたがNextに対するforがありません。
 と、出ましたが・・・
(イッコウ) 2014/09/24(水) 13:51

 MOOKさん、横から失礼します。

 End Ifがひとつ抜けていますので、下記の位置に入れて実行してみてください。

            idx = idx + 1
     End If   ← ここに入れる
        End If

(めいぷる) 2014/09/24(水) 14:37


 シート1とシート2を認識するマクロはどこに入れたらよろしいでしょうか?

(イッコウ) 2014/09/24(水) 14:56


 うん?
 End If 足りませんか?
 印刷の部分の If は一行で完結しているので、End If は省略です。

 印刷処理、データクリア は別プロシージャで作成する前提ですけれど、
 それは別途用意してください。

 上記は質問の Do While 〜 Loop に替わるものなので、その前後は現状を想定しています。

(Mook) 2014/09/24(水) 15:12


 > 印刷の部分の If は一行で完結しているので、End If は省略です。
 あ、本当だ。
 「印刷処理: データクリア」の部分をコメントと早とちりしました。
 Mookさん、失礼しました。

(めいぷる) 2014/09/24(水) 15:16


 いえいえ、エラーと聞けば構文がおかしいと思いますよね。
 けれどこちらではエラーが起きていないので、転記か追記による不整合かなぁ、と思います。
(Mook) 2014/09/24(水) 15:49

 subまたはfunctionが定義されていません。となりました
 初歩的なことでしょうけどどこがいけないのでしょうか?

(イッコウ) 2014/09/24(水) 17:12


 上のものをそのまま使うのであれば、

 Sub 印刷処理()
    印刷する処理(質問中のコメントアウトしている処理相当?)
 End Sub

 Sub データクリア()
    転記先をクリアする処理(ないと最終データの端数に前回の分が残ります。)
 End Sub

 を作成してください。

 サブルーチンにするのが良くわからなければ、
 If ... Then
      印刷の処理
      データクリアの処理
 End If
 とそのまま書いてもいいです。
(Mook) 2014/09/24(水) 17:19

 マクロの知識が乏しいためよくわかりません。

 自分なりに作成しましたが
 For r = 1 To sh2.Cells(Rows.Count, "B").End(xlUp).Row
 この部分がデバックになりました。
 なぜでしょうか?
 お願いします。
(イッコウ) 2014/09/25(木) 08:52

 作成した部分は全体を提示してください。
 sh2 のスコープ(有効範囲)はプロシージャ内なので、それぞれで定義が必要です。
(Mook) 2014/09/25(木) 09:46

Sub Sample()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
'
Set sh1 = Sheets("個人情報")
Set sh2 = Sheets("基本マスター")

sh1.Select

    Dim idx As Long, r As Long
    For r = 1 To sh2.Cells(Rows.Count, "B").End(xlUp).Row
        If sh2.Cells(r, "B").Value = "〇" Then
            Select Case idx Mod 6
                Case 0: c = 20: r = 3
                Case 1: c = 20: r = 26
                Case 2: c = 20: r = 49
                Case 3: c = 53: r = 3
                Case 4: c = 53: r = 26
                Case 5: c = 53: r = 49
            End Select
            sh1.Cells(r, c) = sh2.Cells(i, 3)      '個人コード
            sh1.Cells(r, c + 4) = sh2.Cells(i, 4)  '整理番号
            sh1.Cells(r, c + 8) = sh2.Cells(i, 5)  '氏名
            If idx Mod 6 = 5 Then
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True      '印刷処理
            Application.Run "データクリア"

        idx = idx + 1
        End If
    Next
    If idx Mod 6 <> 0 And idx <> 0 Then
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
 End Sub

 Sub データクリア()

    Range( _
        "T3:U3,X3:Y3,AB3:AG3,T26:U26,X26:Y26,AB26:AG26,T49:U49,X49:Y49,AB49:AG49,BA3:BB3,BE3:BF3,BI3:BN3,BA26:BB26,BE26:BF26,BI26:BN26,BA49:BB49,BE49:BF49,BI49:BN49" _
        ).Select
    Range("BI49").Activate
    Selection.ClearContents

    Range("B2").Select
End Sub

 素人なので、実行が出来ない状態ですがよろしくお願いします。
(イッコウ) 2014/09/25(木) 10:22

 まず If 文の書き方を理解ください。

 基本は
   If 条件 Then
       処理1
       処理2
       処理3
   End If

 ですが、単一処理のときのみ、
   If 条件 Then 処理
 と出来ます。

 ですから、まず制御文の整合を取ってください。
 良くわからない場合は、当面は前者だけで書き、後者は封印しても良いと思います。

       Application.Run "データクリア"
 は、
    データクリア
 だけでよいです。

 データクリアの内容は現行でも良さそうですが、
 Sub データクリア()
    Sheets("個人情報").Range( _
           "T3:U3,X3:Y3,AB3:AG3," _
         & "T26:U26,X26:Y26,AB26:AG26," _
         & "T49:U49,X49:Y49,AB49:AG49," _
         & "BA3:BB3,BE3:BF3,BI3:BN3," _
         & "BA26:BB26,BE26:BF26,BI26:BN26," _
         & "BA49:BB49,BE49:BF49,BI49:BN49" ).ClearContents
 End Sub
 程度でよいと思います。

  ActiveWindow.SelectedSheets.PrintOut
 は
  sh1.PrintOut
 かな?

(Mook) 2014/09/25(木) 10:56


Sub Sample()

Dim sh1 As Worksheet

 Dim sh2 As Worksheet
 '
 Set sh1 = Sheets("個人情報")
Set sh2 = Sheets("基本マスター")

sh1.Select

    Dim idx As Long, r As Long
    For r = 1 To sh2.Cells(Rows.Count, "B").End(xlUp).Row
        If sh2.Cells(r, "B").Value = "〇" Then
            Select Case idx Mod 6
                Case 0: c = 20: r = 3
                Case 1: c = 20: r = 26
                Case 2: c = 20: r = 49
                Case 3: c = 53: r = 3
                Case 4: c = 53: r = 26
                Case 5: c = 53: r = 49
            End Select
            sh1.Cells(r, c) = sh2.Cells(i, 3)      '個人コード
            sh1.Cells(r, c + 4) = sh2.Cells(i, 4)  '整理番号
            sh1.Cells(r, c + 8) = sh2.Cells(i, 5)  '氏名
            If idx Mod 6 = 5 Then sh1.PrintOut: データクリア

        idx = idx + 1
        End If
    Next
    If idx Mod 6 <> 0 And idx <> 0 Then sh1.PrintOut

 End Sub
上記マクロに変更しました。
デバックは出なくなりましたが実行はされません。

(イッコウ) 2014/09/25(木) 11:31


 おっと
    For r = 1 To sh2.Cells(Rows.Count, "B").End(xlUp).Row
 はまずいですね。
    For i = 1 To sh2.Cells(Rows.Count, "B").End(xlUp).Row
 にしてください。

 ステップ実行は出来ますか?
 デバッグ方法は早めに習得してください。
 ステップ実行すれば、今回の問題も簡単にわかると思います。
(Mook) 2014/09/25(木) 11:48

ステップ実行は出来ませんでした。
ブレークポイントでしてみましたがよくわかりません。

If sh2.Cells(i, "B").Value = "〇" Thenから
End Ifに
移動して16回でEnd Subに行きます。
その間の作業が行われないのですがどこがおかしいのでしょうか?
(イッコウ) 2014/09/25(木) 15:25


 ここも変更ですね。
        If sh2.Cells(i, "B").Value = "〇" Then
 それぞれの変数が何をしているのかを理解すれば、こういった間違いも見つかると思います。
 (といいわけ --;;)

(Mook) 2014/09/25(木) 15:29


If sh2.Cells(r, "B").Value = "〇" Thenですか?
(イッコウ) 2014/09/25(木) 15:33

 結局いま、コードはどの様になっていますか?

 If sh2.Cells(r, "B").Value = "〇" Then 部分は
 If sh2.Cells(i, "B").Value = "〇" Then で良いと思います。

 気になるのは「○」の違いですが、大丈夫ですか?
 このスレには「〇」と「○」が混ざっている様です。
 セルに入力されているものが「○」で、コードに書かれているものが「〇」だったら
 一致しないので、何も転記されなくて正常ですが。。。
  
(HANA) 2014/09/27(土) 16:43

 このスレには「〇」と「○」が混ざっている様です。

全く気づきませんでした。
○に変更しIf sh2.Cells(i, "B").Value = "○" Then で実行しましたらうまくいきました。
HANAさんMookさんありがとうございました。
(イッコウ) 2014/09/29(月) 09:03


コメント返信:

[ 一覧(最新更新順) ]


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