• ベストアンサー

GetOpenFilenameを使用し、複数行のデータを抽出について

エクセルVBA初心者です。 いろいろ調べましたが、うまくいかずご教授頂ければとお聞きします。 よろしくお願いします。 テキストファイル10万行からなるデータが入っています。 「aaa」と文字列を検索し、その下10行を抽出したいのです。 Sub 抽出() fname = Application.GetOpenFilename(FileFilter:="(*.*),[*.*]", Title:="data?", MultiSelect:=False) if fname For Input As #1 Do Line input as #1 If InStr(data, "aaa") > 0 Then For i = 1 To 10 Cells(i, 1).Value = data Next End If Loop Until EOF(1) Close #1 End Sub

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

  • ベストアンサー
  • Alpha-j
  • ベストアンサー率66% (18/27)
回答No.1

以下に多少改善したコードを記入しますが、10万行のファイルを取り扱えるかは不明です。ご存知のとおりExcel2003までは65536行が最大値です。 また最初に開くファイルはテキストかCSVになっていますのでもしExcelでしたら txt → xls などに変更してください。また aaa を見つけた後10行を C:\test.txt へ吐き出すように作成しましたのでここも適当に書き換えてください。更に aaa は一回しか出現しないことを前提にしています。 よろしければ動作結果を再度 Up してください Sub 抽出() Dim filter As Variant Dim title As Variant Dim fname As Variant Dim data As String filter = "Textファイル (*.txt;*.csv),*.txt;*.csv" title = "ディレクトリとファイルの選択" fname = Application.GetOpenFilename(filter, , title, , False) If fname <> "" then Open fname For Input As #1 else Exit Sub End If Do Until EOF(1) Line input #1, data If InStr(data, "aaa") > 0 Then Open "C:\test.txt" For Output As #2 For i = 1 To 10 Write #2, data Line input #1, data Next Close #2 Exit Do End If Loop Close #1 End Sub

gorobeee1
質問者

お礼

ご回答ありがとうございます! 詳しく説明しなかったのですが、"aaa"は多数出現するのです。。。 10万行で、Excelでは開けないので、必要な"aaa"の後の10行ずつだけ抽出したいと思ったのですが。

その他の回答 (2)

  • Alpha-j
  • ベストアンサー率66% (18/27)
回答No.3

他の条件はよろしいですか? 1. 最初に開くファイルはテキストかCSV。 2. また aaa を見つけた後10行を C:\test.txt へ吐き出す。 3. aaa は複数回出現する。 よろしければ動作結果を再度 Up してください Sub 抽出() Dim filter As Variant Dim title As Variant Dim fname As Variant Dim data As String filter = "Textファイル (*.txt;*.csv),*.txt;*.csv" title = "ディレクトリとファイルの選択" fname = Application.GetOpenFilename(filter, , title, , False) If fname <> "" then Open fname For Input As #1 else Exit Sub End If Open "C:\test.txt" For Output As #2 Do Until EOF(1) Line input #1, data If InStr(data, "aaa") > 0 Then For i = 1 To 10 Write #2, data Line input #1, data Next End If Loop Close #1 Close #2 End Sub

gorobeee1
質問者

お礼

お礼が遅くなり申し訳ありません。 ご回答ありがとうございます! 希望していたとおり動きました! ところで、C:\test.txt の抽出結果に、全て「””」が付くのですが、 これはなぜでしょうか・・・。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 ちょっと試してみました。 10行の中で、「aaa」が現れても、カウントは、リセットされません。そのまま、10行を数えます。細かく、検証されていませんが、こんな感じなのかと思いました。 Sub Test1()   Dim fName As String   Dim fNum As Integer   Dim txtLine As String   Dim i As Long   Dim j As Integer   Dim flg As Boolean   fName = Application.GetOpenFilename( _   "テキストファイル(*.txt;*.csv),*.txt;*.csv", 1, "データ抽出")      If fName = "False" Or fName = "" Then Exit Sub      fNum = FreeFile()   i = 1   j = 0   Open fName For Input As #fNum   Do Until EOF(fNum)     Line Input #fNum, txtLine     '文字検索     If InStr(1, txtLine, "aaa", vbTextCompare) > 0 Then       flg = True     End If     If flg Then       Cells(i + j, 1).Value = txtLine       j = j + 1       'ワークシートの行の限界を越えたら離脱       If i + j > Rows.Count Then Exit Do       If j > 10 Then         flg = False         i = i + j         j = 0       End If     End If   Loop   Close #fNum End Sub

gorobeee1
質問者

