🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

671閲覧

各シートからのデータ取得

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/02/09 07:28

編集2021/02/09 08:24

前提・実現したいこと

シートA,B,C,Dの各対象の列をfor文でループさせ、シート1,2,3,4,5の対象データを取得しようと
しています ※A,B,C,Dでひとつのブック。1,2,3,4,5でひとつのブックとなります。
ただし、シートAのみシート1,2のデータを取得しなければいけない状況です。
シートAとシート1,2のような関係性が今後出てくる可能性があります。

追記
1,下記ソースコードに記載しているplateという変数ですが、3から開始で正しいです。
シート1,2,3,4,5は正しくはシート〇,〇,1,2,3,4,5となります。
2,下記ソースコードのファイル名に関してはブックHがシートA,B,C,D側
ブックGが1,2,3,4,5側になります。

発生している問題・エラーメッセージ

シートAにシート1,2が反映できず、最後まで到達しても2のデータが
取得できない状況です。

該当のソースコード

vba

1Sub transfer() 2 3 '後処理でファイル開く 4 Workbooks.Open "C:\Users\admin\Desktop\H.xlsx" 5 6 '請求書雛形 7 Dim wb1 As Workbook 8 Set wb1 = Workbooks("G.xlsm") 9 plate = 3 10 11 'H.xlsxのシート 12 With Workbooks("H.xlsx") 13 For shename = 1 To Worksheets.Count 14 M_range = 11 15 16 For priname = 7 To Cells(Rows.Count, 5).End(xlUp).Row + 1 17 18 If .Worksheets(shename).Range("E" & priname) = wb1.Worksheets(plate).Name Then 19 If .Worksheets(shename).Range("G" & priname) = wb1.Worksheets(plate).Range("I" & M_range) Then 20 If .Worksheets(shename).Range("H" & priname) = wb1.Worksheets(plate).Range("J" & M_range) Then 21 22 23 '取得したいデータ(1) 24 If wb1.Worksheets(plate).Range("N" & M_range) <> "" Then 25 .Worksheets(shename).Range("L" & priname) = wb1.Worksheets(plate).Range("N" & M_range) 26 End If 27 28 '取得したいデータ(2) 29 If wb1.Worksheets(plate).Range("O" & M_range) <> "" Then 30 .Worksheets(shename).Range("M" & priname) = wb1.Worksheets(plate).Range("O" & M_range) 31 End If 32 33 '取得したいデータ(3) 34 If wb1.Worksheets(plate).Range("P" & M_range) <> "" Then 35 .Worksheets(shename).Range("N" & priname) = wb1.Worksheets(plate).Range("P" & M_range) 36 End If 37 38 '取得したいデータ(4) 39 If wb1.Worksheets(plate).Range("Q" & M_range) <> "" Then 40 .Worksheets(shename).Range("O" & priname) = wb1.Worksheets(plate).Range("Q" & M_range) 41 End If 42 43 '取得したいデータ(5) 44 If wb1.Worksheets(plate).Range("R" & M_range) <> "" Then 45 .Worksheets(shename).Range("P" & priname) = wb1.Worksheets(plate).Range("R" & M_range) 46 End If 47 48 '取得したいデータ(6) 49 If wb1.Worksheets(plate).Range("Z" & M_range) <> "" Then 50 .Worksheets(shename).Range("Q" & priname) = wb1.Worksheets(plate).Range("Z" & M_range) 51 End If 52 53 '取得したいデータ(7) 54 If wb1.Worksheets(plate).Range("T" & M_range) <> "" Then 55 .Worksheets(shename).Range("R" & priname) = wb1.Worksheets(plate).Range("T" & M_range) 56 End If 57 58 '取得したいデータ(8) 59 If wb1.Worksheets(plate).Range("V" & M_range) <> "" Then 60 .Worksheets(shename).Range("S" & priname) = wb1.Worksheets(plate).Range("V" & M_range) 61 End If 62 63 '取得したいデータ(9) 64 If wb1.Worksheets(plate).Range("W" & M_range) <> "" Then 65 .Worksheets(shename).Range("T" & priname) = wb1.Worksheets(plate).Range("W" & M_range) 66 End If 67 68 '取得したいデータ(10) 69 If wb1.Worksheets(plate).Range("Y" & M_range) <> "" Then 70 .Worksheets(shename).Range("U" & priname) = wb1.Worksheets(plate).Range("Y" & M_range) 71 End If 72 73 '取得したいデータ(11) 74 If wb1.Worksheets(plate).Range("AA" & M_range) <> "" Then 75 .Worksheets(shename).Range("V" & priname) = wb1.Worksheets(plate).Range("AA" & M_range) 76 End If 77 78 '取得したいデータ(12) 79 If wb1.Worksheets(plate).Range("AB" & M_range) <> "" Then 80 .Worksheets(shename).Range("W" & priname) = wb1.Worksheets(plate).Range("AB" & M_range) 81 End If 82 End If 83 End If 84 M_range = M_range + 1 85 End If 86 Next priname 87 plate = plate + 1 88 Next shename 89 End With 90 MsgBox "ok" 91 92End Sub

試したこと

for文の中の変数plateの足し算をfor文の外でしてみましたが
結果的に思ったような結果を得れませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

動作確認はできませんが、こんな感じでいい気がします。

VBA

