• 締切済み
  • 困ってます

VBAでCSVを文字列として取り込む方法

VBAでCSVを文字列として取り込む方法を教えてください。 下記のようにCSVファイルを取り込んでいます。 Array関数を使用していますが、どうしても文字列として認識してくれません。 Sub CSV取り込み() Dim xlAPP As Application ' Applicationオブジェクト Dim strFILENAME As String ' OPENするファイル名(フルパス) 'Applicationオブジェクト取得 Set xlAPP = Application '「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, Title:=cnsTITLE) 'キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub Workbooks.OpenText Filename:=strFILENAME, _ DataType:=xlDelimited, comma:=True, _ fieldinfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), _ Array(4, 2), Array(6, 2)) Workbooks.Open Filename:=strFILENAME ActiveWorkbook.Sheets(1).Cells.Copy _ Destination:=ThisWorkbook.Worksheets("sheet1").Range("A1") End Sub この書式ではCSVを文字列として取り込めないのでしょうか? どなた様かご教示ください。 よろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数6283
  • ありがとう数0

みんなの回答

  • 回答No.3
  • imogasi
  • ベストアンサー率27% (4598/16454)

#2です。追加メモ。 http://www.d3.dion.ne.jp/~jkondou/excelvba/T1.htm 3)外部ファイルウィザード3/3の設定。 .TextFileColumnDataTypes = Array(5, 9, 1, 9, 2) 区切って作成した列のデータ型の設定。 1・・・標準(数値) 2・・・文字列 5・・・日付 9・・・削除(表示しない) ---- http://d.hatena.ne.jp/jitte/20060512/1147450765 ここで問題なのがArray()の部分です。読み込むCSVのカラム数に合わせてそれぞれの形式を指定する(2=文字列のようです)のですが、カラム数は読み込んでからでないとわかりません。1回読み込んでからカラム数を調べて再読み込みするのかな、と思っていたのですが、実は、Excelの最大カラム数=256に合わせて配列を指定すればよいことがわかりました。 ---- (注)列数以上に.TextFileColumnDataTypesでArray(5, 9, 1, 9, 2,1,1,1)などと1を入れておいても無害のようだ。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • CSVの前ゼロを消さずにエクセルマクロで読み込む方法

    市外局番、市内局番、加入者番号を別フィールドで記録したCSVがあります。(120列) エクセルでそのまま読み込むと前ゼロが消えてしまうので、以下の方法をとっています。 1.拡張子変更   hoge.csv を hoge.txt に変更 2.ファイル→開く→テキストファイル→hoge.txtを選択 3.テキストファイルウィザード 4.電話番号の項目を「文字列」に指定する。 この一連の流れをマクロにしたいのですが、うまくいきません。 [マクロ1]  Sub csv_open1() Dim myFieldInfo(1 To 256) As Variant Dim i As Integer Dim strFileName strFileName = Application. _ GetOpenFilename If strFileName <> False Then For i = 1 To 256 myFieldInfo(i) = Array(i, 2) Next Workbooks.OpenText strFileName, _ DataType:=xlDelimited, _ Comma:=True, FieldInfo:=myFieldInfo End If End Sub ▼結果  失敗。前ゼロが消えた状態で読み込まれた。  Arrayの256を120にしても同様でした。 myFieldInfo(i) = Array(i, 2)で文字列に指定したはずなのになぜ文字列にならないのでしょうか。 ご存知の方、よろしくお願いいたします。

  • VBAでのCSV ダウンロードに方法ついて(文字列)

    つい最近VBAを勉強し始めた素人ですが、コードの作成にあたり早くも難航しております。VBAにお詳しい方、よろしければ下記内容にてファイルを作成する場合の方法をご教示いただけないでしょうか? CSV…カンマ区切り データ数 46列(A~AT) レコード数 4万件(概算) そのうち、全部のセルにデータが入っているだけではなく、空白のセルもあり。 エクセル…2003 VBAで指定ファイルを開き、CSVファイルをダウンロードしたいのですが その際に7,8列(G,H列)のみを文字列としてダウンロードしたいです。 またファイルを読み込む際はOPEN TEXTなどの別ファイルで開くのではなく、あくまで同ファイルの違うシート内に落としたいと思っております。 一応、拙いながらに途中までは自力でコードを組んでみたのですが。。。 ******************************************************* Sub CSVダウンロード() Const conTitle = "テキストファイルの読み込み処理" Const conFilter = "全てのファイル(*.*),*.*" Dim xlAPP As Application Dim csv As String Dim Freef As Long Dim X(1 To 46) As Variant Dim Gyo As Long Dim rec As Long Set xlAPP = Application xlAPP.StatusBar = "読み込むファイルを選んでください" csv = xlAPP.GetOpenFilename(Filefilter:=conFilter, _ Title:=conTitle) If StrConv(csv, vbUpperCase) = "FALSE" Then Exit Sub Freef = FreeFile Open csv For Input As #Freef Gyo = 1 Do Until EOF(Freef) rec = rec + 1 xlAPP.StatusBar = "読み込みちゅうです。。。(" & rec & "レコード目)" Input #Freef, X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10), X(11), _ X(12), X(13), X(14), X(15), X(16), X(17), X(18), X(19), X(20), X(21), X(22), X(23), _ X(24), X(25), X(26), X(27), X(28), X(29), X(30), X(31), X(32), X(33), X(34), X(35), _ X(36), X(37), X(38), X(39), X(40), X(41), X(42), X(43), X(44), X(45), X(46) Gyo = Gyo + 1 Range(Cells(Gyo, 1), Cells(Gyo, 46)).Value = X Loop Close #Freef xlAPP.StatusBar = False MsgBox "ファイル読み込み終了しました!" & vbCr & _ "レコード件数=" & rec & "件", vbInformation, conTitle End Sub ************************************************** これを実行するとエラーコード62『ファイルにこれ以上データがありません』と表記され、デバックで Input #Freef, X(1), X(2), X(3), X(4), X(5), X(6), X(7), X(8), X(9), X(10), X(11), _ X(12), X(13), X(14), X(15), X(16), X(17), X(18), X(19), X(20), X(21), X(22), X(23), _ X(24), X(25), X(26), X(27), X(28), X(29), X(30), X(31), X(32), X(33), X(34), X(35), _ X(36), X(37), X(38), X(39), X(40), X(41), X(42), X(43), X(44), X(45), X(46) の部分が黄色くなります。また、途中でなぜか列がズレてしまいます。元データを見ると全て綺麗に指定のセルに収まっているのですが。 どのように書き換えるべきか思いつきません。 お手数ですが、宜しくお願いいたします。

  • 結合した文字列をファイル名に使えない

    Excel上に入力されているパス名とファイル名のデータを組み合わせて、 様々なファイルを開いたりコピーしたりするVBAのコードを作ろうとしています。 仮にシート上のA1セルに、C:\Documents and Settings\デスクトップ というパス名 A2セルに URIAGE.xls というファイル名が入力されていたとして、 A1の文字列データとB1の文字列データを結合する場合、 Sub FileSousa()  Dim a As String  Dim b As String  Dim c As String  a = Cells(1, "A").Value  b = Cells(2, "A").Value  c = Chr(34) & a & "\" & b & Chr(34)  Range("A3") = c としてみると、確かにA3セルには、"C:\Documents and Settings\デスクトップ\URIAGE.xls" と出力され、文字列が結合されたことがわかるのですが、その変数cのデータを使って  Workbooks.Open Filename:=c として、そのファイルを開こうとすると、ファイル名が見つからないとしてエラーになります。 ファイルはデスクトップ上の確かにその名前で存在しており、直接 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\URIAGE.xls" とすると開きます。 " を Chr(34)によって入力したのがいけないのでしょうか、 Workbooks.Open Filename:=××× には、変数を置いてはいけないのでしょうか。 そもそも文字列の結合は、"あ" & "い" → "あい" となるのが基本だと思うのですが、 a="あ"、b="い"、c=a&b → c="あい"として結合した変数cについては、ファイル操作上のファイル名の設定項目として使えないのでしょうか。

  • 回答No.2
  • imogasi
  • ベストアンサー率27% (4598/16454)

