• ベストアンサー

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

  • Excelマクロでフォルダ内のCSVファイルを一括で読み込ませるには?

    Excelファイルと同階層にあるCSVファイルを読み込ませるマクロを作ってみたのですが、正常に動作しません。 アドバイスいただければ幸いです。 Excel2003を使用しています。 Sub 同階層フォルダ内のCSV読込_Click() Dim fname As String 'ファイル名 Dim pathname As String 'パス名 Dim dat(1 To 4) As Variant '読み込んだデータ Dim rr As Long '対象行番号 Dim i As Integer '列のオフセット Dim j As Integer 'ファイル識別番号のオフセット '同階層フォルダ内のCSVファイルを参照 pathname = ".\*.csv" fname = Dir(pathname, vbNormal) 'データを挿入する行番号 rr = 2 '該当するファイルがある間 Do While fname <> "" j = 0 j = j + 1 'ファイルを開く Open fname For Input As #j 'ファイルの終端まで Do Until EOF(j) 'データを取得 Input #j, dat(1), dat(2), dat(3), dat(4) '読み込んだデータをセルに出力 For i = 1 To 4 Cells(rr, i).Value = dat(i) Next '行番号を更新 rr = rr + 1 Loop Close #j 'フォルダ内の次のファイルを検索 fname = Dir() Loop End Sub

  • OpenOfficeBasicで漢字が表示できない

    OpenOfficeBasicで、CSVファイルを読み、CELLにセットしていくと漢字が文字化けしてしまいます。 何かの設定がおかしいと思いますが、わかりません。 よろしくご教授ください。 OSはCentos5です。 OpenOffice.org3 Linux用を使っています。 マクロの内容は以下の通りです。 sub csvinput dim document as object document = ThisComponent.CurrentController.Frame dim FileNo As Integer dim data As String dim File As String Filename = "/var/webapps/doc/test/nippou.csv" FileNo = Freefile Open Filename For Input As FileNo Do While not eof(FileNo) dim args2(0) as new com.sun.star.beans.PropertyValue args2(0).Name = "StringName" Input #FileNo, data args2(0).Value = data Loop Close #FileNo endsub

  • ActiveWorkBook VBA

    Sub test() Dim myCSV As String Dim Fname As Variant Dim Aname As String Dim Fullp As String Application.ScreenUpdating = False Fullp = ActiveWorkbook.FullName Pos = InStrRev(Fullp, "\") Fname = Left(Fullp, Pos) myCSV = Dir(Fname & "*.csv") Do Until myCSV = "" Workbooks.Open Fname & myCSV Aname = Left(Fullp, InStr(1, Fullp, ".") - 1) ActiveWorkbook.SaveAs filename:=Aname & ".xls", FileFormat:=xlExcel9795 ActiveWorkbook.Close myCSV = Dir() Loop Kill Fname & "*.csv" End Sub あるフォルダにあるcsvファイルをxlsで保存したいと思いましたが、アクティブになるBOOKがバラバラ? で、うまくいきません。csvファイルを開いたときに そのファイルがアクティブになり、うまくloopできないでしょうか?

  • エクセルのシートのデータをVBAを使ってCVS形式で保存したいのですが、文字化けしないようにするにはどうしたらいいでしょうか?

    エクセルのシートのデータをVBAを使ってCVS形式で保存したいのですが、文字化けしてしまいます。手動で「名前を付けて保存」すると文字化けしません。文字化けしないようにするにはどうしたらいいでしょうか? どなたかお教えいただきたく、よろしくお願いします。 ---------------------------------------------------------------------- Sub test5() Dim aaa As String Dim fname As Variant aaa = Format(Now, "YYMMDD") fname = Application.GetSaveAsFilename(InitialFileName:=aaa & ".csv", fileFilter:="csvファイル(*.csv), *.csv") If fname = False Then Exit Sub '保存 Worksheets("sheet1").SaveAs fname End Sub

  • VBAで、ExcelシートにCSVファイルのデータを取り込みたいのです

    VBAで、ExcelシートにCSVファイルのデータを取り込みたいのですが、 1行目しか取り込めません。 取り込む項目数は32個です。 以下のコードでは、Excelシートの1行目のみ取り込みができますが、 1行目32列目のセルには、2行目のA列に表示されるべきデータも表示されます。 2行目以下は取り込みできていません。 Sub CSV取込() Dim OpenFileName As String Dim MyString As String Dim MyVar As Variant Dim i As Long, j As Long OpenFileName = Application.GetOpenFilename("CSVファイル,*.csv") If OpenFileName = "False" Then MsgBox "キャンセルされました。" Else Open OpenFileName For Input Access Read As #1 i = 1 While Not EOF(1) Line Input #1, MyString MyVar = Split(MyString, ",") If MyVar(0) <> "" Then For j = 0 To 31 ThisWorkbook.ActiveSheet.Cells(i + 10, j + 1) = MyVar(j) Next j i = i + 1 End If Wend Close #1 End If End Sub おそらく、改行が判別できないためかと思いますが、 どこが間違っているのかがわかりません。 アドバイスをよろしくお願いします。

  • CSVファイルの読み込みVBA作成について

    初めまして。 色々インターネット等で検索して作成してみたのですが、 ここから先のプログラムが組めないので、 やり方を教えて頂けますと幸いです。 おそらくIf Elseで場合訳すると思うのですが、 上手くできてません。 下記、プログラムの概要です。 (1)フォルダを指定し、そのフォルダにある全てのCSVファイルを読み込む。 (2)CSVファイルを読み込む際には、「*.csv」の「*」部分をワークシート名とし、CSVファイルの内容をワークシートに書き込む。 例)「test.csv」の場合、ワークシート名は「test」になります。 (3)既にブックにワークシート名がある場合は上書き処理を行い、ない場合は新規に作成する。 例)既に「test」ワークシートがある場合は、内容の上書きを行います。 (4)ワークシートを追加する際は、今あるワークシートの最後に追加する。 下記に現在作ったプログラムを記載します --------------------------------- Sub csvRead() Dim FoldPath As String Dim f Dim ch1 As Long Dim r As Long Dim textLine As String Dim csvLine() As String Dim i As Long Dim FSO Dim folderSelect As Object Set folderSelect = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0) If Not folderSelect Is Nothing Then FoldPath = folderSelect.Self.Path 'フォルダ選択 End If Set FSO = CreateObject("Scripting.FileSystemObject") i = Worksheets.Count '現在のワークシート数を格納 For Each f In FSO.GetFolder(FoldPath).Files If StrConv(Right(f.Path, 4), vbLowerCase) = ".csv" Then ch1 = FreeFile Open f.Path For Input As #ch1 r = 1 Worksheets.Add after:=Worksheets(i) With ActiveSheet .Name = Left(f.Name, Len(f.Name) - 4) Do While Not EOF(ch1) Line Input #ch1, textLine If textLine <> "" Then csvLine() = Split(textLine, ",") .Range(Cells(r, 1), Cells(r, UBound(csvLine()) + 1)) = csvLine() End If r = r + 1 Loop End With i = i + 1 Close #ch1 End If Next End Sub

  • VB2005 CSVファイルをテーブルへインポート

    こんばんは。 VB2005にてCSVファイルをテーブルへ、インポートする処理を作成しています。ネットで調べたコードを試しています。デバックは通るのですが、処理結果がテーブルへ出力されません。 (TESTdataset内にTable1を作成しています。) 何か解決案がありましたらご教示をお願いいたします。 また、 ※1の'DataGridView1の文なのですが、コメントを外すと 宣言がされていない旨のメッセージが出てきてしまいます。 もし此方も解決案が御座いましたらご教示をお願いいたします。 -------------------------------------------------------------- 以下コードです -------------------------------------------------------------- Imports System.Data Imports System.Data.OleDb Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Const csvPath As String = "c:\DB\" Const csvFile As String = "TEST.csv" Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & csvPath _ & ";" & "Extended Properties='text;FMT=Delimited'" Dim objConn As New OleDbConnection(sConnectionString) objConn.Open() Dim objCmdSelect As New OleDbCommand("SELECT * FROM " & csvFile, objConn) Dim objAdapter1 As New OleDbDataAdapter() objAdapter1.SelectCommand = objCmdSelect Dim objDataset1 As New DataSet() Dim objTable As DataTable Dim Col As DataColumn objDataset1 = New DataSet("TEST") objTable = New DataTable("Table1") Col = New DataColumn("No") Col.DataType = Type.GetType("System.Int16") objTable.Columns.Add(Col) Col = New DataColumn("Name") Col.DataType = Type.GetType("System.String") objTable.Columns.Add(Col) Col = New DataColumn("出身") Col.DataType = Type.GetType("System.String") objTable.Columns.Add(Col) objDataset1.Tables.Add(objTable) objAdapter1.Fill(objDataset1.Tables(0)) ※1'DataGridView1.DataSource = objDataset1.Tables(0).DefaultView objConn.Close() End Sub End Class --------------------------------------------------------- ※お礼が遅れる場合がありますが、必ずしますので、その時は少々お待ちください。

  • VBAでCSVファイルを読み込もうとしていますが、

    VBAでCSVファイルを読み込もうとしていますが、 「ファイルが見つかりません」とエラーが表示されます。 どのように対処していいのかわかりません。 教えてくください。 Sub readCsv() Dim csvFile As String Dim ch As Integer Dim csvStr As String Dim str() As String Dim i As Integer Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1) targetFolder = oFolder.Items.Item.Path Set fso = CreateObject("Scripting.FileSystemObject") Set fileList = fso.GetFolder(targetFolder).Files For Each file In fileList csvFile = file.Name ch = FreeFile Open csvFile For Input As #ch i = 1 Do While Not EOF(1) Line Input #ch, csvStr Close #ch str = Split(csvStr, ",") Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str i = i + 1 Loop Next End Sub

  • マクロ HTMLタグのクラス名を入れたらエラー

    下記のプログラムはセルに文字を入れてHTML化するものです。 HTMLタグにクラス名を入れると「中断モードでコードを実行することはできません」とエラーメッセージが出ます。 LineData = "<div class=“sample”>” & ws.Cells(i, 1).Value & "</div>" & vbCrLf クラス名の「” ”」が問題だと思いますが、どうしたら良いでしょうか? 宜しくお願いします。 Sub convertHTML()  Dim ws As Worksheet  Dim htmlFile As String  Dim i As Long  Dim LineData As String    Set ws = ThisWorkbook.Worksheets(1)  htmlFile = ActiveWorkbook.Path & "\Sample.html"  Open htmlFile For Output As #1    i = 1  Do While ws.Cells(i, 1).Value <> ""   LineData = "<div id=“sample”>” & ws.Cells(i, 1).Value & "</div>" & vbCrLf   LineData = LineData & "<p>" & ws.Cells(i, 2).Value & "</p>" & vbCrLf   LineData = LineData & "<span>" & ws.Cells(i, 3).Value & "</span>" & vbCrLf   Print #1, LineData   i = i + 1  Loop  Close #1  MsgBox htmlFile & "に書き出しました" End Sub

  • CSVファイルのエクセル取込(VBA)で小数三位が消える!?

    エクセルにCSVファイルから読み取りをするVBAで下記のように記述しています。 Sub CSV読取り Dim FName As Variant FName = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv") Open FName For Input As #1 For i = 1 To 400 Input #1, Columni ThisWorkbook.Sheets("CSV取得").Cells(i, "E").Value = Columni Next i Close #1 End Sub これでほとんどのデータ(数値や文字列の400件)をうまく読み取るのですが、どういう訳かデータが小数点以下第三位まである数値の場合、エクセルに取り込まれた段階で小数点以下第二位までに四捨五入されてしまうようです。 そのうえ、エクセルのセルの表示形式がそこだけ通貨(¥マーク付き)になっています。 なぜでしょうか? またどうしたら正しく小数3位まで読み取れるのでしょうか? CSVファイルをエクセル単純にエクセルで開けばちゃんと小数三位まであるのですが、データが横一列にカンマ区切り400件あるので256列しかないエクセルではすべてとりこめません。(だから上記のマクロで縦に変換してとりこんでいるのですが) 非常に困っています。

専門家に質問してみよう