• ベストアンサー

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() =~の部分で型が一致しません とエラーが出てしまいます。 よき解決方法があれば教えてください。宜しくお願いします。

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

  • ベストアンサー
  • siro7aka7
  • ベストアンサー率34% (18/52)
回答No.2

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

forgedcode
質問者

お礼

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

その他の回答 (1)

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

「構造体(VBの用語では、「ユーザ定義型」)への代入」はできません。 #「ユーザ定義型同士の代入」は可能ですが、今回の用途には使えませんね。 「各要素ごと」に1つづつ代入してください。 #Splitの結果(配列)を別変数に一旦とっておいて、1つづつ代入する。

関連するQ&A