お礼

お礼が遅くなり申し訳ありません。 ご回答ありがとうございます! 希望していたとおり動きました! 本当にありがとうございます。

関連するQ&A

  • VBAにて複数フォルダのエクセルファイルからデータ抽出を行いたいのですが…

    現在、下記の方法で複数のブックからデータを抽出し、 一覧表示をしています。(一覧表示をしているブックを仮にAとします。) 今のままだと、同一フォルダ内のブックしか抽出されません。 これを、サブフォルダまで対象にするには、どうすれば良いのでしょうか? 簡単に例をあげると、 フォルダ(1)の中にAを入れておいて フォルダ(1)の下にあるサブフォルダ(1)、サブフォルダ(2)の中にあるブックからデータの抽出を行いたいのです。 現在つかっているVBAは Sub 抽出用() Dim FName As String Dim Folder As String Dim wb As Workbook Dim i As Integer, j As Integer Application.ScreenUpdating = False Folder = ThisWorkbook.Path & "\" i = 1: j = 1 Worksheets(1).Cells.ClearContents FName = Dir(Folder & "*.xls") Do While FName <> "" If FName <> ThisWorkbook.Name Then Workbooks.Open (Folder & FName) Workbooks(Workbooks.Count).Worksheets(5).Rows("1:1").Copy _ ThisWorkbook.Worksheets(5).Cells(i + 3, 1) Workbooks(Workbooks.Count).Close Application.StatusBar = j & "ファイル処理済み" i = i + 1: j = j + 1 End If FName = Dir() Loop Application.StatusBar = "" Application.ScreenUpdating = True MsgBox ("完了しました") End Sub です。 いいお知恵があれば、よろしくお願い致します。

  • ◆ GetOpenFilename()で複数ファイル選択ができない、I

    ◆ GetOpenFilename()で複数ファイル選択ができない、IsArray()でNG。。。   複数選択のやり方をOKWaveで見つけ便利に活用させて頂いていたのですが、  今年になって、機能しなくなり困っています。手が出ない状況です。  ご教示、よろしくお願いします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 概要:Debugでみると、IsArray()の結果がfalse(GetOpenFilename不成功)  使用環境:  Microsoft EXCEL 2002 (10.6856.6853)SP3  Microsoft Visual Basic 6.0  Microsoft Windows XP Professional version 2002 Service Pack 3 不具合の発生箇所: 取込元ファイル = Application.GetOpenFilename(FileFilter:="Excelブック(*.xls),E*.xls", _ Title:="取込元の4ファイルを選択。Ctrlキーを押しながら複数選択。", MultiSelect:=True) If IsArray(取込元ファイル) Then ' 読む込み成功の確認、IsArray関数 <問題のマクロ> Sub メイン() ' ------------------------------------------------------------------- ' -  取込元のファイルを選択してオープン  ' ------------------------------------------------------------------- Dim 取込元ファイル, Work1, Work3 As Variant Dim i As Integer 取込元ファイル = Application.GetOpenFilename(FileFilter:="Excelブック(*.xls),E*.xls", _ Title:="取込元の4ファイルを選択。Ctrlキーを押しながら複数選択。", MultiSelect:=True) If IsArray(取込元ファイル) Then ' 読む込み成功の確認、IsArray関数 For i = 1 To UBound(取込元ファイル) '配列の上限UBound(データの件数 4件) Workbooks.Open 取込元ファイル(i)   'ファイルオープン Work1 = Dir(取込元ファイル(i)) WORK3 = WORK3 & Work1 & vbCrLf 'MSG表示用(取込んだファイル名一覧)   MsgBox "選択したファイルは " & vbCrLf & WORK3 & " ", vbInformation Next i Else MsgBox "取込元ファイルのオープンを" & vbCrLf & "中止しました", vbExclamation End If End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • 複数ファイルから情報抽出

    VBAで、複数ファイルから、指定したセルに情報抽出したいと思っております。 下記のようなエクセルファイルがあり、1列目、2列目はすでに入力されています。 2列目に詳細が書かれているテキストファイル名が記載されていて、該当ファイルは、同じルートの \filefoldaの中に、格納されています。 \filefolda内のテキストファイルから、3列目の情報を抽出したいのです。 アメリカ   america.txt          シカゴ ←テキストファイルから抽出  日本    japan-oamori1.txt      ロシア   rossia.txt            テキストファイルの中身(アメリカの例): <div> <div> <h1>参加国</h1> <div id="country"> <div id="organizationsBox"> <h1>アメリカ<br>   ←この2行だけを取り出して、セルに入れたい。(3行の場合もある) シカゴ</h1>    ← <h2></h2> <div> <p>内容</p> </div> <h2>人数</h2> <div></div> <h2>メモ</h2> やりたいこと: \filefolda 内の各該当のファイル(1列目は「america.txtを」開いて、地域名(1行目は、「シカゴ」)をエクセルのセルに取り出したいが、一度には難しそうなので、まずは、 テキストファイルから、<h1>から、</h1>までの行を取り出して、エクセルのセルに入れていきたいと 考えております。 コードは作成してみたのですが、VBA初心者でうまくいきません。どこをどう直したらよいのかご教授いただけると助かります。よろしくお願い致します。 Sub toridashi() Dim InputFile As String Dim FileName As String Dim i As Integer Dim LastRow As String LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 1 To LastRow FileName = Cells(i, 2).Value InputFile = ActiveWorkbook.Path + "\filefolda\" + FileName Open InputFile For Input As #1 Dim NameLineString As String Dim st As Integer st = 0 While Not (EOF(1)) Line Input #1, NameLineString Select Case st Case 0   If InStr(NameLineString, "<div id="country">") > 0 Then   st = 1   End If Case 1   If InStr(NameLineString, "<h1>") > 0 Then   st = 2   End If Case 2   If InStr(NameLineString, "<h2>") > 0 Then   st = 1   End If End Select   If st = 2 Then   Cells(i, 3).Value = NameLineString   End If  Wend  Close #50  Next i End Sub

  • エクセルの画像リンク解除

    Pictures.Insert で書かれた内容を Shapes.AddPicture の構文に変更したいのですが、 VBAの知識が乏しいので、なかなかうまくいきません。 どなたかわかる方はいらっしゃいますでしょうか? 宜しくお願いします。 Sub Test() Range("B3").Select Dim fName, pict As Picture fName = Application.GetOpenFilename("JPG, *.jpg", MultiSelect:=True) If IsArray(fName) Then For i = 1 To UBound(fName) Set pict = ActiveSheet.Pictures.Insert(fName(i)) pict.TopLeftCell = ActiveCell pict.Width = ActiveCell.Width * 2 pict.Height = ActiveCell.Height * 6 ActiveCell.Offset(7, 0).Activate Next i End If End Sub

  • フォルダ内にあるテキストファイル複数行転記について

    Excel VBAにて、フォルダ内のテキストファイルの複数行をExcelに転記するにはどうしたら良いでしょうか。 WEBサイトで似たようなものがありましたが、このマクロは2行目のみの転記です。 実際は14、18、28、32行目を転記したいです。 +αで条件を追加すると以下のようになります。 ①フォルダ内には100件近くのテキストファイルがあり、全て順番に処理をしていく ②抽出したい行にはタブで数字が5つほど並んでいます。(画像の用な感じです。) ③28、32行目は転記しデータを区切った後、左側2つの数字は削除したいです。(全てのテキストファイルに適用) ④特に空白行は作らず、下に追加していく。(A1から開始) ⑤シートを新しく追加する。 Excelはo365を使用しています。 参考にしたマクロは以下のものです。 初心者の為、すみませんが教えてください。よろしくお願いします。 ******************************************** '指定フォルダの全テキストの任意行を取得 Sub GetAllTextData() 'フォルダ指定用のダイアログを表示します With Application.FileDialog(msoFileDialogFolderPicker) 'カレントディレクトリを指定します .InitialFileName = ThisWorkbook.Path '設定しなかったら終了します If .Show = False Then Exit Sub '設定したフォルダを表示します Dim Fname Fname = .SelectedItems(1) End With '参照設定 Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") Dim FilePath As Variant ReDim FilePath(1 To 100) As Variant '指定フォルダ内の.txtファイルを探索します i = 0 For Each File In FSO.GetFolder(Fname).Files If InStr(File.Name, ".txt") > 0 Then i = i + 1 FilePath(i) = File.Path 'ファイルのフルパスを取得 End If Next '配列の大きさは状況に応じ変更してください Dim Hozon, GetData As Variant ReDim GetData(1 To 100, 1 To 100) As Variant '全テキストファイルの任意行のデータを取得する m = 0 For k = 1 To UBound(FilePath, 1) 'テキストファイルが存在する場合に実行 If IsEmpty(FilePath(k)) = False Then '保存する配列を空にする ReDim Hozon(1 To 100, 1 To 100) As Variant 'テキストを開いて配列にデータを保存 Open FilePath(k) For Input As #1 i = 0 'テキストをすべて取得する Do Until EOF(1) Line Input #1, buf i = i + 1 'コンマ区切りでデータを取得する a = Split(buf, ",") For j = 0 To UBound(a, 1) Hozon(i, j + 1) = a(j) Next Loop Close #1 '▼取得したいデータに応じ変更してください '任意行の値を取得する i = 2 '2行目のデータを取得 m = m + 1 For j = 1 To UBound(Hozon, 2) GetData(m, j) = Hozon(i, j) Next End If Next 'データ貼り付け With ActiveSheet .Range(.Cells(2, 1), .Cells(2, 1).Offset(UBound(GetData, 1) - 1, UBound(GetData, 2) - 1)) = GetData End With End Sub (参考サイト:https://daitaideit.com/vba-get-alltext/)

  • GetOpenFilename(MultiSelect)が配列を返さない

    下記のIf行で配列を返したいのですが、うまくいかずに Stopステートメントで止まってしまいます(デバッグ用です)。 特に、下記コードを記述したブックを非表示にし、 ダイアログ内でファイルの場所を変更した時に 配列を返さないようです。 どなたか解決方法をご存知の方がいらっしゃったら、 よろしくお願いいたします。 なお、WindowsXP Pro. SP2、Excel2003 SP2です。 Dim OpenFileName As Variant OpenFileName = Application.GetOpenFilename _ (FileFilter:="dsc,*.dsc,すべてのファイル,*.*", MultiSelect:=True) If IsArray(OpenFileName) Then ・・・コード・・・ ElseIf OpenFileName <> False Then Stop End If

  • UTF-8のデータを複数開いて編集したい

    皆様のお力をお貸しください 基本がわかってないために所々おかしなところがあるかも知れませんが宜しくお願いします。 UTF-8で書かれたxmlデータをエクセルで開いて編集して保存したいのですがうまくいきません。 Sub test1() Dim xmlFileName As Variant Dim F_Filter As String Dim i As Integer F_Filter = "データ,*.txt" xmlFileName = Application.GetOpenFilename(filefilter:=F_Filter, MultiSelect:=True, Title:="ファイル選択") If IsArray(xmlFileName) Then For i = 1 To UBound(xmlFileName) Workbooks.OpenText Filename:=xmlFileName(i), _ Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier _ :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _ False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _ TrailingMinusNumbers:=True MsgBox xmlFileName(i) ActiveWorkbook.Close Next End If End Sub Origin:=932は Origin:=-535 だと思ってください。(家だとなぜかエラーのため) 一つはこんな感じです。 これだと連続編集できるのですが拡張子がxmlだとスクリプトエラー となってしまうため まず拡張子を手で.txtに変えています。 二つ目は Sub OpenFile() Dim xmlFileName As Variant Dim F_Filter As String Dim NewName As String F_Filter = "データ,*.xml" xmlFileName = Application.GetOpenFilename(filefilter:=F_Filter, MultiSelect:=False, Title:="ファイル選択") If xmlFileName = False Then MsgBox "キャンセルしました" Else NewName = Left(xmlFileName, InStrRev(xmlFileName, ".", -1, vbTextCompare)) & "txt" Name xmlFileName As NewName Workbooks.OpenText Filename:=NewName, _ Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier _ :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _ False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _ TrailingMinusNumbers:=True MsgBox xmlFileName ActiveWorkbook.Close Name NewName As xmlFileName End If End Sub これだと拡張子を変更してくれるのですが連続編集できません。 拡張子を自動で変更しつつ連続編集できないものでしょうか。 というのも自作なのですがすべてつぎはぎでできているためうまくできないのです。どうぞ宜しくお願いします。 あわせて編集したあとUTF-8で保存したいのですがこちらのコード もわかりましたら宜しくお願いします。

  • vba, 複数ブックの同一セルに同一写真を挿入

    エクセルVBAの初心者です。使っているのはExcel2007です。 同じフォルダの中にある連番の複数のエクセルファイルに同じ操作を繰り返すマクロを作っています。まず、複数ブックの同一セルに同じ内容の文字列を挿入することはどこかで見つけました。 Sub 複数Book同一セルに同一文字列入力() Dim fName As Variant Dim i As Long Dim WB As Workbook fName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xlsx", MultiSelect:=True) If IsArray(fName) Then For i = LBound(fName) To UBound(fName) Set WB = Workbooks.Open(fName(i)) WB.Worksheets(1).Range("A1").Value = "テスト" WB.Close SaveChanges:=True Next End If End Sub また、選択したセルに同じフォルダの中にある写真を挿入するマクロもどこかで拝見しました。 Sub AddPictureSampLinkPaste() Dim myFileName As String Dim myShape As Shape myFileName = ActiveWorkbook.Path & "\Koala.jpg" '--(1) 選択位置に画像ファイルを挿入し、変数myShapeに格納 Set myShape = ActiveSheet.Shapes.AddPicture( _ Filename:=myFileName, _ LinkToFile:=True, _ SaveWithDocument:=False, _ Left:=Selection.Left, _ Top:=Selection.Top, _ Width:=0, _ Height:=0) '--(2) 挿入した画像に対して元画像と同じ高さ・幅にする With myShape .ScaleHeight 1, msoTrue '数字は写真の高さの倍数 .ScaleWidth 1, msoTrue '数字は写真の幅の倍数 End With End Sub ここまではテストで問題なかったので、この二つのマクロを一つにまとめて、同じフォルダにある連番のエクセルブックの同一セルに同一写真を挿入するマクロを作ろうと下記のようにアレンジしましたが、なぜか写真はマクロを記入したブックのアクティブセルに連番のブックの数だけの写真が重なるように貼り付けられるだけで、標的のブックには写真が挿入できません。 Sub 複数Bookの同じ位置に同一写真挿入() Dim fName As Variant Dim i As Long Dim WB As Workbook Dim myFileName As String Dim myShape As Shape fName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xlsx", MultiSelect:=True) myFileName = ActiveWorkbook.Path & "\Koala.jpg" If IsArray(fName) Then For i = LBound(fName) To UBound(fName) Set WB = Workbooks.Open(fName(i)) Worksheets("Sheet1").Activate '--(1) 選択位置に画像ファイルを挿入し、変数myShapeに格納 Set myShape = ActiveSheet.Shapes.AddPicture( _ Filename:=myFileName, _ LinkToFile:=True, _ SaveWithDocument:=False, _ Left:=Selection.Left, _ Top:=Selection.Top, _ Width:=0, _ Height:=0) '--(2) 挿入した画像に対して元画像と同じ高さ・幅にする With myShape .ScaleHeight 1, msoTrue .ScaleWidth 1, msoTrue End With WB.Close SaveChanges:=True Next End If End Sub 本当にどこが間違っているか分からず、ここで質問いたします。初心者で分からないところばかりなので、どなたかやさしく教えていただけませんか?よろしくお願いいたします。

  • VBAで、ExcelシートにCSVファイルのデータを取り込みたいのです

    VBAで、ExcelシートにCSVファイルのデータを取り込みたいのですが、 1行目しか取り込めません。 取り込む項目数は32個です。 以下のコードでは、Excelシートの1行目のみ取り込みができますが、 1行目32列目のセルには、2行目のA列に表示されるべきデータも表示されます。 2行目以下は取り込みできていません。 Sub CSV取込() Dim OpenFileName As String Dim MyString As String Dim MyVar As Variant Dim i As Long, j As Long OpenFileName = Application.GetOpenFilename("CSVファイル,*.csv") If OpenFileName = "False" Then MsgBox "キャンセルされました。" Else Open OpenFileName For Input Access Read As #1 i = 1 While Not EOF(1) Line Input #1, MyString MyVar = Split(MyString, ",") If MyVar(0) <> "" Then For j = 0 To 31 ThisWorkbook.ActiveSheet.Cells(i + 10, j + 1) = MyVar(j) Next j i = i + 1 End If Wend Close #1 End If End Sub おそらく、改行が判別できないためかと思いますが、 どこが間違っているのかがわかりません。 アドバイスをよろしくお願いします。

  • MATLABのデータ抽出についておたずねしたいことがあります。

    MATLABのデータ抽出についておたずねしたいことがあります。 MATLAB初心者ですが、以下のようなプログラムを現在書いています。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); time=(0:0.002:2.046); t=reshape(time,1024,1); current=m(:,1)*1000; voltage=m(:,2)*10; m2=[t current voltage]; a=m2(1,2); b=m2(2:40,2); if a>max(b); g=a; end for I=2:1024; for J=1:1024; for K=39+I; if K>1024; K=1024; end c=m2(I,2); d=m2(J:I-1,2); e=m2(I+1:K,2); if c>max(e)&&c>max(d); g=c; else end end end end plotyy(t,current,t,voltage) ylim([0,700]) ifの条件を満たしたときに、m2の2列目の値だけでなく条件を満たしたその行の3列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

専門家に質問してみよう