前提
これまで2つのエクセルブックのデータをVBAでJoinし別のエクセルブックを作成していましたが
上流のシステムが変更になり、1つがCSV(UTF-8(BOM付き))のデータになりました。
CSVになったデータのプロパティ設定を変更しただけでは、エラーになり読み込めませんでした。
EXCELデータとCSVデータをJoinして読込む方法はありますでしょうか。
実現したいこと
EXCELデータとCSVデータをJoinして読込む。
EXCELデータ
項目1 | 項目2 |
---|---|
A1 | B1 |
A2 | B2 |
A3 | B3 |
CSVデータ
項目1,項目3
A1,C1
A2,C2
結果
項目1 | 項目2 | 項目3 |
---|---|---|
A1 | B1 | C1 |
A2 | B2 | C2 |
A3 | B3 |
※実際はWhere句でデータの絞り込み等を行っています。
発生している問題・エラーメッセージ
実行時エラー -214721865(80040e) オブジェクト 'C:\temp\CSV\test[BOM].CSV' が見つかりませんでした。 オブジェクトが存在していること、名前やパス名が正しいことを確認してください。
該当のソースコード
VBA
1'エクセルファイル読み込み用 2Dim SelFile1 As Variant 3Dim ConFile1 As String 4Dim cn1 As New ADODB.Connection 5Dim Rs1 As New ADODB.Recordset 6Dim sEXTENDED1 As String 7Dim sSrcDir1 As String ' 接続先フォルダ 8Dim select1 As String 9Dim FSO1, PathName1 As String, FileName1 As String 10 11'CSVファイル読み込み用 12Dim SelFile2 As Variant 13Dim ConFile2 As String 14Dim cn2 As New ADODB.Connection 15Dim Rs2 As New ADODB.Recordset 16Dim sEXTENDED2 As String 17Dim sSrcDir2 As String ' 接続先フォルダ 18Dim select2 As String 19Dim FSO2, PathName2 As String, FileName2 As String 20 21Dim Wb As Workbook 22 23’※EXCELとCSVを個別に読込テストしたロジックも残していますので、無意味な個所もあり。 24Sub TEST1() 25 26 'エクセルファイル指定 27 SelFile1 = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 28 If VarType(SelFile1) = vbBoolean Then 29 Exit Sub 30 End If 31 ConFile1 = "TEXT;" & SelFile1 32 33 'CSVファイル指定 34 SelFile2 = Application.GetOpenFilename("CSVファイル(*.csv),*.csv?") 35 If VarType(SelFile2) = vbBoolean Then 36 Exit Sub 37 End If 38 ConFile2 = "TEXT;" & SelFile2 39 40 Set FSO1 = CreateObject("Scripting.FileSystemObject") 41 FileName1 = FSO1.GetFileName(SelFile1) 42 PathName1 = FSO1.GetParentFolderName(SelFile1) 43 sSrcDir1 = PathName1 44 45 Set FSO2 = CreateObject("Scripting.FileSystemObject") 46 FileName2 = FSO2.GetFileName(SelFile2) 47 PathName2 = FSO2.GetParentFolderName(SelFile2) 48 sSrcDir2 = PathName2 49 50 'CSV(UTF-8)用にSchema.iniを作成 51 Open PathName2 & "\Schema.ini" For Output As #1 52 Print #1, "[" & FileName2 & "]" 53 Print #1, "CharacterSet=65001" 54 Print #1, "Format = CSVDelimited" 55 Print #1, "ColNameHeader = True" 56 Print #1, "MaxScanRows = 0" 57 Close #1 58 59 ' プロパイダの設定 60 cn1.Provider = "Microsoft.ACE.OLEDB.16.0" 61 62 ' 読み込むファイルの格納フォルダのパス 63 cn1.Properties("Data Source") = sSrcDir1 64 65 ' その他のプロパティの設定 66 sEXTENDED1 = "Excel 12.0" 67 sEXTENDED1 = sEXTENDED1 & ";HDR=Yes" 68 cn1.Properties("Extended Properties").Value = sEXTENDED1 69 70 ' 接続開始 71 cn1.Open SelFile1 72 73 ' プロパイダの設定 74 cn2.Provider = "Microsoft.ACE.OLEDB.16.0" 75 ' 読み込むファイルの格納フォルダのパス 76 cn2.Properties("Data Source") = sSrcDir2 77 78 ' その他のプロパティの設定 79 sEXTENDED2 = "TEXT" 80 sEXTENDED2 = sEXTENDED2 & ";FMT=Delimited" 81 sEXTENDED2 = sEXTENDED2 & ";HDR=Yes" 82 cn2.Properties("Extended Properties").Value = sEXTENDED2 83 84 ' 接続開始 85 cn2.Open 86 87 select1 = "SELECT t01.*,t02.* " 88 select1 = select1 & "FROM [" & SelFile1 & "].[Sheet1$] as t01 " 89 select1 = select1 & "LEFT OUTER JOIN [" & SelFile2 & "] as t02 " 90 select1 = select1 & "on t01.[項目1] = t02.[項目1] " 91 ' SQL実行 92 Rs1.Open select1, cn1 93 94 If Rs1.EOF Then 95 ' 結果が1行もない場合終わり 96 Else 97 ' 結果をそのまま表示 98 Set Wb = Workbooks.Add 99 Wb.Worksheets(1).Select 100 101 Cells(20, 1).CopyFromRecordset Rs1 102 'Cells(20, 20).CopyFromRecordset Rs2 '個別に読み込んだ結果の格納時に使用 103 104 End If 105 106 Rs1.Close 107 cn1.Close 108 Rs2.Close 109 cn2.Close 110 111PROC_EXIT: 112 On Error Resume Next 113 114 ' 後処理 115 Set Rs1 = Nothing 116 Set cn1 = Nothing 117 Set Rs2 = Nothing 118 Set cn2 = Nothing 119 120 Exit Sub 121 122PROC_ERR: 123 MsgBox "ADO接続(CSV/TEXT)エラー:" & Err.Description & "(" & Err.Number & ")" & vbCrLf & sSrcDir1 & vbCrLf & sSrcDir2, vbCritical 124 GoTo PROC_EXIT 125 126End Sub
試したこと
Joinしなければ、EXCELデータ、CSVデータを個別には読み込むことはできました。
補足情報(FW/ツールのバージョンなど)
EXCEL 2016

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/13 04:33