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

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

詳細はこちら
VBA

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

Q&A

解決済

2回答

897閲覧

別ブックとのセル値転記

jabe

総合スコア43

VBA

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

0グッド

0クリップ

投稿2021/02/28 08:25

前提・実現したいこと

①特定フォルダ内の全ファイル(転記先)に対して以下条件で照合
条件:ファイル名頭文字4桁を抽出し、2021と合致するファイルを開く
②開いたファイルのセルB2を変数Aへ格納
③変数Aをマクロ実行ファイル(転記元)のセルB2へ以下条件で転記
条件:1回目_B2→2回目_B3等

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

・開いたファイルを都度閉じたのですが、Closeコードがエラーになってしまいます。 ・転記先ファイルに対して、For文がエラーになってしまいます。 ・2021と合致したファイル名を検索対象としてるのですが、すべてのファイルを開かれてしまいます。 ※2022,2023ファイルが開かれてしまいます。

該当のソースコード

VBA

1Sub 別ブックとのセル値転記() 2Const TenkiSaki As String = "C:\Users\nakagami\Desktop\サンプル" '転記先ファイルパス 3Const TenkiMoto As String = "C:\テスト" '転記元ファイルパス 4Dim TS As String '転記先ファイル名変数 5Dim TM As String '転記元ファイル名変数 6Dim TSname As String 7Dim TMname As String 8Dim A As Range 9Dim lastrow As String 10TS = Dir(TenkiSaki & "\2021_集計表.xlsm") '転記先ファイル名取得 11TSname = Left(TS, 4) '転記先ファイル名の年度抽出(ファイル名左から4番目まで) 12TM = Dir(TenkiMoto & "*xlsx") '転記元ファイル名取得 13TMname = Left(TM, 4) '転記元ファイル名の年度抽出(ファイル名左から4番目まで) 14Do While TM <> "" '転記元フォルダ内が空白になるまで繰返す 15 If TSname = TMname Then '年が合致する時は以下処理を実行 16 Workbooks.Open (TenkiMoto & "\" & TM) '対象転記元ファイルを開く 17 Set A = Workbooks(TM).Worksheets(1).Cells(2, 2) 18 For i = 2 To lastrow 19 Workbooks(TS).Worksheets(1).Cells(i, 2) = A 20 Next i 21 Workbooks.Close (TenkiMoto & "\" & TM) 22 End If 23 TM = Dir() 24 25Loop 26 27End Sub

補足情報(FW/ツールのバージョンなど)

●転記元フォルダ中身
イメージ説明
●転記元ファイル中身
・2021_02.xlxs
![イメージ説明
・2021_02.xlxs
イメージ説明

●転記先ファイル中身
・2021_集計表.xlsm
イメージ説明

ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2021/02/28 09:19

エラーの詳細は分かりませんか?
jabe

2021/02/28 12:46

返信ありがとうございます。 エラーは、引数の数が一致していません。というエラーが発生しました。
guest

回答2

0

このマクロが転記先のファイルに記述されていると勝手に想定して、
以下のように書き換えてみました。

VBA

1Sub 別ブックとのセル値転記() 2 Const TenkiMoto As String = "C:\テスト\" '転記元ファイルパス 3 Dim TSsheet As Worksheet 4 Dim TSname As String 5 Dim TM As String '転記元ファイル名変数 6 Dim lastRow As Long 7 Dim TMbook As Workbook 8 9 TSname = Left(ThisWorkbook.Name, 4) '転記先ファイル名の年度抽出(ファイル名左から4番目まで) 10 Set TSsheet = ThisWorkbook.Worksheets(1) 11 lastRow = TSsheet.Cells(Rows.Count, 2).End(xlUp).Row 12 13 TM = Dir(TenkiMoto & TSname & "*.xlsx") '転記元ファイル名取得 14 Do While TM <> "" '転記元フォルダ内が空白になるまで繰返す 15 lastRow = lastRow + 1 16 Set TMbook = Workbooks.Open(TenkiMoto & TM) '対象転記元ファイルを開く 17' TSsheet.Cells(lastRow, 1).Value = TMbook.Worksheets(1).Cells(2, 1).Value 18 TSsheet.Cells(lastRow, 2).Value = TMbook.Worksheets(1).Cells(2, 2).Value 19 TMbook.Close False 20 TM = Dir() 21 Loop 22End Sub 23

投稿2021/02/28 11:23

jinoji

総合スコア4592

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

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

jabe

2021/02/28 12:39

親切な回答ありがとうございます。 イメージ通りの動きになりました。 一点質問なのですが、TM = Dir(TenkiMoto & TSname & "*.xlsx")のコードで合致条件かどうか判別しているという事でしょうか? 1回目(2021_01)は、TM変数へDir関数取得したファイル名を格納 2回目(2021_02)は、TM=Dir()で返されたファイル名が格納されたTM変数とDir(TenkiMoto & TSname & "*.xlsx")で取得したファイル名を比較し合致 3回目(2022_01)は、TM=Dir()で返されたファイル名が格納されたTM変数とDir(TenkiMoto & TSname & "*.xlsx")で取得したファイル名を比較し、不一致
jinoji

2021/02/28 13:14

2回目以降のDir()は、1回目の条件を引き継ぎますよね。 元のコードだって *xlsx" の条件に合うもののみを順番に取得する動きだったわけで、 それを "2021*.xlsx" の条件に合うもののみを順番に取得するように変えただけです。
jinoji

2021/02/28 13:40

qnoirさんの回答でお気づきと思いますが、 元のコードだと、そもそも TMname には1回目のファイルでセットしたまま書き換わらないので 意図したとおりに動いていなかったと思います。 それはそれとして、 元のコードがフォルダ内の全Excelファイルでループしていたのを、 Dirの1回目の条件にTSnameも含めることで、2021で始まるExcelファイルだけのループにした感じです。
jabe

2021/02/28 14:49

理解できました。ご丁寧に回答していただきありがとうございました。 再度勉強してきます。
guest

0

ベストアンサー

・質問文のコードだと、Whileを繰り返すたびにFor文で同じ位置に書きこんでしまっているので
Whileの外にカウンター(i)を作って、転記先ファイルに書き込むたび、iを1ずつ増やしていけばいいと思います。(そもそもlastrowに対して値が計算されていません)
・Closeの使い方を修正。

Sub 別ブックとのセル値転記() Const TenkiSaki As String = "C:\Users\nakagami\Desktop\サンプル" '転記先ファイルパス Const TenkiMoto As String = "C:\テスト" '転記元ファイルパス Dim TS As String '転記先ファイル名変数 Dim TM As String '転記元ファイル名変数 Dim TSname As String Dim TMname As String Dim A As Range Dim lastrow As String Dim i as Long TS = Dir(TenkiSaki & "\2021_集計表.xlsm") '転記先ファイル名取得 TSname = Left(TS, 4) '転記先ファイル名の年度抽出(ファイル名左から4番目まで) TM = Dir(TenkiMoto & "*xlsx") '転記元ファイル名取得 TMname = Left(TM, 4) '転記元ファイル名の年度抽出(ファイル名左から4番目まで) i = 2 Do While TM <> "" '転記元フォルダの検索が終わるまで繰り返す If TSname = TMname Then '年が合致する時は以下処理を実行 Workbooks.Open TenkiMoto & "\" & TM '対象転記元ファイルを開く Set A = Workbooks(TM).Worksheets(1).Cells(2, 2) Workbooks(TS).Worksheets(1).Cells(i, 2) = A i = i + 1 Workbooks(TM).Close End If TM = Dir() TMname = Left(TM, 4) Loop End Sub

投稿2021/02/28 09:17

編集2021/02/28 12:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jabe

2021/02/28 12:45

親切な回答ありがとうございます。 ・lastrowについて、ほんとでした値が格納されていませんでした。 ・close使い方理解しましたありがとうございます。 ●コードを試したのですが、転記元ファイル名すべて転記されてしまいました。 ファイル名頭文字4桁の2021ファイルのみ対象にしたいのですが、どう修正すればよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2021/02/28 13:01

修正しました
jabe

2021/02/28 13:08

早速の回答ありがとうございます。 バッチリイメージ通り動きました。 Do while内で”TM = Dir()”と"TMname = Left(TM, 4)"を回し、各ファイルの検索をかけるのですね。理解しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問