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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1056閲覧

フォルダ内のファイルを全て開きセルの値を紐づけて取得し一覧へ転記したい

haru4

総合スコア11

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/01/10 07:25

前提・実現したいこと

お世話になります。
行き詰っているので教えてください。

実現したいこと:
“marge“フォルダ内の全てのファイル【検索ファイル.xlsm】のC2の値と一致する値を
当該マクロつきファイル【一覧.xlsm】のF列から探し同一行のM列へ
【検索ファイル.xlsm】のS9の値(日付)を転記したいです。

C2の値は3文字以上の数値で
123・456・789 のようになっているケースと
123 のように“・”を含まないケースがあります。
“・”で分割された値をSplitで検索値に指定したいと考えています。

下記コード
‘Noと紐づくItem(日付)を取得
の部分については
こちらのサイトの

VBA:配列 Keyに紐づくItemの格納がうまくいかない
https://teratail.com/questions/348547

の投稿を引用させて頂きました。

コードを載せることも恥ずかしいのですが...
有識者の方のお力をお借り出来ると幸いです。

よろしくお願いいたします。

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

‘Noと紐づくItem(日付)を取得
With ws exists(No) Then
でエラーになります。

該当のソースコード

Sub

1 2‘margeフォルダパス指定 3Const Path=”C:\AAA\BBB\CCC\marge\ 4 5Dim cnt As Long 6Dim I As Long 7Dim buf As String 8Dim xls As New Excel.Application 9Dim wb As Workbook 10Dim ws As Worksheet 11Dim ws2 As Worksheet 12Dim num As String 13Dim No() As String 14Dim msg As String 15 16Application.ScreenUpdating=False 17 18‘確認メッセージ 19msg=”事前準備①・②は済みましたか?” 20If msgBox(msg,vbYesNo)=vbNo Then Exit Sub 21 22‘margeフォルダ内のファイルを全て開き、日付を取得 23buf=Dir(Path) 24 25cnt=6 26 27Do While buf <>”” 28 29Set wb=xls.Workbooks.Open( Path & buf ) 30Set ws=wb.Worksheets(“sheet4”) 31num=ws.Cells(2,3) 32 33‘dcの作成 34Dim dc As Object 35Set dc=CreateObject(“Scripting.Dictionary”) 36 37‘検索ファイルのC2の値を”・“で区切り、変数Noへ格納 38No=Split(num,”・”) 39For i=0 To UBound(No) 40 41‘Noと紐づくItem(日付)を取得 42Dim arr 43 44With ws exists(No) Then 45dc.Add No,Array(Array(.Cells(15,6))) 46Else 47arr=dc(No) 48ReDim Preserve arr(UBound(arr)+1) 49Arr(UBound(arr))=Array(,Cells(15,6)) 50End If 51 52‘日付を一覧のM列へ転記 53Set ws2=ThisWorkbook.Sheets(“作業シート“) 54Ws2.Cells(dc(No),”M”)=.Cells(15,6).Value 55 56End With 57Next i 58 59Wb.Close Savechanges:=False 60 61buf= Dir () 62 63cnt = cnt + 1 64 65Loop 66 67Set xls= Nothing 68 69Application.ScreenUpdating = True 70 71End Sub 72 73コード

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえず、あなたのマクロを修正しました。

VBA

1Public Sub sample() 2 3 'margeフォルダパス指定 4 Const Path = "C:\AAA\BBB\CCC\marge\" 5 Dim I As Long 6 Dim buf As String 7 Dim wb As Workbook 8 Dim ws As Worksheet 9 Dim ws2 As Worksheet 10 Dim num As String 11 Dim No() As String 12 Dim msg As String 13 Dim dc As Object 14 'dcの作成 15 Set dc = CreateObject("Scripting.Dictionary") 16 Application.ScreenUpdating = False 17 '確認メッセージ 18 msg = "事前準備①・②は済みましたか?" 19 If MsgBox(msg, vbYesNo) = vbNo Then Exit Sub 20 21 Dim row2 As Long 22 Dim maxrow2 As Long 23 Set ws2 = ThisWorkbook.Sheets("作業シート") 24 maxrow2 = ws2.Cells(Rows.Count, "F").End(xlUp).Row 'F列の最大行取得 25 '数値と行番号の記憶 26 For row2 = 1 To maxrow2 27 num = ws2.Cells(row2, "F").Value 28 If num <> "" Then 29 dc(num) = row2 30 End If 31 Next 32 'margeフォルダ内のファイルを全て開き、日付を取得 33 buf = Dir(Path) 34 Do While buf <> "" 35 Set wb = Workbooks.Open(Path & buf) 36 Set ws = wb.Worksheets("sheet4") 37 num = ws.Cells(2, 3) 38 '検索ファイルのC2の値を”・“で区切り、変数Noへ格納 39 No = Split(num, "・") 40 For I = 0 To UBound(No) 41 42 'Noと紐づくItem(日付)を取得 43 If dc.exists(No(I)) Then 44 row2 = dc(No(I)) 45 '日付を一覧のM列へ転記 46 ws2.Cells(row2, "M") = ws.Cells(15, 6).Value 47 End If 48 Next I 49 wb.Close Savechanges:=False 50 buf = Dir() 51 Loop 52 Application.ScreenUpdating = True 53End Sub 54 55

投稿2022/01/10 23:44

tatsu99

総合スコア5438

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

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

haru4

2022/01/11 00:05

早々にご協力頂き誠にありがとうございます。 読み解きつつ修正作業に取り掛かりますので、こちらのコードについて不明点など発生した際には改めて質問させて頂いてよろしいでしょうか。 今後共よろしくお願いいたします。
tatsu99

2022/01/11 00:12

1.Const Path = "C:\AAA\BBB\CCC\marge\"下には拡張子.xlsm以外のファイルはない前提です。 2.【一覧.xlsm】のF列のデータは1行目から開始している前提です。(1行目は見出し行でない) 上記の前提が成立しない場合は、その旨、補足してください。
haru4

2022/01/11 02:00

についてxlsm形式以外のファイルは存在しませんので問題ありません。 2についてフォーマットの仕様通り6行目からに変更しました。 また、他の部分についてですが 一覧のKey範囲の取得が先になるのですね…! 修正して頂いたもので問題なく動作しております。 大変勉強になりました。本当にありがとうございました。
guest

0

とりあえず。

VBA

1With ws 2If Not dc.exists(No) Then 3

投稿2022/01/10 12:31

jinoji

総合スコア4585

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

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

haru4

2022/01/11 00:03

早々のご回答ありがとうございます。 jinoji様に教えて頂いたように、ひとまず修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問