ブックをひらかずにテキストファイルを取り込む方法とは?

このQ&Aのポイント
  • エクセルのブックを開かずにテキストファイルを取り込む方法を紹介します。
  • タブで分かれているテキストファイルを取り込む際に、郵便番号シートを作成する方法を解説します。
  • テキストファイルをタブで区切って7列のデータとして取り込む方法について詳しく説明します。
回答を見る
  • ベストアンサー

ブックをひらかずにテキストファイルを取り込む

エクセルのブックを開かずにテキストファイルを取り込みたいのですが、対象のテキストファイルは タブで分かれています。 本を見て 下記のプロシージャを使用したいのですが、 テキストが取り込まれるブックに郵便番号と言うシートを作成してもうまく取り込めません。 テキストはタブで区切られたテキストで 7列のデータです。 下記のものを開こうとすると、7列でデータが入るのですが、タブでデータが区切られてこないのです。 データが続いて一つのセルに入ってしまい、 うまく設定できません。 何がいけないのでしょうか? 宜しくお願いします。 Sub ReadTxt() Dim myTxtFile As String Dim myBuf(7) As String Dim i As Integer, j As Integer Application.ScreenUpdating = False myTxtFile = ActiveWorkbook.Path & "\Fuji.txt" Worksheets("郵便番号").Activate Open myTxtFile For Input As #1 Do Until EOF(1) Input #1, myBuf(1), myBuf(2), myBuf(3), myBuf(4), _ myBuf(5), myBuf(6), myBuf(7) 'データをセルに展開する i = i + 1 For j = 1 To 7 Cells(i, j) = myBuf(j) Next j Loop Close #1 End Sub

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

  • ベストアンサー
noname#29107
noname#29107
回答No.1

INPUT文は、カンマ区切りの場合になります。 LINE INPUT で読み込んで、split関数で分けましょう。 Sub ReadTxt() Dim myTxtFile As String Dim myBuf As String, wkdt() As String Dim i As Integer, j As Integer Application.ScreenUpdating = False myTxtFile = ActiveWorkbook.Path & "\Fuji.txt" Worksheets("郵便番号").Activate Open myTxtFile For Input As #1 Do Until EOF(1) Line Input #1, myBuf wkdt = Split(myBuf, vbTab) 'データをセルに展開する i = i + 1 For j = 0 To UBound(wkdt) Cells(i, j + 1) = wkdt(j) Next j Loop Close #1 End Sub

shinarin
質問者

補足

rebellionさん アドバイス有難うございます。 早速やってみましたら、思い通りに開けるようになりました。 もう一つ質問させて頂きたいのですが、 もしお時間が有りましたら、教えてください。 "\Fuji.txt"テキストがブックと同じ場所に有るのですが、このテキスト名が日付で変る場合が有るのですが、日付+アルファベットでテキストを保存する予定です。日付をワイルドカードのように******_fuji.text のようにしていして、日付がどの様に変っても_fujiの付いたファイルを開くようにすることは可能かご存知でしたら、アドバイスをお願いします。 よろしくおねがいします。

その他の回答 (3)

noname#29107
noname#29107
回答No.4

#1です。 >日付がどの様に変っても_fujiの付いたファイルを開くようにすることは可能か Dir関数を使用すると条件に該当するファイル名を取り出すことが出来ます。例えば該当するファイルを全件展開するなら、以下のようにします。 Sub ReadTxt() Dim myTxtFile As String Dim myBuf As String, wkdt() As String Dim i As Integer, j As Integer 'Application.ScreenUpdating = False flmei = Dir(ActiveWorkbook.Path & "\??????_fuji.txt") Worksheets("郵便番号").Activate i = 0 Do While flmei <> ""   myTxtFile = ActiveWorkbook.Path & "\" & flmei   Open myTxtFile For Input As #1   Do Until EOF(1)     Line Input #1, myBuf     wkdt = Split(myBuf, vbTab)     'データをセルに展開する     i = i + 1     For j = 0 To UBound(wkdt)       Cells(i, j + 1) = wkdt(j)     Next j   Loop   Close #1   flmei = Dir() Loop End Sub 最新のファイルだけ取り込みたいという条件なら、ユーザーにファイルを選ばせるとか、処理済みのファイルをシート上に保存しておくなどの方法が考えられます。しかし、補足の内容では条件が絞り切れません。 あと Application.ScreenUpdating = False などは、動作確認が済むまでは、コメント化しておきましょう。画面の動きに目を凝らしていると、想定外の動作してるかどうかの判断もしやすいですよ。

shinarin
質問者

お礼

