こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CSVから構造体へ代入

お世話になります。
Private Type TestRecord
Col1 As String * 255
Col2 As String * 255
Col3 As String * 255
End Type
Sub ボタン1_Click()

Dim FName As String
Dim FileNo As Integer
Dim LineData As String
Dim TestRec() As TestRecord

FileNo = FreeFile
'選択したファイル名の取得
FName = Application.GetOpenFilename("CSV ファイル (*.CSV),*.CSV")
If FName = "False" Then
Exit Sub
End If

Open FName For Input As #FileNo

Do Until EOF(FileNo)
i = i + 1
Line Input #FileNo, LineData
ReDim TestRec(i)
TestRec() = Split(LineData, ",")
Debug.Print buf
Loop
Close #FileNo
End Sub

ファイルの中身
"テストID1","テスト姓1","テスト名1"
"テストID2","テスト姓2","テスト名2"

以上のコードを実行するとTestRec() =~の部分で型が一致しません
とエラーが出てしまいます。
よき解決方法があれば教えてください。宜しくお願いします。

投稿日時 - 2007-09-07 12:46:29

QNo.3323340

暇なときに回答ください

質問者が選んだベストアンサー

Split()はString配列を返してきます。
ですので、受け取る側がString配列でないので
”型が一致しません”と怒られるのです。

Str() as String
Col as Collection
Do Until EOF(FileNo)
i = i + 1
Line Input #FileNo, LineData
Str() = Split(LineData, ",")
Debug.Print buf
Col.Add(Str)
Loop
Close #FileNo

ReDim TestRec(i)
vnt as Variant
lCnt as Long

For Each vnt In Col
TestRec(lCnt).Col1 = vnt(0)
TestRec(lCnt).Col2 = vnt(1)
TestRec(lCnt).Col3 = vnt(2)
lCnt = lCnt + 1
next

投稿日時 - 2007-09-07 13:22:47

お礼

dsuekichi様,siro7aka7様ご返答ありがとうございます。
要素はSTRINGで宣言していても、構造体自体はSTRINGではないので型エラーが発生してたのですね。
dsuekichi様が言うとおり一端配列に格納し、要素一個づつに代入していくというsiro7aka7様がかかれたコードを実行したところ、無事構造体へ格納することができました。

Dim FName As String
Dim FileNo As Integer
Dim LineData As String
Dim TestRec() As TestRecord
Dim Str() As String
Dim Col As New Collection
Dim vnt As Variant
Dim lCnt As Long

FileNo = FreeFile
'選択したファイル名の取得
FName = Application.GetOpenFilename("CSV ファイル (*.CSV),*.CSV")
If FName = "False" Then
Exit Sub
End If

Open FName For Input As #FileNo

Do Until EOF(FileNo)
i = i + 1
Line Input #FileNo, LineData
Str() = Split(LineData, ",")
Col.Add (Str)
Loop
Close #FileNo

ReDim TestRec(i)

For Each vnt In Col
TestRec(lCnt).Col1 = vnt(0)
TestRec(lCnt).Col2 = vnt(1)
TestRec(lCnt).Col3 = vnt(2)
lCnt = lCnt + 1
Next

投稿日時 - 2007-09-07 14:45:49

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

「構造体(VBの用語では、「ユーザ定義型」)への代入」はできません。
#「ユーザ定義型同士の代入」は可能ですが、今回の用途には使えませんね。

「各要素ごと」に1つづつ代入してください。
#Splitの結果(配列)を別変数に一旦とっておいて、1つづつ代入する。

投稿日時 - 2007-09-07 13:12:56

あなたにオススメの質問