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

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

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

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

Q&A

1回答

2162閲覧

VBA 配列の値を別の配列に代入するときの型エラー

mai_

総合スコア0

VBA

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

0グッド

0クリップ

投稿2022/02/11 14:15

編集2022/02/11 15:06

前提・実現したいこと

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で揃えてみましたが解消せず、でした。

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

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

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

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

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

hatena19

2022/02/11 14:52

実際に動くコードを提示してください。 提示のコードではコンパイルすらできません。 nameという変数名は予約語なので使えない、 構造体XXXは使われていない、hanyouが宣言されていないなど。 また、「構造体(Type)で作った二次元配列」というのも何なのか不明瞭。
guest

回答1

0

この後、標準モジュールに書いた構造体(Type)で作った二次元配列に読み込んだデータを入れたいです。

構造体は2次元配列とは異なります。
構造体のメンバーを配列するのではなく、構造体は1行分のデータを格納して、構造体を配列にします。


ユーザー定義型はVariant変数に入れることはできません。(下記参照)
ユーザー定義型・構造体(Type)|VBA入門

当然、Variant型の配列に入れることもできません。
Dim arHanyou() As VariantDim arHanyou() As hanyou


配列を関数の戻り値にする方法は下記を参照。

VBAで配列を引数・戻り値にする方法 - Qiita


上記の点を考慮してコーディングしてください。

参考コード

vba

1Public Type hanyou 2 order_zip_code As Variant 3 order_address1 As Variant 4 order_address2 As Variant 5 order_name As Variant 6 order_kana As Variant 7End Type 8 9Function test(ary) As hanyou() 10 Dim arHanyou() As hanyou 11 ReDim Preserve arHanyou(UBound(ary)) 12 13 Dim i As Long 14 For i = 1 To UBound(ary) 15 16 arHanyou(i).order_zip_code = ary(i, 21) 17 arHanyou(i).order_address1 = ary(i, 22) 18 arHanyou(i).order_address2 = ary(i, 23) 19 arHanyou(i).order_name = ary(i, 24) 20 arHanyou(i).order_kana = ary(i, 25) 21 Next 22 23 test = arHanyou() 24End Function 25 26Sub Btn_Click() 27 Dim arCSVdata() As String 28 Dim arHanyou() As hanyou 29 30 '二次元配列のサンプルデータ生成 31 ReDim arCSVdata(1 To 2, 21 To 25) 32 arCSVdata(1, 21) = "123-4567" 33 arCSVdata(1, 22) = "東京都" 34 arCSVdata(1, 23) = "新宿区" 35 arCSVdata(1, 24) = "山田" 36 arCSVdata(1, 25) = "ヤマダ" 37 arCSVdata(2, 21) = "234-5678" 38 arCSVdata(2, 22) = "大阪府" 39 arCSVdata(2, 23) = "大阪市" 40 arCSVdata(2, 24) = "鈴木" 41 arCSVdata(2, 25) = "スズキ" 42 43 '二次元配列を構造体配列に変換 44 arHanyou() = test(arCSVdata) 45 46 'arHanyou() の内容の確認 47 Dim i As Long 48 For i = 1 To UBound(arHanyou) 49 Debug.Print arHanyou(i).order_zip_code 50 Debug.Print arHanyou(i).order_address1 51 Debug.Print arHanyou(i).order_address2 52 Debug.Print arHanyou(i).order_name 53 Debug.Print arHanyou(i).order_kana 54 Next 55 56End Sub

投稿2022/02/11 17:39

hatena19

総合スコア34367

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問