Rebellionさん  アドバイス有難うございます。 Dirを使ったら、うまく行きました。 Application.ScreenUpdating = False をコメント化して次回から進めてみます。 これで目標の作業のゴールが見えてきました。 本当に助かりました。 どうもありがとうございます。

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

Sub ReadTxt() Dim myTxtFile As String Dim myBuf(7) As String Dim i As Integer, j As Integer Application.ScreenUpdating = False i = 1 myTxtFile = ActiveWorkbook.Path & "\Fuji.txt" Worksheets("郵便番号").Activate Open myTxtFile For Input As #1 '--------- Do Until EOF(1) Line Input #1, a s = Split(a, Chr(9)) 'データをセルに展開する For j = 0 To UBound(s) Cells(i, j) = s(j) Next j i = i + 1 Loop '---------- Close #1 End Sub ---- 表題「ブックをひらかずにテキストファイルを取り込む」 と内容は違っているように思いますが。

shinarin
質問者

お礼

アドバイスありがとうございます。 そうですね 厳密に言うとブックをひらかずにと言うより、新規ブックを作らずにテキストファイルをエクセルに取り込みたいのです。 色々思考錯誤してうまく作動するようになりました。 どうも有難うございます。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

横レス失礼します。 回答は既にrebellionさんがされております。勝手ながら、コードをお借りしまして、データファイルの要素数が一定でない場合への対処や、処理速度という点から回答させていただきます。 配列のデータはセルへ一気に書き込んだ方が高速動作し、コードがすっきりします。タブで区切られたデータをSplit関数を使用して、一次元配列化し、Ubound関数で要素数を調べ、一気にセルへ転記しています。また、この方法ですと、要素数が固定されません。 i = 0 Do Until EOF(1) Line Input #1, myBuf   wkdt = Split(myBuf, vbTab)   'データをセルに展開する   i = i + 1   Range(Cells(i, 1), Cells(i, UBound(wkdt) + 1)) = wkdt Loop Close #1

shinarin
質問者

補足

アドバイス有難うございます。 下の方のやり方でうまく行ったので、 そこにこれを入れてみました。 入れる場所は下記のコードの Input As #1の下でよろしいのですよね? そこに入れると、データの2行目までの取り込みで止まってエラーが出てしまい、デバッグで見てみると、 Range(Cells(i, 1), Cells(i, UBound(wkdt) + 1)) = wkdt が黄色く塗られています。 ここに何か問題が有るのでしょうか? KenKenさんのアドバイスが高度すぎてイマイチ理解していなく、オウム状態で使わせてもらおうとしたので、自分で修正もできなくて申し訳ないのですが、 もう少し詳しく、教えていただけると助かります。 よろしくおねがいします。

