• ベストアンサー

行数の多いテキストデータから、任意の部分のみを読み込むには?

以下について、どなたかアドバイスをお願いします。 1.行数の多いテキストデータ(拡張子:prn)があります。この中の一部をExcel VBAでエクセルシートに貼付る事が目的です。 2.行いたいことののフローとしては、下記の様なデータprnファイルがあり、   :   : *** 節点データ 節点    X-座標    Y-座標    Z-座標 番号    (m)    (m)    (m) 101    0.0   0.0   0.0 105    4.0    0.0    0.0 201    0.0    0.0    0.0 205    4.0   0.0    2.0 *** 部材データ   :   :   (1)エクセルで「開く」→「**.prn」を選択   (2)「カンマやタブなどの区切り文字によってフィールドごとに区切られたデータ」を選択   (3)「タブ」と「スペース」を選択して「完了」     (ここまでで、各数値を一つ一つのセルに入力したい)   (4)開いたファイルの中で“ある文字から、ある文字”までを目的のシートに貼付る     (***節点データ から ***部材データの上までをコピー)   といった内容です。 3.自分ではマクロの記録を使って作成してみたのですが、「行数の多い」というのがネックとなり、シートの65536行までにデータが収まりきらないのです。 4.一度、シートに貼付けせずに、テキストファイルから直接必要な部分のみを読みこむ等の方法がありませんでしょうか。 5.なお、このテキストファイルのデータは、固定長では無いです。 内容がややこしいかもしれませんが、宜しくお願いします。

  • ogak
  • お礼率100% (4/4)

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

  • ベストアンサー
回答No.3

こうなります。 Sub Main() Dim sRecord As String Dim vValues As Variant Dim bIsTarget As Boolean Dim y As Long Dim x As Long Close 'デバッグ用 Open "c:\test.txt" For Input As #1 While Not EOF(1) Line Input #1, sRecord '最初の3文字が***だったら If Mid(sRecord, 1, 3) = "***" Then '対象範囲か判定 If sRecord Like "*節点データ*" Then bIsTarget = True Else bIsTarget = False End If Else '対象範囲だったら If bIsTarget Then y = y + 1 'Tab区切りで分割して、vValues配列に格納。 vValues = Split(sRecord, vbTab) 'レコードが空じゃなかったら(空だと右辺=-1) If LBound(vValues) = 0 Then For i = LBound(vValues) To UBound(vValues) Cells(y, i + 1) = vValues(i) Next End If End If End If Wend Close #1 End Sub

ogak
質問者

お礼

頂いた回答に補足内容を加え、目的を達成することができました。 みなさん、有難うございました。

ogak
質問者

補足

ご回答有難うございます。 ファイルを開くことはできたのですが、各行が全てA列に入ってしまいました。 各数値を1つ1つのセル(A、B、C …)に入力するには、どのようにすれば宜しいでしょうか。 すいませんが、宜しくお願いします。

その他の回答 (3)

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

コードはもう回答で掲載されているので プログラム経件が浅いようなので、しっかり次ぎのことを認識しましょう。 テキストファイルから自分の目指すもの(条件に合ったもの)を探すには全レコードを読み込むつもりで処理します。 ●先頭レコードが現れるまで読み飛ばし、 現れたら、終わる印が入ったレコードまで書き出し。 この場合は再度条件合致分がないという仕様であるのなら、処理を打ち切ってよい。 FROM-TO型 本件 ●初めから終わりまで、散発的に、条件に合ったものだけを書き出し。拾い上げ型 この場合は終わりまで読まざるを得ない。 ーー 条件にあったレコードを別テキストファイルの一旦書き出しするのがお勧めです。しなくてもできますが、色々メリットが考えられます。 ーー それとテキスト形式の場合は、アウトプットは別テキストファイルにせざるを得ないことを、銘記して置いてください。 ーーー 1レコードを読んだとき、カンマ(スペー)で区切るのは、Split関数がぴったりです。一旦フィールド数だけの配列に収まりますので、 A=Split(b,",") Aは配列的でA(1)などで値を取り出せる。 エクセルシートの各列に、For j=0 To Ubound(a)で値をセットします。=>各行が全てA列に入ってしまいました。の解決策です。 ーー 読み込みはLine Inputで、1レコード分を、(復帰改行までが1レコード)読み込みます。 ーーー テキストファイルを受け入れるエクセルの行の管理は、行ポインター的な変数を使い、Cells(i,j+1)=A(j)・・で、各列代入処理が終わると、i=i+1で1行下の行に進めます。

