[[20080404142253]] 『テキストデータから特定のデータのみを読み込む』(VBA初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『テキストデータから特定のデータのみを読み込む』(VBA初心者)

 下記のようなタブで区切られたテキストデータがあり、
 @テキストファイルを選択。
 AD・E・F列の3行目以降のデータを読み込む
 ということは出来ないでしょうか?
 どなたかご教授願います。

      A     B    C      D     E     F  
 1 0061111 000 000000 00000 00000 00000
 2 0065575 000 000000 00000 00000 00000
 3 0020105 000 000433 00040 00023 00001
 4 0045793 000 001120 00001 00153 00002
 5 0088261 000 032333 00005 01111 00089


 全部読み取って、1:2行目/A:C列を削除
 でもよさそうな...

 Sub test()
 Dim a(), n As Long, fn As String, txt As String, x, y, maxCol As Integer
 fn = "c:\test.txt"  '<- 要変更
 temp = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll
 x = Split(temp, vbCrLf)
 ReDim a(1 To UBound(x) + 1, 1 To Columns.Count)
 For i = 2 To UBound(x)
     y = Split(x(i),vbTab)
     If UBound(y) > 2 Then
         n = n + 1
         For ii = 3 To UBound(y)
             a(n, ii - 2) = y(ii)
         Next
         maxCol = Application.Max(maxCol, UBound(y) + 1)
     End If
 Next
 ThisWorkbook.Sheets(1).Range("a1").Resize(n,maxCol).Value = a
 End Sub
 (seiya)

 私のエクセルは、97ですので、多少操作が異なるかもしれませんが、
 ファイル、開く、ファイル指定、開くボタンクリック、取り込み開始行指定、次へ、次へとして、
 各列のデータ形式で文字列をONにして、OKとするのですが、なにか不具合があるのでしょうか?(6UP)

 (seiya)さんありがとうございました。
 試してみたら、"実行時エラー9"とでてしまいます。
 なぜなのでしょうか?
 それと、できれば解説もお願いします。 
 (VBA初心者)


 変更箇所は正しく変更されていますか?
 実行時エラー9 (Subscript Out Of Range) ?
 括弧の中の文字列が見当たらない、というようなことです。
 (seiya)


 (6UP)さんに追加、
 不要な列は削除してやれば、簡単かと思います。
 これで意味が解ります?(データ形式を指定する時)
 BJ


 c:\test.txt←これをかえるんですね。
 そのままにしてました。
 かえたら今度は実行時エラー1004とでました・・・

 (6UP)さんとBJさんへ
 手作業で取り込めばいいのではないかというご意見でしょうか? 
 (VBA初心者)


 そのように回答差し上げています。        (6UP)

 > かえたら今度は実行時エラー1004とでました・・・
 どの行でエラーが出ますか?

 手作業で読み込んで、マクロの記録をしたほうがよいと思いますが?
 (seiya)

 ThisWorkbook.Sheets(1).Range("a1").Resize(n,maxCol).Value = a
 でエラ−が出ます。

  (VBA初心者)


マクロの自動記録で試してみようと思います。
 (VBA初心者)


 > ThisWorkbook.Sheets(1).Range("a1").Resize(n,maxCol).Value = a
 > でエラ−が出ます。
 ということは、nが0だということでしょう。
 Tab 区切りのテキストファイルですか?
 そおでなければ
 y = Split(x(i),vbTab)
 の vbTab の部分を変更する必要があります。
 (seiya)

 スペースで区切られたファイルでした。
 なので、
 y = Split(x(i),Chr(32))
 に直してやってみたらできました。

 このマクロに関してなんですが、
 今回はテキストAのスペースで区切られた6つの項目のデータを取り込みました。
 このテキストAと同じようにスペースで区切られた6つの項目があるテキストBのデータを
 取り込むことはできますか?

 [テキストA]
      A     B    C      D     E     F  
 1 0061111 000 000000 00000 00000 00000
 2 0065575 000 000000 00000 00000 00000
 3 0020105 000 000433 00040 00023 00001
 4 0045793 000 001120 00001 00153 00002
 5 0088261 000 032333 00005 01111 00089

 [テキストB]
    A   B    C      D     E     F  
 1 477 XXX 000 00000 00000 00000
 2 477 HDX 000 00000 00000 00000
 3 477 HDX 433 00040 00023 00001
 4 477 XXX 120 00001 00153 00002
 5 488 GBX 333 00005 01111 00089

 (VBA初心者)

 fn を テキストBのファイル名に変更して試しましたか?
 (seiya)

 いくつかのファイルでファイル名を変えて試してみましたが、
 できるものとできないものがあります。

 できなかったテキストデータは以下のような内容で、
 スペースで区切られていることも確認しました。
 何が原因なんでしょうか?

 0065C561 ??? 00000000 00000000 00000000 00000000
 0065C575 ??? 00000001 000001FE 00000265 000001E8
 (VBA初心者)


 どのようにできなかったのでしょう?
 その辺を詳しく説明してもらわないと、こちらにはさっぱりわかりません。
 (seiya)

 "実行時エラー1004"
 ThisWorkbook.Sheets(1).Range("a1").Resize(n,maxCol).Value = a
 でエラ−が出ました。
 (VBA初心者)


 行数・列数・区切り文字等がどのようになったものですか?
 3行目/4列目から読み始めるので
 3行に満たない、または4列以上無いファイルではそのままでは読み込めませんよ?
 (seiya)

 行数:32行
 列数:6列
 区切り文字:スペース(←コードを確認しました。)
 です。

 試しに新しいテキストブックにエラーとなったテキストの内容をコピペしたら
 エクセルに読み込むことができました。
 こんなことってあるんですか?

 (VBA初心者)


 > 試しに新しいテキストブックに...
               ^^^^^^^^^^^^^
 私にはわかりません。
 (seiya)

 エラーとなるファイルをEmEditorで開いて名前をつけて保存としたとき、
 ファイルの種類、エンコードの選択のほかに改行方法というのがありました。
 もとは" LFのみ(UNIX)"となっていて、これを"CR+LF(Windows)"にして保存したテキストファイルの読み込みはできました。
 これは解決策のヒントになるでしょうか?

 この問題についてはとりあえず、おいといて・・・

 ファイル指定について
 ファイルを指定していましたが、
 これをどのファイルでも選択できるようにできないかと・・・
 http://officetanaka.net/excel/vba/file/file02.htmを参考にして
 自分でこんな感じに作ってみました。

 Sub test1()
 Dim a(), n As Long, fn As String, txt As String, x, y, maxCol As Integer
 fn = Application.GetOpenFilename("テキストファイル,*.txt")
    If OpenFileName <> "False" Then
    temp = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll
     x = Split(temp, vbCrLf)
     ReDim a(1 To UBound(x) + 1, 1 To Columns.Count)
     For i = 2 To UBound(x)
         y = Split(x(i), Chr(32))
         If UBound(y) > 2 Then
             n = n + 1
             For ii = 3 To UBound(y)
                 a(n, ii - 2) = y(ii)
             Next
             maxCol = Application.Max(maxCol, UBound(y) + 1)
         End If
     Next
     ThisWorkbook.Sheets(1).Range("a1").Resize(n, maxCol).Value = a
   End If
 End Sub
 やりたいはできていますが、これでいいの?と思っています。
 (VBA初心者)


 それでしたら
 Chr(9) または chr(160) とかで試してみてください。
 (seiya)

Chr(9) と chr(160)で試してみましたが、できませんでした。
 (VBA初心者)


 これで試してください。

 Sub test()
 Dim a(), n As Long, fn As String, txt As String, x, y, maxCol As Integer
 fn = "c:\test.txt"  '<- 要変更
 temp = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll
 With CreateObject("VBScript.RegExp")
     .Pattern = "[\f\n\r\v]"
     .Global = True
     txt = .replace(txt, vbCrLf)
     .Pattern = "\n{2,}"
     txt = .replace(txt, vbCrLf)
 End With
 x = Split(temp, vbCrLf)
 ReDim a(1 To UBound(x) + 1, 1 To Columns.Count)
 For i = 2 To UBound(x)
     y = Split(x(i),vbTab)
     If UBound(y) > 2 Then
         n = n + 1
         For ii = 3 To UBound(y)
             a(n, ii - 2) = y(ii)
         Next
         maxCol = Application.Max(maxCol, UBound(y) + 1)
     End If
 Next
 ThisWorkbook.Sheets(1).Range("a1").Resize(n,maxCol).Value = a
 End Sub
 (seiya)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.