関連するQ&A

  • ブックに可変のファイル名テキストファイルからデータを取り込みたい

    こんにちは 昨日質問させていただいた、コードを修正して 開かれるファイル名が可変である場合にも対応させたいのですが、"*"をもちいてみてもうまく行きません。 どの様に指定するのかご存知の方教えてください。 "\Fuji.txt"これを\****.txt \*.txtとやってみましたがダメでした。 なお、041221_fuji.txtのように日付を6桁と"_"を入れてfujiとしたく、日付の6桁の数字のみ変えたいのです。 それを下記のコードに盛り込みたいのですが、何が足りないのかうまく行きません。 宜しくお願いします。 Sub ReadTxt() Dim myTxtFile As String Dim myBuf As String, wkdt() As String Dim i As Integer, j As Integer Application.ScreenUpdating = False myTxtFile = ActiveWorkbook.Path & "\Fuji.txt" Worksheets("郵便番号").Activate Open myTxtFile For Input As #1 Do Until EOF(1) Line Input #1, myBuf wkdt = Split(myBuf, vbTab) 'データをセルに展開する i = i + 1 For j = 0 To UBound(wkdt) Cells(i, j + 1) = wkdt(j) Next j Loop Close #1 End Sub

  • ExcelVBAを使ってテキストファイルを取り込む際に条件を与える方法

    こんばんわ。 今、テキストファイルをExcelの特定シートに開くVBAを組もうとしています。 ある書籍のソースをそのまま流用すると、 一部分は満たされるのですが、他方が実現されず、困っております。 やろうとしていること: 新規ブックを開かずに、テキストファイル(CSV形式)の各列の形式(文字列or数値)を指定しながら、特定シートにデータを展開する。 Book名「ABC.xls」 その中のシート名「展開」 テキストファイル名「data.txt」:11列のデータがカンマ区切りで入っています data.txt、ABC.xls共に同じフォルダ内に保存してあります。 やってみたこと: *********************************************** Sub ReadTxt() Dim myTxtFile As String Dim myBuf(11) As String Dim i As Integer, j As Integer Application.ScreenUpdating = False myTxtFile = ActiveWorkbook.Path & "\data.txt" Worksheets("展開").Activate Open myTxtFile For Input As #1 Do Until EOF(1) Input #1, myBuf(1), myBuf(2), myBuf(3), myBuf(4), myBuf(5), myBuf(6), _ myBuf(7), myBuf(8), myBuf(9), myBuf(10), myBuf(11) i = i + 1 For j = 1 To 11 Cells(i, j) = myBuf(j) Next j Loop Close #1 End Sub *********************************************** というソースで特定シートに取り込めたのですが、 各列の取り込み形式(文字列、数値)を指定する方法がわかりません。 OpenTextメソッドでFieldInfoに配列を記述し取り込み形式を指定する方法は見つけたのですが、こちらは、新規ブックが開いてしまい・・・ どなたか方法をご存知の方、回答を頂けたら幸いです。 お願いします。

  • エクセルVBA:テキストデータ(txt)の読込(改行が変なところでされる)

    勉強しながら、エクセルVBAを組んでみたのですが うまくいきません。 テキストデータを以下のようなプログラムで読んだのですが (100行のデータを縦に並ぶように100個のセルの書き出す) 読み込みデータに「↓」で改行されているところでは 「↓」の間は同一行と見なされてしまうのですが どのようにしたら一行で一つのデータと見てくれるのでしょうか? 分かる方がいましたら教えて下さい。 よろしくお願いします。 Sub pon() '*** 変数の宣言 *** Dim filenum As String Dim i As Integer Dim num As Integer, ms As String, cnt As Integer Dim BookName As String, PathName As String Dim ca As String cnt = 1 i = 1 ca = Cells(1, 56) PathName = "C:\" textpath = Dir(PathName & "pon" & ca & ".txt") BookName = Dir(PathName & "pon" & ca & ".txt") Open PathName & BookName For Input As #1 'ファイルを開きます Do While Not EOF(1) Line Input #1, ms cnt = cnt + 1 Cells(1, 57) = BookName 'データの書き出し Cells(cnt, 56) = ms 'データの書き出し Loop Close #1 End Sub

  • エクセルに二つのテキストファイルをインポートしたい

    エクセルのsheet1の1行目にタイトルがあります。 ボタンのクリックイベントで、テキストファイル2つをインポートしたいのですが。 ・テキストファイルの名前は、固定ではありません ・テキストファイルの保存先は、デスクトップで、ファイルの選択は自分でしたい ・テキストファイルの一行目は、タイトル行なので、二行目以降をインポートしたい 行数は固定ではありません ・タブ区切りです 複数選択はできなく、1ファイルでタイトル行も含めるのであれば下記コードできたのですが。 どなたか、ご教示いただけますでしょうか・・・・ よろしくお願いいたします。 ----------------------------------------------------- Sub ReadTextFile() 'タブ区切りファイルを全て文字列として読み込む Dim FileName As String Dim i As Long Dim Cnt As Long Dim Buf As Variant Dim FileNo As Integer Dim SplitString As Variant 'ファイルダイアログを表示 FileName = Application.GetOpenFilename("テキストファイル,*.txt") If FileName <> "False" Then '全セル選択して書式を文字列にセットする Cells.Select Selection.NumberFormatLocal = "@" Cells(1, 6).Select '空いているファイル番号を取得 FileNo = FreeFile() Buf = Space(FileLen(FileName)) 'ファイルを開いてbufに1行読み込み ' → タブで配列に分割 ' → セルに書き出し Open FileName For Input As #FileNo Do Until EOF(FileNo) Line Input #FileNo, Buf Cnt = Cnt + 1 SplitString = Split(Buf, vbTab) For i = 0 To UBound(SplitString) Cells(Cnt, i + 1) = SplitString(i) Next i Loop Close #FileNo Else End If End Sub -----------------------------------------------------

  • リストボックスの内容を テキストファイルに出力

    エクセル vba初心者です。 (1)ini fileからデータを取得 (2)その内容のリストボックスに表示 (3)リストボックス内容をテキストボックスに出力 (2)、(3)がわかりません。 なんとなくやってたら余計にわからなくなりました。助けてください。 Private Sub CommandButton1_Click() '読込み(1)を押した時の処理 Dim listbox As String Dim strL_Data As String '取得した値 Dim n As Integer n = FreeFile    ListBox1.Clear   Open "C:\filepath.ini" For Input As #n Do While Not EOF(n) Line Input #n, listbox ListBox1.AddItem listbox Loop Close #n End Sub Private Sub CommandButton2_Click() '書込み(1)を押した時の処理  Dim listbox As String Dim strL_Data As String '取得した値 Dim n As Integer n = FreeFile    Open "c:\example.txt" For Output As #n Print #n, strL_Data Close #n End Sub よろしくお願いいたします。

  • エクセルのデータを大量のテキストファイルに書き込みたい。

    エクセルの縦のセルのデータ(下のCells( 4 * j + i, 4))を繰り返しで、400個のテキストファイルに書き込みたいのですが、 下の""内のjは繰り返しせずに、j.txtとなって入力されてしまいます。なにかいい方法がありませんでしょうか。 ご協力お願いします。(ちなみにvbaは初心者です。) Private Sub CommandButton2_Click() Dim n As Long n = FreeFile Dim j As Integer For j = 0 To 399 For i = 1 To 4 a = Cells( 4 * j + i, 4) f2 = ActiveWorkbook.Path & "\j.txt" Open f2 For Append As #n Print #n, a Close #n Next i Next j End Sub 例. 1 2 3 4 5 6 7 8 9 10 12 13 1,2,3,4→1.txt 5,6,7,8→2.txt 9,10,11,12→3.txt

  • VBAで行数を数えてテキストデータにコピーしたい。

    エクセルの実行ボタンを押すとアクティブシートにあるデータのA7から空白までの行数を数えて、その行数と同じ分、テキストデータをSQLテキストファイルにコピーしたいのですが、うまくいきません。 どなたか分かる方教えてください。 出来れば、下記のVBAを生かして組み込みたいです。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim myDate As String Dim myPath As String Dim NewPath As String Dim FNo As Integer Dim Ar(1) As String Dim SqlData As String Dim i As Integer Dim j As Integer '★配列にsqlファイルのタイトルを代入★ Ar(0) = "TEST1.sql" Ar(1) = "TEST2.Sql" '★sqlデータの内容を入れる★ sqlData0 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_a" & Chr(13) & Chr(10) SqlData1 = ActiveSheet.Rows("A7:")(xlDown) * "testdata_b" & Chr(13) & Chr(10) & "testdata_c" myDate = Format(Date, "yyyymmdd") myPath = ThisWorkbook.Path NewPath = myPath & "\" & myDate ↑VBAは省略して途中まで記載しました。

  • 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

  • エクセルVBAの質問 開いているもう一つのブックのシート名をすべて取得する方法

    おはようございます。 現在マクロを実行しているブックのシート名を下のようなコードで取得していますが、これを 開いているもうひとつのブックのシート名を マクロ実行しているシート“しーと1”のJ3セル以降に並べる というように変更したいのですが、下のコードを少し変更して 対応できるでしょうか?教えていただけたら助かります。 Sub シート名() Dim i As Integer Dim mySheetCnt As Integer Dim mySheetNam As String Application.ScreenUpdating = False Columns("J:J").Select Selection.ClearContents Range("J2").Select ActiveCell.FormulaR1C1 = "項目名" mySheetCnt = ThisWorkbook.Sheets.Count For i = 2 To mySheetCnt mySheetNam = Sheets(i).Name Sheets("しーと1").Cells(i, 10) = mySheetNam Next i Application.ScreenUpdating = True MsgBox "シート名更新しました。" End Sub

  • EXCELのVBAでファイル出力する際にダブルクオテーションを省きたい

    はじめまして。 EXCEL2003のVBAで、セルの内容をテキストファイルに出力するマクロを組んでいます。出力はできますが、出力された文字列がダブルクオテーションで囲まれてしまいます。 どのようにしたらダブルクオテーションを省けるか教えて下さい。 処理内容:AA列を6行目から値の入っていないセルまでファイルに出力します。 ------------------------------------------------------ Private Sub OutputFile_Click() Const sDataCol As String = "AA" 'データ列 Const iDataStartRow As Integer = 6 'データ開始行 Dim iFileNo As Integer Dim sRecord As String Dim iRecCnt As Integer Dim iCounter As Integer Dim sFileName As String sFileName = CurDir & "\" & "Sample.txt" iFileNo = FreeFile Open sFileName For Append As #iFileNo iCounter = iDataStartRow Do sRecord = Range(sDataCol & iCounter).Value Write #iFileNo, sRecord iRecCnt = iRecCnt + 1 iCounter = iCounter + 1 Loop Until Range(sDataCol & iCounter).Value = "" Close #fileNo MsgBox sFileName & vbCr & _ "レコード件数=" & iRecCnt & "件", vbInformation, "ファイル出力完了" End Sub ------------------------------------------------------ セルAA6(セル書式:標準)に、abcd と入っていると、 "abcd" と出力されてしまいます。 abcd のようにダブルクオテーションを省きたいのです。 よろしくお願いします。

専門家に質問してみよう