VBAでテキストファイルの読み書き

このQ&Aのポイント
  • Excel VBAを使用して、テキストファイルの読み込みと書き換えについて教えてください。
  • テキストファイルの中には不規則に並んだデータがあり、特定の値を取り出す方法が知りたいです。
  • 適切な変数と処理方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

VBAでテキストファイルの読み書き

ExcelVBAで、テキストファイルの読み込みと書き換えについて教えてください。 現在は「LINE Input」で一行を読み込み、MIDで文字列を読み込んだり、書き換えていました。 が・・・それは「1文字目から5文字目まで」と決まった位置で書いてあるというのが大前提です。 でも、いつもそうとは決まっていません。当然いろいろな形があるわけです。 500▲▲6.54▲99999▲▲▲▲DDD▲▲ 3000▲40▲▲▲▲PPP▲60.45▲▲ AAA▲CCC▲80.45▲666▲777▲ (見にくいのですが▲はスペースです)などかなり不規則に並んでいる物があります。 「1行目の3番目の数値」(この場合だと99999)をうまく取り出すにはどうしたら良いのでしょうか? 当然その前の500と6.54はどんな数値になっているかわかりませんし、スペースの数も不規則です。 取り出す値の桁数だって決まっている訳じゃありません。 この場合は▲をスペースとしていますが、当然タブで区切られていることも予想できます。 かなりいい加減なデータテキストファイルなのですが、決まっているのは「1行目の3番目の数値」ということだけなのです。 一文字一文字、スペースかタブか文字か?と認識する必要があるのはわかるのですが、切り貼りがうまくできないのです。 文字とスペース(もしくはタブ)を認識してそれを変数に取っておいて、文字をくっつけたりするのでしょうが・・・なかなかうまくいきません。 変数とかもいろいろ用意しているのに・・・根本ができていないようです。 何かわかりやすくて、いい方法を教えていただけないでしょうか?昨日はずっとこれをしていたのですが、目当ての物を取り出せずにいました。どうかお力をお貸しください。よろしくお願いします。

  • quincy
  • お礼率90% (121/133)

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

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

#7について。 (データ)スペースは全角で、▲の数だけいれてます。 OKWEBでは、崩れるようですがご留意を。 500 6.54 99999 DDD 3000 40 PPP 60.45 AAA CCC 80.45 666 777 (コード) Sub test01() g = InputBox("何行目=") n = 0 Open "c:\My Documents\aaa11.txt" For Input As #1 While Not EOF(1) n = n + 1 Line Input #1, a a = WorksheetFunction.Trim(a) If n = Val(g) Then c = Split(a, " ") '半角スペース b = InputBox("何番目=1-" & UBound(c) + 1 & "以下") r = Val(b) - 1 MsgBox c(r) End If Wend Close #1 End Sub ではうまく行くようですが。 何番目と言う、入力数字の範囲を表示するように変えました。この範囲の正整数を入れて見てください。

quincy
質問者

お礼

回答ありがとうございます。遅い時間にまで答えてくださって本当に助かりました。動作完璧です。きちんと取れました。明日の月曜日が先ほどまで憂鬱で仕方がなかったのですが、おかげさまで解消しました。どれほどお礼を申し上げたらよいのやら・・・・。私のポイントを削ってもいっぱい差し上げたいのですが、20ptで許してください。本当にありがとうございました。

その他の回答 (7)

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

#6です。訂正版を上げます。 Sub test01() g = InputBox("何行目=") n = 0 Open "c:\My Documents\aaa11.txt" For Input As #1 While Not EOF(1) n = n + 1 Line Input #1, a a = WorksheetFunction.Trim(a) If n = Val(g) Then b = InputBox("何番目=") c = Split(a, " ") '半角スペース r = Val(b) - 1 MsgBox c(r) End If Wend Close #1 End Sub エクセルのTRIM関数は文字列間の複数スペースを 半角1スペースにしてくれると言うのを思い出して 使ってみましたので、1行増だけです。

quincy
質問者

お礼

回答ありがとうございます。何度も教えて頂いて本当に嬉しいです。早速貼り付けて見ましたところ・・・・「MsgBox c(r)」でインデックスエラーが出てしまいました。それがなぜだかわからない・・・・。私の力不足でいつも聞いてばかりですみません。

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

