マクロでファイル名を検索しPDFを開く方法

このQ&Aのポイント
  • マクロを使用して、ファイル名を含むPDFファイルを検索し、ファイルが存在すれば開く方法について質問です。
  • 現在のマクロでは、部分一致でファイルを開けるようにするために「*」を使用していますが、エラーが出てしまっています。
  • また、検索対象のPDFファイルにスペースが含まれている場合も、問題なく開ける方法が知りたいです。
回答を見る
  • ベストアンサー

マクロでファイル名(を含む)を検索しPDFを開く

マクロでファイル名(セルの値)を含むPDFファイルを検索し、ファイルが存在していればそのファイルを開きたいのですがうまく行きません。 Sub を含むPDFファイルを開く() Dim keyword As Variant Dim myPath As Variant Dim fName Dim pname Set my = ActiveSheet keyword = my.Range("D2").Value '検索する値 myPath = my.Range("F1").Value  'フォルダパス fName = Dir(myPath & "*" & keyword & "*" & ".pdf") pName = (myPath & "*" & keyword & "*" & ".pdf")  '"*" & keyword & "*"が良くないのだと思います。 If fName = "" Then MsgBox ("該当するファイルが存在しません。") Exit Sub End If With CreateObject("Wscript.Shell")  .Run pname, 5  'ここでエラーが出ます。 End With End SUB 'pname内の"*" & keyword & "*"をkeywordのみにすると完全一致のファイルは開けるのですが部分一致で開きたいため”*”を使用したところエラーが出てしまいます。 また、検索するPDFファイルにスペースが含まれていても開けるようにしたいのです。 どうかご指導のほうをよろしくお願いします。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

