前提・実現したいこと
VBAで、CSVファイルを読み込み、そのファイルの中身を加工して、
CSVファイルとして書き出す、ということをやろうとしています。
・ボタンを設置して、起動する
・起動すると、ファイルダイアログが開き、CSVファイルを選択する
・選択したCSVファイルの最終行と列を確認し、二次元配列を宣言
・CSVファイルの内容を二次元配列へ格納
ここまで出来ました。
この後、標準モジュールに書いた構造体(Type)で作った二次元配列に読み込んだデータを入れたいです。
発生している問題・エラーメッセージ
実行時エラー13 型が一致しません。
該当のソースコード
VBA
1Public Type hanyou 2 order_zip_code() As Variant 3 order_address1() As Variant 4 order_name() As Variant 5 order_kana() As Variant 6 order_tel() As Variant 7 order_mail() As Variant 8End Type 9 10Function test(ary) 11 12 Dim i As Long 13 Dim hanyou() As hanyou 14 ReDim Preserve hanyou(UBound(ary)) 15 16 For i = 1 To UBound(ary) 17 18 hanyou(i).order_zip_code = ary(i, 21) 19 hanyou(i).order_address1 = ary(i, 22) 20 hanyou(i).order_address2 = ary(i, 23) 21 hanyou(i).order_name = ary(i, 24) 22 hanyou(i).order_kana = ary(i, 25) 23 24 Next 25 26End Function 27 28 29 30 31Sub Btn_Click() 32 33 Dim ar() 34 Dim arCSVdata() As Variant 35 Dim arHanyou() As Variant 36 37 FileType = "CSV ファイル (*.csv),*.csv" 38 prompt = "CSV File を選択してください" 39 40 '操作したいファイルのパスを取得 41 FilePath = SelectFile(FileType, prompt) 42 If FilePath = False Then 43 End 44 End If 45 46 Set FSO = CreateObject("Scripting.FileSystemObject") 47 With FSO.OpenTextFile(FilePath, 8) 48 ReDim ary(.Line - 1) 49 .Close 50 End With 51 Set FSO = Nothing 52 53 54 arCSVdata() = CsvToArray(FilePath, ar()) 55 56 arHanyou() = test(arCSVdata()) 57End 58 59Function SelectFile(FileType, prompt) As Variant 60 SelectFile = Application.GetOpenFilename(FileType, , prompt) 61End Function 62 63Function CsvToArray(a_sFilePath, a_sArLine()) 64 Dim oFS As New FileSystemObject '// FileSystemObjectインスタンス 65 Dim oTS As TextStream '// TextStream変数 66 Dim sLine '// CSVファイルの行文字列 67 Dim iLineCount '// CSVファイル行数 68 Dim iCommaCount '// カンマ数 69 Dim v '// カンマ分割後の配列 70 Dim i '// ループカウンタ 71 Dim iColumn 72 73 '// 引数のファイルが存在しない場合は処理を終了する 74 If (oFS.FileExists(a_sFilePath) = False) Then 75 Exit Function 76 End If 77 78 '// 最終行を取得するために追加モードで開く 79 Set oTS = oFS.OpenTextFile(a_sFilePath, ForAppending) 80 '// CSVファイルの行数を取得 81 iLineCount = oTS.Line - 1 82 Call oTS.Close 83 84 '// TextStreamオブジェクト作成 85 Set oTS = oFS.OpenTextFile(a_sFilePath) 86 87 i = 0 88 iCommaCount = 0 89 90 '// ファイルループ 91 Do While oTS.AtEndOfStream <> True 92 '// 1行読み込み 93 sLine = oTS.ReadLine 94 95 '// カンマで文字列を分割し配列化 96 v = Split(sLine, ",") 97 98 '// 現在行をカンマで分割した数が今までより多い場合 99 If (iCommaCount < UBound(v)) Then 100 '// 最大カンマ数を更新 101 iCommaCount = UBound(v) 102 End If 103 104 i = i + 1 105 Loop 106 Call oTS.Close 107 108 Erase a_sArLine 109 ReDim a_sArLine(iLineCount - 1, iCommaCount) 110 111 '// TextStreamオブジェクト作成 112 Set oTS = oFS.OpenTextFile(a_sFilePath) 113 114 i = 0 115 116 '// ファイルループ 117 Do While oTS.AtEndOfStream <> True 118 '// 1行読み込み 119 sLine = oTS.ReadLine 120 121 '// カンマで文字列を分割し配列化 122 v = Split(sLine, ",") 123 124 '// カンマ区切り配列をループ 125 For iColumn = 0 To UBound(v) 126 '// カンマ区切りの内容を二次元配列に格納 127 a_sArLine(i, iColumn) = v(iColumn) 128 Next 129 130 i = i + 1 131 Loop 132 Call oTS.Close 133 CsvToArray = a_sArLine 134End Function
試したこと
iが1から始まってるのは、読み込んだCSVの先頭行がカラム名になっているためです。
型をVariantで揃えてみましたが解消せず、でした。
実際に動くコードを提示してください。
提示のコードではコンパイルすらできません。
nameという変数名は予約語なので使えない、 構造体XXXは使われていない、hanyouが宣言されていないなど。
また、「構造体(Type)で作った二次元配列」というのも何なのか不明瞭。