#3,#5です。 済みません。間違えていました。 c = Split(a, " ") は1全角スペースごとに分割して、配列にいれるようです。 500▲▲6.54▲99999▲▲▲▲DDD▲▲ の場合C(0)に500,C(1)に空白、C(2)に6.54と言う風に。 そのためずれる場合が出てきます。 取りあえず、お手数をお掛けしたことをお詫びします。 訂正分は機会があればまた載せます。

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

#3です。 >ずれているようなのですが そうですね。テストデータでテストした時私も経験しました。スペースに半角と全角が混じったりしているのでは と思い、統一して見ましたら、ズレがなくなりました。 データについて、その辺をチェックして見てください。

quincy
質問者

お礼

回答ありがとうございます。スペースの代わりに最初のテキスト通り「▲」で試してみましたが、やっぱりずれてしまいました。なぜだろう・・・。もうちょっと研究してみます。ありがとうございます。助かりました。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

メニューから、ファイル→開く でファイルの種類をテキストファイルにして『開く』 テキストファイルウイザード1/3で   カンマやタブなどの区切り・・・ にチェック →次へ テキストファイルウイザード2/3で   タブとスペースにチェック   連続した区切り文字は1文字として扱う にチェック →次へ テキストファイルウイザード3/3で   不要な項目があれば削除します。→完了    しかし、    「1行目の3番目の数値」が理解に苦しみます。(特に『目』の意味)    500▲▲6.54▲99999▲▲▲▲DDD▲▲    3000▲40▲▲▲▲PPP▲60.45▲▲    AAA▲CCC▲80.45▲666▲777▲    の『3000▲40▲▲▲▲PPP▲60.45▲▲ 』は2行目?    それとも、『60.45』も3番目の数字でしょうか。 『99999』、『60.45』、『777』を求めるなら、 データがある箇所を選択しておいて、  編集→ジャンプ→セル選択→定数だけを選択し、文字のみにチェック→OK  文字列が選択された箇所で、右クリックして削除→左方向にシフト でOK これで3番目がすぐ分かります。 上の機能を書いてみると、下のようになりました。 3番目の項目のみをA1セルから下方向に書き出します。 『Filename=』を書き換えてください。(当方、Excel2000です) 解答すると、2個続きの半角スペースが書き換わるので、" " & " " と表現しています。 Sub FileRead()   Dim Filename As String       '// ファイル名     Filename = "D:\009\TEST.txt"   Dim FileNo As Integer        '// ファイル番号   Dim rw As Integer          '// 行カウンタ   Dim Rec As String          '// レコード   Dim ary As Variant         '// 分割後レコードデータ   Dim k As Integer          '// 項目カウンタ(ループ)   Dim kT As Integer          '// 項目カウンタ   FileNo = FreeFile   Open Filename For Input As #FileNo   '// ファイルの最後まで読み込む。(該当データをA1から書き出す)   While Not EOF(FileNo)     Line Input #FileNo, Rec       '// タブを半角スペースに置き換え       Rec = Application.Substitute(Rec, Chr(9), " ")       '// 複数の半角スペースを1つにする       While InStr(Rec, " " & " ")         Rec = Application.Substitute(Rec, " " & " ", " ")       Wend     '// データレコードを分割する     If Rec <> "" Then       ary = Split(Rec, " ")          '// 数値と評価した3個目のデータをセルに書き出す       kT = 0       For k = 0 To UBound(ary)         If IsNumeric(ary(k)) Then           kT = kT + 1           If kT = 3 Then             rw = rw + 1: Cells(rw, 1) = Val(ary(k))             Exit For           End If         End If       Next     End If          Wend   Close End Sub

quincy
質問者

お礼

回答ありがとうございます。用意されているファイルは私にも解読不明なのですが、本当にバラバラにひょうじされているのです。が・・・お客様からはちゃんと意味がある物のようです。文字列も数値も合わせてこういうファイルなのです。ただ私はスペースやタブで区切ってあるものを認識して取り出せと言われています。 私のバージョンはXPですが、残念ながらA1のセルには表示されないみたいです。教えて頂いたので、いろいろ試してみたいと思います。ありがとうございます。

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