試してみましたが、Wscript.ShellのRunコマンドにワイルドカードは使用出来ない様です。お望みの事を実現するには、Dirのループを回すしかないかと思います。ご参考まで。 Sub test() Dim keyword As String Dim myPath As String Dim fName As String Dim pname As String Dim my As Worksheet Dim wsh As Object Set my = ActiveSheet keyword = my.Range("D2").Value '検索する値 myPath = my.Range("F1").Value 'フォルダパス Set wsh = CreateObject("Wscript.Shell") pname = (myPath & "*" & keyword & "*" & ".pdf") fName = Dir(pname) If fName = "" Then MsgBox ("該当するファイルが存在しません。") Exit Sub End If Do Until fName = "" 'Runコマンドにワイルドカードは使えないと思う-試行結果より→ループを回してヒットする物を取得する必要あり 'スペースの入ったパス対策としては""""で囲う必要あり wsh.Run """" & myPath & fName & """", 5 fName = Dir() Loop Dir "" 'ファイルロック解放 Set wsh = Nothing End Sub

nex490
質問者

お礼

早速、試してみたところ、自分がやりたいことが出来ました。まだまだ初心者なので調べながらやっていますが、なかなかうまくいかないことが多く困っていたので本当に助かりました。 ありがとうございました!!

関連するQ&A

  • ファイル名を合成すると検索できないのでしょうか?

    下記のような式がありまして、一度作成したファイルは上書きされないはずですが何回やっても上書きされてしまいます。 これはファイルを検索していないのでしょうか? 既にファイルがあったら終了するはずですが何か間違えていますか? 'ファイル作成 Sub MakeCopyFile(newfile As String, orgfile As String) If SearchFile(newfile) Then Exit Sub End If Set fs = CreateObject("Scripting.FileSystemObject") fs.CopyFile orgfile, newfile End Sub ' ファイル検索 Function SearchFile(fname As String) As Boolean SearchFile = False Set fs = Application.FileSearch With fs .Filename = fname If .Execute() > 0 Then SearchFile = True End If End With End Function Sub Macro1() Dim name As String '名前 Dim fname As String 'ファイル名 Dim directory As String '作成先ディレクトリ Dim fullpath As String 'フルパス Dim orgfile As String '雛形のファイル名 Dim editbook As Workbook '個人データブック Dim id As String '番号 directory = "H:\test\" orgfile = "H:\test\雛形.xls" For i = 1 To 100 name = ThisWorkbook.Worksheets("Sheet2").Cells(i, 10).Value id = ThisWorkbook.Worksheets("Sheet2").Cells(i, 12).Value If name = "" Then Exit For End If 'コピーしたファイルを作成する fname = name + id + ".xls" 'ファイル名合成 fullpath = directory + fname 'フルパス合成 Call MakeCopyFile(fullpath, orgfile) 'ファイル作成 Workbooks.Open Filename:=fullpath Set editbook = Workbooks(fname) editbook.Worksheets("Sheet3").Cells(8, 14).Value = name editbook.Worksheets("Sheet3").Cells(8, 10).Value = id '※(その他必要な処理があれば追加してください) editbook.Close (True) Next i End Sub

  • エクセルのマクロで特定フォルダ内のJPGファイルを検索して開きたいので

    エクセルのマクロで特定フォルダ内のJPGファイルを検索して開きたいのですが、うまくいきません。 検索して開くファイルは、アクティブセルの値で始まります。 (例えばアクティブセルが「0000」だとすると、フォルダ内にある「0000りんご.JPG」というファイルを開く。りんごの部分は特定の文字でないためワイルドカードを使用してみましたがうまくいきません) Sub test() Dim P As String Dim Fname As String Fname = ActiveCell.Value P = "パス名\" & Fname & "*.JPG" Shell "Rundll32.exe" & " Shimgvw.dll,ImageView_Fullscreen" & " " & P, vbNormalFocus End Sub どうぞよろしくお願い致します。

  • 複数ファイルのA1だけを抽出して別ファイルにしたい

    すみませんが、教えてください。 特定のフォルダ内に入っているcsvのA1列目のみ抽出して別ファイルにしたく、検索したところ 同じように困っていた方がいたようで、参考にさせていただいたのですが、 以下を実行しても インデックスが有効範囲にありませんと出ます。 各csvファイルのシート名は 1000近くあるファイル全て違い、別々の名前(コード00-000とか)になっています。 (エクセルで開いたとき) お手数ですが、教えていただきたくお願いいたします。 参考にしたマクロです。 Sub macro1() Dim myPath As String Dim myFile As String myPath = "ファイルの場所\" myFile = Dir(myPath & "*.xls") Do Until myFile = "" Workbooks.Open myPath & myFile With Workbooks("集約.xls").Worksheets("Sheet1").Range("A65536").End(xlUp) .Offset(1, 0).Value = myFile .Offset(1, 1).Value = Workbooks(myFile).Worksheets("概要").Range("C3").Value End With Workbooks(myFile).Close savechanges:=False myFile = Dir() Loop End Sub 宜しくお願いいたします。

  • マクロで悩んでます。どうかご教授お願いします。

    こんにちは 行き詰ってます。どうかご教授お願いします。 エクセルのTEXT BOXに検索するJPEGを入力して、表示させるマクロを作ってます。 一応動作するのですが、完全に一致しなくても拾ってしまいます。 どうしたらよいのでしょうか、このあとこのエクセルのシートをメニューみたいにWindows のデスクトップ画面右下に表示しておきたいです。素人知恵で申し訳ありませんが、 よろしくお願いします。現段階はここまでです。 Sub OpenPictures() Dim 検索値 As Variant Dim BaseName As String Dim Fname As String Dim P As String Const CMD As String = "C:\WINDOWS\System32\shimgvw.dll,ImageView_Fullscreen" Const PathName As String = "C:\Documents and Settings\T.K.S.K\デスクトップ\gomicon\" 検索値 = TextBox1.Value BaseName = TextBox1.Value If BaseName = "" Then Beep: Exit Sub Fname = PathName & BaseName & "*.jpg" P = Dir(Fname) If P <> "" Then Fname = PathName & P Shell "Rundll32.exe " & CMD & " " & Fname, vbNormalFocus On Error GoTo 見つからない場合 Else 見つからない場合: MsgBox 検索値 & "は見つかりません。" End If End Sub

  • マクロ FIND 検索方向の変更

    いつも回答ありがとうございます。 FINDを使用した検索方向の変更についての質問です。以下のFINDの記述方法で、上から一発目に捉えられたキーワードではなく、下から一発目に捉えられたキーワードに変更するにはどうしたらよろしいでしょうか?それとも、FINDの記述方法を大幅に変えなければいけないのでしょうか?御指導の程宜しくお願い致します。 Sub TEST() Dim d As Integer Dim e As Integer Worksheets("一覧").Activate d = 3 e = 3 Do While Worksheets("一覧").Cells(d, 2).Value <> "" Dim c As Variant Dim R As Range Dim s As Range With Worksheets(Worksheets("一覧").Cells(d, 2).Value) Set c = .Columns("H").Find("増", , xlValues, 1) If Not c Is Nothing Then Set R = .Range(c.Offset(1, -4), .Cells(Rows.Count, "D").End(xlUp)) Set s = c.Offset(, -5) With Worksheets("編集用一覧") .Range(.Cells(e, 4), .Cells(e, 5)).ClearContents .Cells(e, 4).Value = s .Cells(e, 5).Value = Application.Sum(R) End With End If End With d = d + 1 e = e + 4 Loop End Sub

  • pdf印刷時に登録ファイル名の確認を無効化したい

    excel2010 TESTフォルダ内にある。全てのexcelフィルをcutepdfwriterでpdfファイル化しようとしています。 マクロ Sub test() Application.DisplayAlerts = False Dim Fol As String Dim Fname As String Dim Ws As Worksheet Fol = "C:\test" Fname = Dir(Fol & "\*.xlsm") Do While Fname <> "" If Fname <> ThisWorkbook.Name Then Workbooks.Open Fol & "\" & Fname For Each Ws In Worksheets Ws.PrintOut Next Workbooks(Fname).Close SaveChanges:=False End If Fname = Dir() Loop End Sub で実施するとファイルを開いてpdfファイルを作成可能なのですが、 各々のファイルに対して、名前をつけて保存 ファイル名.pdf と聞いてきます。 その都度、保存というボタンをクリックする必要があり、 大量のファイル実施時、手間です。 なお、cutepdfwriterを通常使うプリンタに設定しています。 この保存というボタンをクリックしないで、ファイル名をそのままでpdfファイル化する方法は、 ありますでしょうか?

  • エクセル、マクロの事で・・・?(2)

    昨日、質問した者です。 http://okwave.jp/qa/q7374907.html 以下のマクロを教えてもらいました。 昨日の質問では、エクセルのA列にフォルダ名、B列にファイル名、それぞれフォルダとtxtを出力するマクロを教えてもらいました。 そこでもう一つ質問があるのですが、C列の内容をテキストに出力する場合はどうすればいいのでしょうか? 度々の質問で申し訳ありませんが、教えていただけないでしょうか? よろしくお願いします。 sub macro1()  dim myPath as string  dim h as range  on error resume next  mypath = thisworkbook.path  worksheets(1).select  for each h in range("A1:A" & range("A65536").end(xlup).row)   mkdir mypath & "\" & h.value   open mypath & "\" & h.value & "\" & h.offset(0, 1).value & ".txt" for output as #1   close #1  next end sub

  • excel マクロ PDF化の際のエラーについて

    エクセルブックを一括で名前をつけてpdfに変換するようなマクロを作ろうとして作ってみました。 基本は、マクロで印刷を一気に行う要領でpdfをアクティブプリンタに設定したのですが、見かけ上pdfファイルが作成されるものの、開くと破損していますとなってしまい、きちんとpdf化が出来ていないようです。 システムフォントを利用~のエラーは回避できたのですが、無理やりファイル名を指定しているせいでこのようになっているのでしょうか。 お手数ですがアドバイスをお願いします。 マクロの記録ではアクティブプリンタを指定して、プリントアウトというものしか記録されないので、プリントアウトのところが何か間違っているとは思うのですが・・・ 以下コードです。 Sub PrtPDF() Dim MyFile As String, MyPath As String Dim wb As Object Dim fn As String If vbNo = MsgBox("フォルダ内のブックの一括印刷を行いますか?", vbYesNo) Then GoTo CloseFile Dim bookname1 As String bookname1 = "Conv.xls" MyPath = ThisWorkbook.Path & "\" '自分のパスを取得 MyFile = Dir(MyPath & "*.xls", vbNormal) 'パス内のxlsファイル If LCase(MyFile) = LCase(bookname1) Then MyFile = Dir 'MyFileとbookname1が同じファイルの場合スキップする Do Until MyFile = "" '対象ファイルがなくなるまで Set wb = Workbooks.Open(MyPath & "\" & MyFile) '選択したファイルを開く fn = MyPath & "PDF\" & Range("J4").Value & ".pdf" 'アクティブシートを印刷する。 Application.ActivePrinter = "Adobe PDF on Ne07:" ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, PrtoFileName:=fn 'アクティブブックを閉じる。 ActiveWorkbook.Close MyFile = Dir '次のファイルを検索 If LCase(MyFile) = LCase(bookname1) Then MyFile = Dir 'MyFileとbookname1が同じファイルの場合スキップする Set wb = Nothing Loop '繰り返し GoTo ProcessEnd CloseFile: ActiveWorkbook.Close MsgBox "処理を中止しました。" Exit Sub ProcessEnd: MsgBox "処理が終了しました" End Sub

  • 他ファイルを参照するマクロ

    excel2010 check.xlsmというファイルにマクロが存在します。 このファイルは、c:\workフォルダに登録されている***A2***.xlsmというファイルからデータを抽出するマクロになっています。 ***A2***.xlsmの***は、ファイル名の中にA2という文字があり、 色々とファイル名が変化するということを意味しています。 ***A2***.xlsmのファイルにはチェックボックスがあり、名前を付けています。 _ch227173520_0002 が一例です。 check.xlsmのファイルで、いろんなファイルのチェックボックス状態を収集するマクロが 下記です。 Dim mypath As String Dim myFile As String '検索フォルダ mypath = "C:\work\" '検索ファイル名 myFile = Dir(mypath & "*A2*.xlsm") 'F列に抽出した結果を記載 Workbooks.Open mypath & myFile With Workbooks("check.xlsm").Worksheets("Sheet1").Range("F65536").End(xlUp) .Offset(0, 0).Value = myFile 'ファイル名 .Offset(63, 0).Value = Range("_ch227173520_0002").Value End With Workbooks(myFile).Close savechanges:=False このマクロでcheck.xlsmファイルのF64セルに、 100A2001.xlsmファイルのチェックボックス_ch227173520_0002の内容を抽出しています。 しかしながら、***A2***.xlsmファイルに仕様変更があり、チェックボックスの名前が変わってしまいました。 _ch227173520_0002 → _ch3131000 の様にです。 これだと、データを参照できないので実行エラーが出てしまいます。 なので、 .Offset(63, 0).Value = Range("_ch227173520_0002").Value → .Offset(63, 0).Value = Range("_ch3131000").Value とマクロを修正すれば、データは参照可能になりますが、 どのA2ファイルがどちらのチェックボックスなのかは、分かりません。 エラーが出たらcheck.xlsmのファイルを変えてやり直すというのは不便です。 チェックボックスの名前がどちらであっても .Offset(63, 0).Valueにデータを持ってくる様にしたいのですが、 どの様にしたらよいでしょうか? マクロ初心者です。 学習マクロくらいしかできないので、ベタで教えていただきたく、 よろしくお願いします。

  • エクセル マクロ 検索

    お世話になります。 範囲がA2からK221までの表があります。 検索して検索されたセルの左のセルを表示するマクロを組みたいのですが、検索する文字(数値)はE1に、検索結果はK1に表示するようにするにはどのようにしたらいいでしょうか? Sub FIND_DATA1() ' FIND_DATA1 Macro ' マクロ記録日 : 2006/9/1 ユーザー名 : ' Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole).Activate End Sub Sub Data_Find3() Dim 対象セル As Range Dim 最初のセル番地 As String Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub End If Set 対象セル = Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole) 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Cells.FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 MsgBox "検索件数は" & 検索件数 - 1 & " 件です" End Sub 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。

専門家に質問してみよう