dポイントプレゼントキャンペーン実施中!

「WindowsXP」/「Office2003Professional」を使用しています。

一つのフォルダに格納された複数のテキストファイルから、指定した文字列を含んだ行だけをExcelに抽出し、一覧表にする方法を教えて下さい。

各テキストファイルの抽出したい部分は以下のようになっています。(一部抜粋)
------------------
+製造元 *NEC
+型番 *ABC-000
+メモリMAX *512GB
+スロット数 *2

+DIMM1 *256 MB *333MHz
+DIMM2 *256 MB *333MHz
------------------
文字の先頭に[+]がついているものが検索文字列で、[*]が抜き出したいデータ部分です。
(実際のテキストでは[+]や[*]は書いてありません。)

これをExcelで検索文字列を項目名に指定し、[*]部分を抜き出し全テキストファイルを一覧表にしたいと思っています。(行列反転した表)

------------------
    A        B    C    D       E       F     G
1 ファイル名 製造元   型番  メモリMAX スロット数  DIMM1   DIMM2 …
2 aaa.txt NEC   ABC-000  512MB     2 256MB   256MB
3 bbb.txt FUJITU FMV10 1024MB 2 512MB
               ・
               ・
------------------
●テキストファイルの検索文字列とデータの間には半角スペースが入っています。
●テキストファイルの検索文字列の行位置はファイルごとに異なります。
●テキストファイルの検索文字列の中にはファイルによっては存在しない文字列もあります。
●ExcelのA列にはフォルダ内のファイル名が予め全て入力されています。

もしもVBAを使用しなければならない場合は、VBAの知識が無い為、勝手を申しますが詳しくご教示頂けると幸いです。

宜しくお願い致します。

A 回答 (3件)

1、[Sheet1]タグを右クリックし[コードの表示(V)]をクリック。


2、メニューバーも[ツール(T)]-[参照設定(R)]をクリック。
3、Microsoft scripting runtime にレ点を付けて[OK]ボタンをクリック。

これで、コンパイルエラーは回避できます。

質問者は、単なる関数ユーザーです。

A1=DataRead("C:\Temp\test1.txt", "製造元")

と書けりゃー十分ですよ。

この回答への補足

御礼と補足が前後して申し訳ありません。

どうやらテキストファイルの中身の空白の数が行によってランダムになっている為、うまく行かないようなのですが…
これを解決する方法はありますか?

厚かましくも思いますが宜しくお願い申し上げます。

補足日時:2007/12/05 11:40
    • good
    • 1
この回答へのお礼

何とかテストは成功しました。
今度はこれを実際のフォルダとファイル名に当てはめてみます。
お忙しい中有難うございました。

お礼日時:2007/12/05 09:17

横槍ごめんなさい。

 

あれっ! その後どうなったのでしょう?  気になったので・・・

未だのときは、こんな感じでテストされてみては如何でしょうか。

1.Alt + F11 で VBE(Visual Basic Editor)を開きます。
2.VBE のメニューから[挿入] -->[標準モジュール] を指定します。
3.コードウィンドウに Husky2007さん 提示のコードをコピーして貼り付けます。
4.メニューから[ツール]--->[参照設定]で、「参照可能なライブラリファイル」の中から
  「Microsoft Scripting Runtime」を探し、チェックを付け[OK]します。
5.Alt + Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。
6.メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティレベル」を
 「中」にして[OK]します。

これでVBAの設定は完了。

次にシートのセルB2に   =DataRead("C:\DATA\"&$A2,B$1) の計算式を設定します。
(上の式で C:\DATA\ の部分は、実際のテキストファイルのパスを指定)
これをG列迄右にコピーし、更にそれをA列の最終データまで下へコピーします。

あと、DIMM1と2のクロックを拾ってくるかどうか。 もしかして変更必要かも。

この回答への補足

有難い横槍感謝しておりますm(u_u*)m
ご配慮頂いたお陰で何とかテストは成功しました。
>=DataRead("C:\DATA\"&$A2,B$1) の計算式を設定します。
>あと、DIMM1と2のクロックを拾ってくるかどうか。 もしかして変更必要かも。
教示頂いた式で試し、後ほど結果をご報告致します。

補足日時:2007/12/05 10:06
    • good
    • 0
この回答へのお礼

その後の報告です。
実際のパスで式を作りましたが…何故か空白が返ってきてしまいます(つДT)

項目名(検索文字列)が実際には英語である事は関係ありますか?
本当は「System,Vendor」「System,Model」となっているのですが、前回同じ内容で投稿した際、
「英語で書くと回答者にわかり難い」とご指摘頂いたので、回答もつかなかった為、変更して投稿したのですが…。

仕事なので諦める訳にはいかない為、色々試してみます。

お礼日時:2007/12/05 11:20

VBA 初心者ならば、その手続きをコードで記述することが苦手でしょう。


ならば、非手続き的に関数一発で読み込む環境を整えるしかないでしょう。

<Test1.txt>

製造元 NEC
型番 ABC-000

これを、非手続き的に関数一発で読み込むテストをしてみましょう。

[イミディエイト]
? DataRead("C:\Temp\test1.txt", "製造元")
NEC
? DataRead("C:\Temp\test1.txt", "型番")
ABC-000

この際、実行速度とかは無視し、簡便さのみを追求するとこのようでしょう。
次の2つの関数を標準モジュールに追加すれば、このように関数一発で読み込めます。

A1=DataRead("C:\Temp\test1.txt", "製造元")

でA1には’NEC’と表示されます。
これで、VBAと無関係にデータを呼び込むことも可能かと思います。

Public Function DataRead(ByVal FileName As String, ByVal KeyWord As String) As String
On Error GoTo Err_DataRead
  Dim isFound As Integer
  Dim fso   As FileSystemObject
  Dim fil   As File
  Dim txs   As TextStream
  Dim strData As String
  
  Set fso = New FileSystemObject
  Set fil = fso.GetFile(FileName)
  Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)
  Do
    strData = txs.ReadLine
    If InStr(1, strData, KeyWord, vbTextCompare) > 0 Then
      isFound = 2
      Exit Do
    End If
  Loop Until 0
Exit_DataRead:
  Set txs = Nothing
  Set fil = Nothing
  Set fso = Nothing
  DataRead = CutStr(strData & "", " ", isFound)
  Exit Function
Err_DataRead:
  Resume Exit_DataRead
End Function

Public Function CutStr(ByVal Text As String, _
            ByVal Separator As String, _
            ByVal N As Integer) As String
  Dim strDatas() As String
  
  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs((N <= UBound(strDatas))))
End Function

※Microsoft scripting runtime を参照させて下さい。
※もしくは、ダイレクトに参照させるコードに修正。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
意味が解らないなりにやってみたのですがやはり出来ません(T_T)
テストの段階でコンパイルエラーと表示され既に躓きました。

やはり私には無理なのでしょうか......

お礼日時:2007/12/04 13:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A