ogak
質問者

お礼

ご指摘の通りです。 有難うございました。

noname#140971
noname#140971
回答No.2

<C:\Temp\Test.txt> 101  0.0  0.0  0.0 105  4.0  0.0  0.0 201  0.0  0.0  0.0 205  4.0  0.0  2.0 [イミディエイト] 105  4.0  0.0  0.0 201  0.0  0.0  0.0 上述のように105~201を選択的に表示するコードは以下の通りです。 ルーチンは、 ・FileRead 関数を利用して1行づつ strData に読み込む。 ・Split 関数を利用して、strDatas(0)、strDatas(1)・・・strDatas(n)に代入する。 ・If 文で選択的に表示。 ・"201" に達したらループを抜けるために strData に空文を代入。 という簡単なものです。 もちろん、どこからどこまで抜き出すかの条件文は質問者が工夫する必要があります。 Private Sub コマンド0_Click()   Dim strData  As String   Dim strDatas() As String      Do     strData = FileRead("C:\Temp\Test.txt")     If strData <> "" Then       strDatas() = Split(strData, " ")       If strDatas(0) >= "105" And strDatas(0) <= "201" Then         Debug.Print strData         If strDatas(0) = "201" Then           straData=""         End If       End If     End If   Loop Until strData = "" End Sub なお、FileRead 関数は、Microsoft Runtime Scripting を参照させないと動作しません。 Public Function FileRead(ByVal FileName As String, Optional isStop As Boolean = False) As String On Error GoTo Err_FileRead   Static isOpen As Boolean   Static fso  As FileSystemObject   Static fil  As File   Static txs  As TextStream      If Not isOpen Then     isOpen = True     Set fso = New FileSystemObject     Set fil = fso.GetFile(FileName)     Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   End If   FileRead = txs.ReadLine Exit_FileRead:   If Len(FileRead) = 0 Or isStop Then     isOpen = False     Set txs = Nothing     Set fil = Nothing     Set fso = Nothing   End If   Exit Function Err_FileRead:   Resume Exit_FileRead End Function

ogak
質問者

お礼

回答有難うございます。 私にはちょっと難しいところもありますが、解読してみます。

  • toshi_2000
  • ベストアンサー率30% (306/1002)
回答No.1

マクロは次の通り。 open "xxx.prn" for input as #1 do while true input #1,a$ if a$="*** 節点データ" then '必要データの処理 end if loop close #1

ogak
質問者

お礼

ありがとうございました。

ogak
質問者

補足

ご回答有難うございます。 ファイルを開くことはできたのですが、各行が全てA列に入ってしまいました。 各数値を1つ1つのセル(A、B、C …)に入力するには、どのようにすれば宜しいでしょうか。 すいませんが、宜しくお願いします。

