質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

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

Q&A

解決済

1回答

809閲覧

特定フォルダ内Excelの自動転記

jabe

総合スコア43

VBA

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

0グッド

0クリップ

投稿2022/08/22 01:58

実現したいこと

●指定年度範囲のフォルダを探し、ファルダ内Excel内容を集計表へ転記
<条件>
・集計表Excelの指定年度で合致したフォルダ内のExcelから、集計表の10行目以降に転記。
1ファイル1行転記
・指定年度:集計表ExcelのB2からB3
・集計表フォルダパス_C:\Users\xxxxxx.yyy\Desktop\共通\50_VBA\フォルダ検索処理\集計表
・検索フォルダパス_C:\Users\xxxxxx.yyy\Desktop\共通\50_VBA\フォルダ検索処理\転記元
※xxxxxx.yyyは個人情報になる為xyで表示しました。
・検索条件:以下図1の通り、集計表yyyyと検索フォルダ名の6桁目から9桁のyyyyで照合し合致フォルダ内Excelの処理→2020と2020で合致
パターン①:B2が2020でB3が空白の場合、2065-2020年度フォルダ内Excelのみ処理
パターン②:B2が2020でB3が2021の場合、2065-2020年度、2165-2021年度フォルダ内Excelを処理
※2065-2020年度フォルダの桁数は変わらず、年度毎に手動で増えていく。
例.2023の場合、2365-2023年のように
●検索条件_図1
イメージ説明
●集計表ファイル構成
イメージ説明
●集計表ファイル(VBA実行ファイル)
イメージ説明
●検索フォルダ構成
イメージ説明
●検索ファイル構成※検索フォルダの2265-2022年度フォルダの中身
イメージ説明
●検索ファイル中身※ファイルフォーマットは全て同じ
イメージ説明

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

・指定年度範囲のフォルダを探すコードが分からなく相談させていただきました。
・現コードはコード内で対象フォルダパスを指定してでの処理になってしまっています。

エラーメッセージ

該当のソースコード

VBA

1Sub 転記処理() 2 3Const source As String = "C:\Users\z09071.SWN\Desktop\共通\50_VBA\フォルダ検索処理\転記元\2065-2020年度" 4Const copy As String = "C:\Users\z09071.SWN\Desktop\共通\50_VBA\フォルダ検索処理\集計表" 5Dim ws1 As Worksheet 6Set ws1 = ThisWorkbook.Worksheets("集計表") 7Dim fs As FileSystemObject 8Set fs = New Scripting.FileSystemObject 9Dim myfolder As Folder 10Set myfolder = fs.GetFolder("C:\Users\z09071.SWN\Desktop\共通\50_VBA\フォルダ検索処理\転記元\2065-2020年度") 11 12If ws1.FilterMode = True Then '集計表ソートクリア条件式 13 ws1.ShowAllData 14End If 15ws1.Rows("10:" & Rows.Count).ClearContents 'データ削除 16 17Dim myfile As File 'フォルダ内ファイル繰返し処理 18For Each myfile In myfolder.Files 19 If fs.GetExtensionName(myfile) = "xlsx" Then '拡張子xlsxのファイルを対象に処理を行う 20 Dim wb As Workbook 21 Set wb = Workbooks.Open(Filename:=myfile) 22 Dim ws2 As Worksheet 23 Set ws2 = wb.Worksheets(1) 24 ws1.Cells(10 + i, 1).Value = ws2.Cells(1, 2).Value 25 ws1.Cells(10 + i, 2).Value = ws2.Cells(2, 2).Value 26 ws1.Cells(10 + i, 3).Value = ws2.Cells(3, 2).Value 27 ws1.Cells(10 + i, 4).Value = ws1.Cells(10 + i, 2).Value * ws1.Cells(10 + i, 3).Value 28 ws1.Cells(10 + i, 5).Value = ws2.Cells(4, 2).Value 29 i = i + 1 30 31 wb.Close 32 Set ws2 = Nothing 33 Set wb = Nothing 34 End If 35 Next 36 Set myfolder = Nothing 37 Set fs = Nothing 38 39End Sub

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記でどうでしょう。

vba

1Public Sub Sample() 2 Dim ws1 As Worksheet 3 Set ws1 = ThisWorkbook.Worksheets("集計表") 4 5 Dim fromYear As Long, toYear As Long 6 fromYear = Val(ws1.Range("B2")) 7 toYear = Val(ws1.Range("B3")) 8 If toYear = 0 Then toYear = fromYear 9 10 Dim i As Long, folderName As String 11 For i = fromYear To toYear 12 folderName = Right(i, 2) & "65-" & i & "年度" 13 Debug.Print folderName 'フォルダー名確認用 14 15 16 'フォルダ内ファイル繰返し処理 17 '略 18 19 Next 20End Sub

投稿2022/08/22 04:37

hatena19

総合スコア34352

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

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

jabe

2022/08/23 01:55

コード作成ありがとうございます。 問題なく動作できました。助かりました。 ・文字の切出し、結合を用いてfor文で対象フォルダを探す点が勉強になりました。 folderName = Right(i, 2) & "65-" & i & "年度" また、以下のようにendifで閉じなくてもif文は動作するんですね。 If toYear = 0 Then toYear = fromYear
hatena19

2022/08/23 02:21

If文は1行で記述する場合は end If は不要ですね。
jabe

2022/08/23 02:48

回答ありがとうございます。 なるほどです。
jabe

2022/08/23 05:29

もう一点教えて下さい。 以下コードでfromYearとtoYearをsetで格納しましたら、オブジェクトエラーが出てしまいました。 理由は何になるのでしょうか?set fromYear = Val(ws1.Range("B2")) Dim fromYear As Long, toYear As Long fromYear = Val(ws1.Range("B2")) toYear = Val(ws1.Range("B3"))
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問