1With Workbooks("H.xlsx") 2 3 'ブックHの各シートを処理 4 For shename = 1 To Worksheets.Count 5 Dim ws1 As Worksheet, ws2 As Worksheet, gName As String 6 7 'ブックHのシートをws1にセット 8 Set ws1 = .Worksheets(shename) 9 10 'シートの7行目から最終行までをループ 11 For priname = 7 To ws1.Cells(Rows.Count, 5).End(xlUp).Row + 1 12 13 'E列の値からブックGのシート名を取得、ws2にセット、開始行は11行目 14 '(取得元シート名が前の行から変化したときのみ) 15 If gName <> ws1.Range("E" & priname) Then 16 gName = ws1.Range("E" & priname) 17 Set ws2 = wb1.Worksheets(gName) 18 M_range = 11 19 End If 20 'ブックGのN列をブックHのL列に転記 21 If ws2.Range("N" & M_range) <> "" Then 22 ws1.Range("L" & priname) = ws2.Range("N" & M_range) 23 End If 24 '他の列も同様に 25 ' 26 ' 27 'ブックHの次の行に進む前にブックGの行も1加算 28 M_range = M_range + 1 29 Next priname 30 Next shename 31End With 32

投稿2021/02/09 12:09

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/09 12:52

コードまで書いていただいたのに申し訳ございません。 一度試してみたところ、ws2が最初のifを通過する時にsetができていない状態なので エラーが出てしまいました。。。
jinoji

2021/02/09 13:10

もともとの Set wb1 = Workbooks("G.xlsm") は残してありますか?
退会済みユーザー

退会済みユーザー

2021/02/10 00:05

あぁ… 消してしまっておりました… 記述頂いたコードに少し改変させて頂いたら上手くまわりました! ご返信遅くなって申し訳ございませんでした。 ありがとうございました!
guest

0

仕様を誤解しているかもしれませんが、こんな感じでしょうか。

・ブックHの全シートについて、各シートの7行目から最終行までを順に処理
・各行のE列に、対応するブックGのシート名が書かれている?
・ブックGの対応するシートの11行目の値を取得?
・(11行目以降にもデータはある??)

VBA

1' 2' 3With Workbooks("H.xlsx") 4 For shename = 1 To Worksheets.Count 5 Dim ws1 As Worksheet, ws2 As Worksheet 6 Set ws1 = .Worksheets(shename) 7 For priname = 7 To ws1.Cells(Rows.Count, 5).End(xlUp).Row + 1 8 Set ws2 = wb1.Worksheets(ws1.Range("E" & priname)) 9 For M_range = 11 To ws2.Cells.SpecialCells(xlCellTypeLastCell).Row 10 If ws2.Range("N" & M_range) <> "" Then 11 ws1.Range("L" & priname) = ws2.Range("N" & M_range) 12 End If 13 ' 14 ' 15 Next M_range 16 Next priname 17 Next shename 18' 19' 20

投稿2021/02/09 08:42

編集2021/02/09 09:01
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/09 11:04

ご返答ありがとうございます。 ブックHの全シートについて~ →その通りです。 各行のE列に、対応するブックGのシート名~ →ブックGのH4に、ブックHのシート名が記入されています。 ブックGの対応するシートの11行目の値を取得? →その通りです。 ・(11行目以降にもデータはある??) はい、12,13以降も続いてデータはございます。 宜しくお願い致します。
jinoji

2021/02/09 11:19

ブックHのある1行に対してブックGの複数行が対応付くように思えますが、 12,13以降のデータはどうなればいいですか? 加算? 結合? それともブックHの行が増える?
退会済みユーザー

退会済みユーザー

2021/02/09 11:41

ブックHの対応行とブックGの対象行はそれおぞれ8つずつになります。 ブックGは11~19迄データがあります 加算結合というよりは、ブックHの対応するセルにブックGの対象のセルを 当て込んでいくイメージです。
guest

0

if分岐並びにデータのコピーを行う際に変数plateを使用していますが、この値の初期値が3です。
そして変数plateはplate = plate + 1という足し算しかしていません。
worksheets(1)とworksheets(2)へのアクセスが出来ないのはこれが原因でしょう。

ちなみに
worksheets(1)は1番目のworksheetを指定
worksheets("1")はシート名「1」を指定
と意味合いが変わります。
シート位置を変更した時に想定通りの動きにならないため覚えておいてください。

投稿2021/02/09 08:00

編集2021/02/09 08:04
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/09 08:07

ご返答ありがとうございます。 上記plateという変数ですが、3から開始で正しいです。 シート1,2,3,4,5は正しくはシート〇,〇,1,2,3,4,5となります。 紛らわしい記載になってしまい、申し訳ございません。
退会済みユーザー

退会済みユーザー

2021/02/09 08:17 編集

sauce内で指定されているファイル名Hとファイル名Gは上記質問だとシートAとシート1,2,3,4どちらがどちらに当たりますか? 請求書雛形がG、明細データがHなのですがひな形データから明細データへと転記する形になっていますがこれは正しいのですね? 後コメントの業務~の名前が出てる部分は削った方がいいと思います。
退会済みユーザー

退会済みユーザー

2021/02/09 08:23

度々ありがとうございます。 まず、コメント欄の件ですが、ご指摘頂きありがとうございます。 本当とんでもないミスだと思います。 以後気をつけます。 ファイル名に関してはブックHがシートA,B,C,D側 ブックGが1,2,3,4,5側になります。 追記させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問