Sub test01() g = InputBox("何行目=") n = 0 Open "c:\My Documents\aaa11.txt" For Input As #1 While Not EOF(1) n = n + 1 Line Input #1, a If n = Val(g) Then ' MsgBox a b = InputBox("何番目=") c = Split(a, " ") r = Val(b) - 1 MsgBox c(r) End If Wend Close #1 End Sub を標準モジュールに貼りつけて実行して見てください。 ファイル名、フォルダ名は適当に変えてください。 Split(a, " ")の“ ”の中は全角スペースです。 データも全角スペースで統一されているものとします。 問題のテキストファイルでテスト済み。

quincy
質問者

お礼

回答ありがとうございます。こういう方法で・・・・と早速貼り付けてみました。 2行目の「PPP」を取り出そうとすると・・・なぜか空白になってしまうのですが・・・・。 「1行目の3番目」と入力すると、「6.54」が表示されます。ずれているようなのですが、どうしてなのか・・・わかりませんでした。すみません。

  • karl1205
  • ベストアンサー率14% (52/367)
回答No.2

VBAは知りませんが、 Excelでメニューから「.txt」ファイルを開くとき、区切り文字はカンマやタブを選択できて、 それらが連続している場合は1つとみなす設定もできますよね それを使えば問題なく取り込めるのではないでしょうか。

quincy
質問者

お礼

回答ありがとうございます。仰っている方法は多分お客様のお望みとは違う気がして・・・・なかなか難しいところなのです。ありがとうございます。また何かありましたらよろしくお願いします。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

1.スペースが区切り(=データではない)の意味なら、一個になるようにする。 2.区切り文字(スペースやタブ等)を統一する。 という処理を読み込んだデータに行えばデータのフォーマットを統一できると思います。 あとは、Split関数関数で区切り文字を指定すれば、一括して配列に取り込めます。

参考URL:
http://www.moug.net/skillup/opm/opm02-02.htm
quincy
質問者

お礼

回答ありがとうございます。 データファイルは・・・それはVBA上で統一すると言うことでしょうか?ならできるのですが、そのファイルそのものはお客様のものなので、私の方では一切いじることはできません。 教えて頂いたURLでSplit関数の勉強をさせて頂きます。ありがとうございました。