「外部データの取り込み」のマクロの記録などを真似ているのだろうが、 そんなことをしなくても、テキストファイルを読んで、Splitでカンマで分轄し、セルに書くとき、シングルコーテーション+データ でセルに値をセットすればしまいでしょう。 Googleで「エクセルVBA CSVファイル 読み込み」でコード例が出てくるのでは。 標題だけ読むと数値も文字列で読んで良いかのようだがそうなのか。 CSVも 数値そのまま+文字列は"”つき 数値も文字列も””なし 数値も文字列も””つき などがあって、元データがどれか注記ぐらいすること。 ーー 「外部データの取り込み」のマクロの記録でもフィールドごとに表示形式を設定する操作の画面(ウイザード3/3) でフィールド(列)ごとに文字列・数値・日付などに指定できるし、それをやれば、それなりのコードになったと思うが。

共感・感謝の気持ちを伝えよう!

  • 回答No.1

わざわざエクセル使う理由が良くわかんないけど、 Cstr使って文字列に変換すればよいのでは?

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • VBAでタブ区切りファイルを列区切りにしたい

    VBAで秀丸のテキストファイルをエクセルに読み込むとき、タブ区切りがエクセルでは連続した文字列になってしまいます。 これを列に区切って読み込みたいのですがどうしたらいいですか? 読み込むプログラムは、「Excelでお仕事!」のサンプルを使ったもので、ファイルを開く画面から選択する形です。コードは下記です。 ' Applicationオブジェクト取得 Set xlAPP = Application ' (1) ' 「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) ' (2) ' キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub ' (3) ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' (4) ' 指定ファイルをOPEN(入力モード) Open strFILENAME For Input As #intFF ' (5)

  • 複数あるファイルの中から同じ文字列を含むファイルのみを選別させて開くには

    下記の通り同じフォルダーの中にある複数あるファイルを全部開くマクロはわかるのですが同じ文字列を含むファイルのみを自動選別させて開くにはどうすればいいのでしょうか? 具体的には"AAA-1" "AAA-2"のように"AAA-"を含む文字列のあるファイルは開きBBB-1"や"CCC-2"等文字列の含まないファイルは開かないようにしたいのですが。。アドバイスよろしくお願いいたします。 CSVFile = CurDir() FileName$ = Dir( CSVFile & "\*.csv", vbNormal) Do While FileName$ <> "" Workbooks.Open Filename:=FileName$ ・ ・ loop

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • エクセルのCSV読み込みについて

    現在,以下の記述でエクセル上にマクロ実行ボタンを作成しました。 任意のCSVファイルをエクセルに取り込み利用する目的です。 実行ボタンを押すと,「実行時エラー ファイルにこれ以上データがありません。」として,記述中の 「Input #intFF, X(1), X(2), X(3), X(4), X(5), X(6), X(7) ' (2)」 部分が黄色になって止まってしまいます。 エクセル画面上には,希望通りのデータが出力されているようなので,このエラーが表示されなければデータの取り込みとしては問題ないのですが・・・。 どのようにこのエラーを回避し処理すればよいかかが分かりません。 どなたかご教示いただければ幸いです。 どうかよろしくお願いいたします。 Sub Macro4() ' CSV形式テキストファイル(7カラム)読み込みサンプル Const cnsTITLE = "テキストファイル読み込み処理" Const cnsFILTER = "CSV形式ファイル (*.csv),*.csv,全てのファイル(*.*),*.*" Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFileName As String ' OPENするファイル名(フルパス) Dim vntFileName As Variant ' ファイル名受取り用 Dim X(1 To 7) As Variant ' 読み込んだレコード内容 ' (1) Dim GYO As Long ' 収容するセルの行 Dim lngREC As Long ' レコード件数カウンタ ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) ' キャンセルされた場合はFalseが返るので以降の処理は行なわない If VarType(vntFileName) = vbBoolean Then Exit Sub strFileName = vntFileName ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFileName For Input As #intFF GYO = 1 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' レコード件数カウンタの加算 lngREC = lngREC + 1 xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)" ' レコードを読み込む(このサンプルは7項目のCSV) Input #intFF, X(1), X(2), X(3), X(4), X(5), X(6), X(7) ' (2) ' 行を加算しA~G列にレコード内容を表示(先頭は2行目) GYO = GYO + 1 Range(Cells(GYO, 1), Cells(GYO, 7)).Value = X ' 配列渡し ' (3) Loop ' 指定ファイルをCLOSE Close #intFF xlAPP.StatusBar = False ' 終了の表示 MsgBox "ファイル読み込みが完了しました。" & vbCr & _ "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE End Sub

  • SETを使ったほうがよい?

    accwessからエクセルファイルを開きたいのですが、 App.Workbooks.Open と、 Set xlBook = xlApp.Workbooks.Open とどちらを使った方がいいのでしょうか? ////////////////////////////////////////////////////////// Private Sub ファイル1_Click() Dim App As Object Dim MyFileName As String MyFileName = "D:\My Documents\test.xls" Set App = CreateObject("Excel.Application") App.Workbooks.Open FileName:=MyFileName App.Visible = True End Sub でも Private Sub ファイル2_Click() Dim xlApp As Object Dim xlBook As Object Dim FileName As String Const FolderName = "D:\My Documents\test.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FolderName & FileName) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub ////////////////////////////////////////////////////////// でも開けました。 多分、SETを使うかどうかの違いだと思うのですが VBAでコードを作る際、どちらのコードを使った方がいいか教えてください。

  • VBA での文字列編集

    すみません、VBA初心者であまり調べる時間がないので質問させて頂きます。 Dim strFileName As String Dim strChk1 As String Dim strChk2 As String strFileName には "20070703_TEST001_DATA.csv" の文字列のデータが 格納されているとします。 この strFileName を編集して strChk1 には "20070703" strChk2 には "TEST001" がセットされるようにしたいのですが。。。 どのようにプログラムを書くのが一番いいのでしょうか? よろしくお願いします。

  • Excel VBA CSVを文字型で読みたいのです

    お世話になります。 Excel2013のVBAでCSVの全項目を文字型として取り込む処理を作ろうとしているのですが、 うまくいきません。 数値項目のゼロが消えてしまいます。 サンプルcsvと、取り込む所だけ抽出したソースを見て頂いて、なんとかなりますでしょうか? よろしくお願いします。 sub test() 'csvのオープンダイアログ varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _ Title:="CSV形式(csv形式)の選択") 'ファイル名を取得していなければ終了 If varFileName = False Then Exit Sub '拡張子除いたファイル名でシート作成 pos = InStrRev(varFileName, "\") sname = Mid(varFileName, pos + 1) 'フルパスからファイル名抽出 pos = InStrRev(sname, ".") '最後の.位置を抽出 sname = Mid(sname, 1, pos - 1) 'ファイル名から拡張子除去 '本流ブックに新シートを作成し命名 Set WS1 = Worksheets.Add(After:=Worksheets(Worksheets.Count)) WS1.name = sname 'csvをtmpブックで開く(アクティブ周りの処理の関係で位置を注意) 'お形式で全項目文字で取得Ver Workbooks.OpenText Filename:=varFileName, _ DataType:=xlDelimited, comma:=True, _ fieldinfo:=Array( _ Array(1, 2), Array(2, 2)) end sub test.csv ---------------------- 管理番号 ,注文分類  "0000041836","受注" "0000041841","受注" "0000041842","受注"

  • Excel VBAでOpenTextのFieldInfoが効かない・・

    Excel2000のVBAマクロで、CSVファイルを読み込んで マッチング処理をしたいと考えています。 CSVファイルはコードテーブルで参照のみ。 中身は、「コード,名前,区分」の配列になっております。 コードは"0012345"と"12345"は別物として扱いたいので 文字列として読み込む必要があります。 CSVファイルの中身は以下の感じです。 12345,名前1,区分1 0012345,名前2,区分2 0000022222,名前3,区分1 ... そこで、以下のようなコードを書いて見ました。 Sub OpenCSV() Workbooks.OpenText Filename:="C:\CSV.txt" _ DataType:=xlDelimited, Comma:=True, _ TextQualifier:=xlTextQualifierNone, _ FieldInfo:=Array(Array(1,2),Array(2,2), _ Array(3,2)) End Sub ところが開いたシートではコード部分が文字列として 取り込まれておらず、セルの書式も標準になっています。 FieldInfoの設定方法を変えて、 Sub OpenCSV() Dim tmpInfo(256) As Variant Dim i As Integer For i = 1 to 256 tmpInfo(i) = Array(i,2) Next Workbooks.OpenText Filename:="C:\CSV.txt" _ DataType:=xlDelimited, Comma:=True, _ TextQualifier:=xlTextQualifierNone, _ FieldInfo:=tmpInfo End Sub このようなコードにしたところ、「型が一致しない(エラー13)」というエラーになってしまいます。 結局、FieldInfoが効いてない動きなのですが、 どこが悪いのか皆目見当が付きません。 アドバイスを頂けますと幸甚です。

  • Evaluate()に文字列の形式の数式を渡すには

    VB.NETでEvaluate()関数を使って、プログラム実行中に決まる数式を評価させたいのですが、下記の(A)のように数式を" "で囲まない形で渡せば正しく評価されるのですが、(B)のように数式が文字列の形になっていると、このまま、文字列を渡してもうまくいきません。(B)のような形になってしまっている数式をEvaluate()関数で評価させるためには、(B)から(A)の形に持っていきたいのですが、どのようにすればよいのかがよく分かりません。 数式の構造自体がプログラムの実行中に文字列の形で処理させて生成されるのですが、このように文字列の形になっている数式を、Evaluate()関数で評価させるためには、どのようにすればよいのでしょうか。 ---------------------------------------- Imports Microsoft.Office.Interop Module Module1  Sub Main()   Dim xlApp As New Excel.Application   Dim i1 As Integer   Dim i2 As Integer   Dim term_i As String   Dim ans_i As Integer   i1 = 2   i2 = 3   term_i = i1 + i2 + 5 ' (A)   term_i = "i1 + i2 + 5" ' (B)   ans_i = xlApp.Evaluate(term_i)   MsgBox(ans_i)  End Sub End Module ---------------------------------------- よろしくお願いします。(WindowsXP,VB2010)

  • VBA 文字列の抜き出し

    VBAで文字列の抜き出しの方法を教えてください。 同様な質問があり、参考にしてみたのですがうまくいきません。 お分かりの方がいましたらご享受お願いいたします。 30~45字からなる文字列があります。 その中に特定の文字列が2つあり、そのうちの最初の特定文字列に続く文字2つ目の特定文字列前までを抜き出したいのですがうまくいきません。 具体的には abcdefghi GN=12jikl PE=fghj456 という文字列のなかから"GN="と"PE="の中間の文字を取り出したいのですが、 自分で書いたものでは"PE="以上が抜き出され、"GN="より前の文字列を抜き出せませんでした。 GN=......, PE=......の文字数はそれぞれ不規則です。また、GN=...よりも前の文字数も不規則です。 以下が作成したものです。 Dim i As Integer Dim Srch As String Dim Btwn As String Const Chr1 As String = "GN " Const Chr2 As String = "PE" Dim m As String Set sheetobj = ThisWorkbook.Worksheets("A") With sheeobj lastrow = sheetobj.Cells(sheetobj.Rows.Count, 10).End(xlUp).Row For i = 2 To lastrow Srch = sheetobj.Cells(i, 10) Btwn = Mid(Srch, InStr(Srch, Chr1) + 1, InStr(Srch, Chr2) - InStr(Srch, Chr1) - 1) sheetobj.Cells(i, 9) = Btwn Next i End With End Sub なにかいい方法があれば教えて頂けたらと思います。 よろしくお願い致します。

専門家に質問してみよう