関連するQ&A

  • VBAでテキストファイルのデータを読み込んでExcelで開く+α

    テキストファイルをExcelファイルとして読み込む事が多く、その量に加えデータの並び方が特殊な為困っております。 テキストファイルのデータの並びをExcelで上下逆順に読み込ませるにはどのようにすればいいでしょうか? また、まとめて複数のテキストファイルを上記の状態で自動的にシートごとに分けて出力させたりしたいのですが。 (例-1行目は無視) ---テキストデータ(タブ区切り)--- 0 0 10 02 11 05 02 15 01 20 25 12 15 10 ---Excelシートデータ--- 0 0 12 15 10 01 20 25 05 02 15 10 02 11

  • 【VBA】テキストファイルを指定行数からの読み込み

    こんばんは。 EXCEL VBAでテキストファイルを読み込む事について質問です。 VBAでテキストファイルをこちらから指定する行数(上から何番目という感じで)からデーターを読み込みたいのですが、どの関数をつかっていいかわからず困っています。 1行ずつ読みこむ「Input Line関数」では、無駄な行まで読み込むので動作が遅くなります。 読み込みたい行はすでにわかっているので、最初からその行に飛んでからデーター読み込みたいと思ってます。 ちなみに指定する行数は、ファイルによって違います。 あらかじめ「Input Line関数」で、ある文字が何行目にあるかを探す行為をあらかじめ行っています。 みなさまのアイデアを拝借したく、よろしくお願いします。

  • エクセルからテキスト(タブ区切り)で保存したら""が付きます

    エクセル2002で編集したデータをテキスト(タブ区切り)で保存しました。 それをメモ帳で開いたら文字の前後に「""」が付いていました。 エクセルで開いたときにはセル内が「A 123」となっているのに メモ帳で開いたときは「"A 123 "」となってしまいます。 コピー→値貼付しても直りません。 これはどうしてなのでしょうか?直す方法はありますか?

  • エクセルのデータをTAB区切りテキストに出力

    エクセルのデータをTAB区切りテキストに出力 1.エクセルのデータをTAB区切りテキストに出力して 2.そのテキストを入力としてrubyでデータ加工 という作業があります。現在1を手動で行っておりますが、ファイルが多いためこの操作をファイル名とシート名を指定してrubyから操作できればと考えております。 できれば追加でライブラリをインストールすることなく実現できればありがたいのですが、簡単な方法がございましたらご教示ください。 環境は、Win XP、Office 2003、ruby 1.9.1です。 最終的にはエクセルファイルから直接データを取得できるようにしたいのですが、当面は上記の方法で凌ぎたいと考えております。

    • ベストアンサー
    • Ruby
  • エクセルで作ったデータをテキストに貼り付けたいです。

    エクセルで作ったデータをテキストに貼り付けたいです。 Excelの表を範囲選択してコピーしてメモ帳/またはメールに貼り付けると、タブ区切りのテキストとして貼り付けられてしまいます。 そうなると、データがデコボコになりすごく見づらいです。 毎日使うので、すべての行を手作業でスペースを入れるのも大変です。 なにか方法等ご存知でしたらお教えいただけると助かります。 よろしくお願いいたします。

  • 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上で S(1,1) S(2,1) S(1,2) S(2,2) と書いたデータをテキスト(タブ区切り)で保存し、そのファイルをテキストエディタで表示させると "S(1,1)" "S(2,1)" "S(1,2)" "S(2,2)" といった感じでデータに""が追加されてしまいます。 恐らく()がある事で数式なのか文字なのかを判別する意味でExcelが勝手に付けたものだと思われるのですが、この""を無くす方法はありませんでしょうか?

  • PRNファイルをエクセルEXCELで関連付けしたいのですが

    prnファイル(スペース区切りテキストデータ)をエクセルに読み込むのは、エクセルを起動後にテキストデータウィザードでできますが、エクスプローラーで当該prnファイルをダブルクリックして(例えばABC.prnをダブルクリック)、起動、データ読み込みするにはどのようにしたらよいのでしょうか。単にエクセルに関連付けすると、最初の列に長いテキストとして読み込まれてしまいます。 よろしくお願い致します。

  • テキストをエクセルで開いた場合にデータが切れます

    テキストファイル(ファイル拡張子.txt)を右クリックでエクセルファイルから開いた場合、 データが途中までは開くのですが、後ろが切れてしまいます。 テキストファイルは、カンマで区切った20項目くらいの文字列です。 この14項目の1文字位から後が全く表示されません。 全項目うまくエクセル変換するにはどうしたら良いでしょうか? エクセルの新規ファイルを開いた後、データの取り込みでテキストファイルを 取り込んだ時にはうまく入ります。 このやり方ではなく、右クリックからエクセルとして開く方法を使いたいのです。 教えてください。お願いします。

専門家に質問してみよう