関連するQ&A

  • VBAでテキストファイルの改行を無視する方法

    VBAでテキストファイルにある文字列を配列の変数に格納したいのですが、改行が含まれているとそこから2バイトずつずれてしまいます。 1行毎に読もうとしても1行の文字列が6000バイトぐらいあるので変数に格納しきれません。 読み込むテキストファイルは _________0_________1_________2・・・・________10 _______100________51 のようになっており、10バイトずつ変数に格納していきたいです(スペースも格納する必要あり) 以下のように作ったのですが、改行のあるところからずれてしまいます。 Sub ファイル読み込み() Dim buf(30000000) As String Dim i As Long i = 0 With CreateObject("Scripting.FileSystemObject") With .OpenTextFile("C:\test.text", 1) Do While .AtEndOfStream <> True buf(i) = .read(10) Loop End With End With End Sub 「次の文字列が改行コードである」ということが分かれば.skipで飛ばせるのですが、その判定式が探しても見つかりません。 どなたかご教授よろしくお願いします。

  • シェルスクリプト(bash)によるファイルの編集

    シェルスクリプト(bash)によるファイルの編集についてのご相談です。 私にあまりスクリプトの知識がないので申し訳ございませんが、 どなたかお知恵を拝借させてください。 よろしくお願いします。 【条件】 ・以下のような文字列を含むファイルが複数あるとします。 ・そして、その文字列は、ファイル内の不特定の行に存在します。 ※[半角スペース]、[タブ]は実際には便宜上記載していますが、実際は 本当の半角スペース、タブが入ります。 AAA[半角スペース]BBB AAA[半角スペース]CCC AAA[タブ]BBB AAA[タブ]CCC 【やりたいこと】 このとき、 AAA[半角スペース]BBB および AAA[タブ]BBB の行の下に、それぞれ、 AAA[半角スペース]DDD  と   AAA[タブ]DDD を挿入したいのですが、これをスクリプト(コマンド)でどのように行えば よいのかわからずに困っています。

  • C言語でテキストファイルから読み込み

    下のような形でデータを保存してあるテキストがあるんですが、このうち四行目以降の6個のデータを読み込んで、別のテキストファイルに書き出したいんです。しかし、四行目以降はまったく同じ書式でかかれているのですが、三行目までが空白だったり、文字が混じっていたりで上手くほしいデータを抽出するコードがかけません。何かいい方法はないでしょうか?ご教授よろしくお願いします。 例) データ番号 1    (スペースはタブ。以下同様。) (空白) (空白) 1.2 2.4 0.0 4.4 3.6 0.0 1.3 2.5 0.0 3.2 2.5 0.0 ・ ・ ・ (以下略)

  • vbaでテキストファイル(*.txt)を取込みたい

    vba初心者です。 Application.Dialogs(xlDialogOpen).Showで選択したテキストファイル(***.txt)をテキストファイルウィザードで、タブ、カンマ、スペース区切りで、エクセルファイルに取り込むマクロを組みたいのですが? 何度やってもうまくいきません。 ご教示願えないでしょうか! excel2002を使用してます。 よろしくお願いします。

  • バッチでテキストファイルから任意の行のみ取得したい

    batファイルを作成していて、 txtから特定の行のみをとりだし、変数に入れたいです。 どうもよくわからないので質問したいと思います。 まず以下の様なテキストファイルがあります。 ------------------- 111 222 333 ------------------- 実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。 行いたい動作は、 ----------------------------------------- 1.テキストファイルの1行目を変数Textに入れる(set Text=111) 2.変数Textを使用し色々処理をする 3.テキストファイルの2行目を変数Textに入れる(set Text=222) 4.変数Textを使用し色々処理をする ----------------------------------------- コレを繰り返します。 2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。 n行目を全て取り出す方法がわかれば行けると思うのですが、 どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

  • テキストファイルの任意の行への読み書き

    VisualC++6.0でMFCのプログラムを組んでいるのですが、 ファイルの操作で分からないことがあるので教えてください。 数行にわたってデータの書き込んであるテキストファイルがある場合、 任意の行に新たに文字を書き込んだり、任意の行のデータを読み込んだりすることは可能ですか?? fprintf,fscanfを用いて1行目から順に読み込んだり、1行目に書き込んだりという処理はできたのですが、 任意の行への読み書きができずに困っています。 初歩的な質問だとは思いますが、よろしくおねがいします。

  • テキストファイルを読み込み変数に保存

    phpでテキストファイルを読み込んでその読み込んだ内容を変数に保存したいと思っているのですがうまくいかないのでおしえてください 例 1111 2222 3333 4444 というテキストファイルがあったとしたら 変数名 = 1行目; 変数名 = 2行目; としたいのですがどうすればできるのでしょうか?

    • 締切済み
    • PHP
  • テキストファイルでタブ文字を何に使うのか?

    一般的なテキストファイルでタブ文字はどのような用途で使用しますか? 私の場合は基本的に、プログラムのソースコードで行頭のインデントにしか使いません。 あと強いて言うならば、TSVファイルの区切り文字として使用したり、構造化テキスト(そういうフリーソフト)のファイル内でのシーケンスとして使う事はありますが、これはテキストファイルではあるのですが、特別なルールのあるやや特殊なファイルといえると思います。なので、少なくとも今回はTSVや構造化テキストは「一般的なテキストファイル」ではないと考えます。 ※ソースコードなどで複数行の桁位置そろえで「行中」に使用しているケースを見たことがありますがよくない例ではないかと思います。 なので私は個人的に、「一般的なテキストファイルではタブ文字は行頭のインデントにしか使わない」と思っています。 これはあっていますか? テキストファイルでそれ以外に使うことってありますか? あるならどのような用途で使用しているのか教えてください。 よろしくお願いします。

  • VBAでテキストファイルを最後まで読み込みたい

    テキストファイル内の文章を最後まで読み込みたいのですが、 do  Line Input #1, gyou  処理1 while 条件 で、条件はどのような記述にすればいいのですか? テキストファイルには、改行コードのみの行や、スペースのみの行が混在しています。 また、行数も常に変動するので、 for~nextで予め回数を指定することも出来ません。

  • VBAでフォルダ内のhtmlファイルを読み込みたい

    フォルダ内のhtmlファイルをテキストで読み込んで、 一部修正を行いたいと思っています。 いろいろ調べて、ExcelVBAやAccessVBAで試してみたのですが、 フォルダ内のファイルを認識しないのか、読み込んでくれませんでした。 バージョンは2003です。 良い方法があれば、教えていただけると大変助かります。 よろしくお願いいたします。

専門家に質問してみよう