[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ループ』(イッコウ)
シート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
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
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 部分は 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.