• ベストアンサー

FileSearchが使えなくなり困ってます(2回目)

 QNo.5523274の者です。まだ出来ず、悩んでます。 選択したセル値がファイル名(拡張子抜き)を指定の保存先から検索して呼び出したいのですが、該当なしまでは表示されるのですが、見つかった場合のファイルが開きません。 どこをなおしたらよいかアドバイスいただけないでしょうか。 どうか回答をお願い致します。 '指定したセルを検索する。 Dim p As Range, mypath As String For Each p In Selection 'データがなければ抜ける。 If p = "" Then Exit Sub End If '選択したセルが存在するか確認後、ファイルを開く。 mypath = "C:\保存先\" If Dir(mypath & p) <> "" Then If MsgBox("開きますか", vbYesNo) = vbNo Then Exit Sub Set book = Workbooks.Open(mypath & p) Else MsgBox ("検索結果:該当なし") End If Next p End Sub 素人ゆえ、上記文章手直ししていただけると大変助かります。

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.6

>元の値に“.xls”が付く形になりましたが、元の値はそのままにしておきたい 前回の修正を元に戻してください そして、下記の2行を修正してください >If Dir(mypath & p) <> "" Then If Dir(mypath & p & ".xls*") <> "" ThenI >Set book = Workbooks.Open(mypath & p) Set book = Workbooks.Open(mypath & Dir(mypath & p & ".xls*")) >“.xlsm”も“.xls”と混ざって保存されてる場合にどっちの拡張子も開くには 例えば、test.xlsmとtest.xlsの両方が存在する場合があるの? 有る場合はどちらを開くのでしょうか? それとも、両方開くのでしょうか? 上記の修正では.xlsを優先して開きます 他の方の回答を参考にされるなら、無視してください

h_hi1975
質問者

お礼

hige_082さん 早々の回答ありがとうございます。 両方の存在はありません、優先して開くとのことで理解ができました。 またも自分の質問が素人過ぎる内容と実感いたしました。 おかげさまで解決できそうです。 年末時お忙しいところ、目にとめていただきありがとうございました。 本当にどうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.5

勝手に仕様を脳内作成。 1. セルに記述されているファイル名が特定の場所に実在すれば開く。 2. ファイル名を記述できるセルは複数個所あるので、複数セルを選択した状態でマクロを実行した場合、ヒットした複数のファイルを開く。 3. 開く対象のファイルは Excel のファイルである。 4. セルに記述するファイル名には拡張子を含めない。 5. 拡張子は ".xls" である。 6. サブフォルダーを含めない。 Const baseDir = "d:\保存先" Const extension = ".xls" Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim targetFilePath As String Dim p As Range For Each p In Selection targetFilePath = fso.BuildPath(baseDir, p.Value) & extension If fso.FileExists(targetFilePath) Then Workbooks.Open targetFilePath End If Next 仕様 4 を変更。 4. セルに記述するファイル名には拡張子を含める。 5. 仕様削除 Const baseDir = "d:\保存先" Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim targetFilePath As String Dim p As Range For Each p In Selection targetFilePath = fso.BuildPath(baseDir, p.Value) If fso.FileExists(targetFilePath) Then Workbooks.Open targetFilePath End If Next さらに仕様変更 3. 開く対象のファイルは Excels に限らず、Word や PDF など、Windows に登録されている種類のファイルである。 4. セルに記述するファイル名には拡張子を含める。 5. 仕様削除 Const baseDir = "d:\保存先" Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim wshell As Object Set wshell = CreateObject("WScript.Shell") Dim targetFilePath As String Dim p As Range For Each p In Selection targetFilePath = fso.BuildPath(baseDir, p.Value) If fso.FileExists(targetFilePath) Then wshell.Run targetFilePath End If Next

h_hi1975
質問者

お礼

temtecomai2さん 回答ありがとうございます。 お目にとめていただきありがとうございました。 おかげさまで解決できそうです。 アドバイスの仕方もとても分かりやすく、私も質問するときにはこのようにするべきと勉強になりました。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 少し、あせっていらっしゃったようですね。状況は良く理解できましたので、もう、前任者さんのコードは完全に改めてしまってもよいでしょう。 もともと、コードの仕様自体が明確なので、思ったとおりに戻せます。 ただ、こちらは、もともとはVBカテゴリですから、場合によっては、Office カテゴリのほうがレスが多いかもしれません。もちろん、私も時間が取れれば、どちらでもレスはつけます。 >選択したセル値がpの場合を開くにはどこに付け加えればよろしいでしょうか? ※の変更部分をみてください。 セルでファイルを選択する場合は、データ--入力規則--リスト などで選択させてもよいのですが、 コントロールツールの、コンボボックスで選択させると、CommandButton の必要がありません。 >拡張子“xlsm”も同じファイル先に保存された場合 そのまま、"Test1.xlsm" とセルに入れればよいです。 なお、 'Application.DefaultFilePath & "\" これは、オプションで、通常ブックを入れてあるフォルダのことを意味しています。 '------------------------------------------- Sub TestMacro()   Dim myPath As String   Dim p As Variant   myPath = "C:\保存先\" 'Application.DefaultFilePath & "\"   p = Worksheets("Sheet1").Range("A1").Value '※ 変更部分   If Dir(myPath & p) <> "" Then     Workbooks.Open mypath & p   Else     MsgBox myPath & p & "は見つかりません。"   End If End Sub

h_hi1975
質問者

お礼

Wendy02さん  早々の回答ありがとうございます。 質問以外のことでも丁寧に教えていただき感謝致します。 今後お世話になるときに役立てたいと思います。 年末時お忙しいところ、目にとめていただきありがとうございました。 おかげさまで解決できそうです。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

表題の >FileSearchが使えなくなり困ってます と在りますが、FileSearchは http://officetanaka.net/excel/vba/tips/tips36.htm のようなのを連想しました。しかし質問のコードには> Application.FileSearchなどは出てきていません。表題が適当でないのでは。術語であるものを、内容的に似ていることに使うことは慎重にすべきと思います。「ファイルがフォルダ内にあるかさがす」などとすべきです。 ーー ファイルをファルダ内から探すコードは (1)Dir (2)FSO(For Each In ObjFolder.Files法とFileSearch法の2方法) の2つの方法があり、 また (1)セルの値をずらしてその値でファイルを探すループと (2)Dirでファイルを探すループと 2つあるわけで(質問の場合は(1)が外側ループか?と思う) 2つは入れ子の関係にすれば良いと思う。 ーーー Googleででも「フォルダ内 ファイル VBA」で照会すれば、沢山記事やコードがある。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html以下多数。 情報はあふれていて、ほとんど、ここに質問を繰り返す課題では無い状態と思う。

h_hi1975
質問者

お礼

早々の回答ありがとうございました。 表題・文面の誤りで分かりにくい質問になりましたこと大変失礼致しました。 指摘していただいたとおりです。 imogasiさんだけでなく他の方でも不快に思われた方きっとたくさんいらっしゃいますね?お詫び申し上げます。 そして親切な説明大変感謝致します。 ただし、インターネットでの照会は沢山記事は確認しておりまして、紹介していただいたサイトもすでにどちらもみておりますが、それでも解決できなかったので、今回このサイトの相談箱を使用させていただきました。 申し訳ございません。 「出来る大辞典 ExcelVBA」の本もみて、手直ししてるのですが、うまくいきません。 理解がどうしても出来ず、自分で直すことができないので良い方法があれば手直ししていただくと大変助かります。 よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 前回の質問にも回答をつけておきました。 >For Each p In Selection 基本的に、これは何ですか? Selection というと、ファイル名をユーザー選択させるのですか? Loop というのも良く分かりません。複数選択して開くのですか? それなら、 Set book = Workbooks.Open(mypath & p) これは、オブジェクトを確保するのは無駄でしょうね。 Workbooks.Open mypath & p だけでよいです。 複数選択なら、このメッセージも不要です。 MsgBox ("検索結果:該当なし") しかし、元のコードで開けられないということではありません。 もっと基本的なコードから広げていくべきだと思います。いきなり、ループでは分からないです。 まず、以下のような基本コードで開けるのか、ということです。 ------------------------------------------- Sub TestMacro()   Dim mypath As String   Dim p As Variant   mypath = "C:\保存先\" 'Application.DefaultFilePath & "\"   p = "Test1.xls"   If Dir(mypath & p) <> "" Then     Workbooks.Open mypath & p   Else     MsgBox mypath & p & "は見つかりません。"   End If End Sub

h_hi1975
質問者

補足

Wendy02さん 度々の回答ありがとうございました。 素人でとんちんかんな質問ばかりしてしまい申し訳ございません、 回答大変感謝致します。 >For Each p In Selection 基本的に、これは何ですか? Selection というと、ファイル名をユーザー選択させるのですか? Loop というのも良く分かりません。複数選択して開くのですか? ↑ですが、何かと聞かれると?・・・申し訳ございませんまったく理解できておりません。自らコード作成が困難にな為なるべく前任者の方のを引用したものです。不要でしたか? >複数選択して開くのですか? ↑複数選択は致しません。セルを選択したら毎度実行致します。 基本コードをコピーさせていただいたところ、 指定の保存先にいれた“Test1.xls”の保存名のものを開くことが出来ました。 選択したセル値がpの場合を開くにはどこに付け加えればよろしいでしょうか? それと、拡張子“xlsm”も同じファイル先に保存された場合も開くことは可能でしょうか? すがるような質問ばかりで申し訳ございません。 よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

'データがなければ抜ける。 If p = "" Then Exit Sub else p = p & ".xls" End If これでうまく行きませんか?

h_hi1975
質問者

補足

hige_082さん 度々のアドバイスありがとうございます。 開けました(泣)! もう2点質問させてください。 アドバイスいただいた形ですと元の値に“.xls”が付く形になりましたが、元の値はそのままにしておきたい場合はどのようにすればよろしいでしょうか? それと、“.xlsm”も“.xls”と混ざって保存されてる場合にどっちの拡張子も開くにはどのようにすればよろしいでしょうか? 質問ばかりで申し訳ございません。 どうぞよろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAで新たな保存先のパスの取得方法は?

    エクセルVBAで新たに一度に作成する複数のブックを保存するフォルダーをあらかじめ指定したいのですが、下記のような方法しか思い浮かびません。 もっとスマートなやり方はないでしょうか?(直接入力以外の方法で) Sub Path_Get() Dim myPath As String, damy As Variant MsgBox "作成するファイルの保存先を選択します。" _ & vbCr & "なお、表示されたファイル名は気にしないで" _ & vbCr & "下さい。(笑)" damy = Application.GetSaveAsFilename(fileFilter:="Excel (*.xls),*.xls") MsgBox damy If damy = False Then Exit Sub For i = Len(damy) To 0 Step -1 If Mid(damy, i, 1) = "\" Then myPath = Mid(damy, 1, i) Exit For End If Next i MsgBox "パスは " & myPath & "です。" End Sub

  • フォームを閉じないようにする VB6 SP6

    VB6 でプログラムを作成中です。 プログラムを実行して、フォームが立ち上がった所で右上の×を押し、画面を閉じようとします。 そこで以下のコードで、もし×が押されたらvbYesNoメッセージボックスを表示させ、もし「いいえ」が押されたらフォームを閉じないようにし、実行画面を維持したいのです。 しかし、Exit Sub ですとプログラムが終了してしまい、困っています。宜しくお願い致します。 Private Sub Form_Unload(Cancel As Integer) 'フォームを閉じる Dim last As String last = MsgBox(" プログラムを終了させますか?", vbYesNo, "終了確認1") If (last = vbYes) Then Dim last2 As String last2 = MsgBox(" 本当にプログラムを終了させますか?", vbYesNo, "終了確認2") If (last2 = vbNo) Then Exit Sub End If End If If (last = vbNo) Then Exit Sub End If End Sub

  • マクロでファイル名(を含む)を検索し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ファイルにスペースが含まれていても開けるようにしたいのです。 どうかご指導のほうをよろしくお願いします。

  • FileSearchが使えなくなり困ってます。

    仕事場で前任者が下記のようなマクロを組んでいたのですが、「FileSearch」が使用できなくなり、なおさなくてはいけなくて困ってます。 指定の保存先から、アクティブセルと同じ保存名のファイル(エクセル)を開く内容なのですが、お分かりになるかた知恵を拝借願いますでしょうか? 素人なので、できれば専門用語じゃない回答をいただけるとありがたいです。 よろしくお願い致します。 Dim p As Range For Each p In Selection If p = "" Then Exit Sub End If With Application.FileSearch .Filename = p .LookIn = "保存先" .SearchSubFolders = True .LastModified = msoLastModifiedAnyTime .FileType = msoFileTypeExcelWorkbooks .SearchSubFolders = xt .Execute For Each f In .FoundFiles Workbooks.Open f Next f End With Next p End Sub

  • エクセルでフォルダまたはファイルを開くマクロですが、どのように改良すれ

    エクセルでフォルダまたはファイルを開くマクロですが、どのように改良すればよろしいでしょうか? 下記マクロは、エクセルシートのJ列のあるセルをダブルクリックすると、そのセルに記入された文字列を検索して、該当のフォルダまたは、写真が開きます。(エクセルファイルと写真は同フォルダに保存している場合のみ有効) 困っていることは、J列のセルと該当フォルダまたは、写真ファイルをリンクさせたいのですが、文字列が全て一致している時のみしか開かないことです。 D<デジカメ<商品名フォルダ<写真ファイル 例えば セルJ3の文字列がABCEで、フォルダ名またはファイル名がABCDEFであった場合、文字列ABCEを含む条件で、フォルダ名またはファイル名ABCDEFを開くように改良したいのですが、 また、エクセルファイルと写真ファイルの保存場所は、全く違うフォルダにしたいのですが、 エクセルファイルと写真ファイルは、別フォルダの場合、どのように検索先フォルダのパスを入れたら良いのでしょうか? マクロに詳しい方ご教授下さい。よろしくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myPath As String If Target.Cells(1, 1).Column <> 10 Then Exit Sub Cancel = True myPath = ThisWorkbook.Path & "\" & Target.Cells(1, 1).Text If Dir(myPath, vbDirectory) <> "" Then Shell "explorer.exe /e,/root," & myPath, vbNormalFocus Exit Sub End If myPath = Replace(LCase(myPath), ".jpg", "\" & Target.Cells(1, 1).Text) If Dir(myPath, vbNormal) <> "" Then Shell "rundll32.exe shimgvw.dll,ImageView_Fullscreen " & myPath, vbNormalFocus End If End Sub

  • :【Excel VBA】 Do Until ~ Loop 構文で途中の空白セルを飛ばしてデータのチェックをしたい

    こんにちは。 Do Until ~ Loop 構文で 空白セルまでループして重複する値をチェックしたいと考えています。 --------------------------------------------- Sub 重複チェック() Dim 検索語 As String Dim 該当数 As Long Dim 確認 As Integer Range("A4").Activate Do Until ActiveCell.Value = "" 検索語 = ActiveCell.Value 該当数 = WorksheetFunction.CountIf(Range("A:A"), 検索語) If 該当数 >= 2 Then ActiveCell.AutoFilter Field:=1, Criteria1:=検索語 確認 = MsgBox("次を検索しますか?", vbYesNo) If 確認 = vbNo Then Exit Sub End If ActiveCell.Offset(1, 0).Activate Loop Range("A4").AutoFilter MsgBox "名前の重複チェックが終了しました。" End Sub --------------------------------------------- ただセルA列には行の途中、空白も含まれているため、 途中で止まってしまいます。 今後A列にはデータが追加されていきます。 途中の空白セルを飛ばして、 データーの最後までチェックするにはどのようにすればよいでしょうか?

  • Accessフォームの作成

    Accessで作成されているシステムの ファイル取り込みフォームにある実行ボタンを押下すると、 下記のメッセージが表示されます。 「select case に対応する case がみつからない。」 どこかで指定しないといけないのでしょうか? Private Sub Cmd実行_Click() On Error GoTo Err Dim StrSql As String Dim IntNDCnt As Integer Dim IntNTCnt As Integer '確認メッセージの出力 If MsgBox("処理を開始します。よろしいですか?", vbInformation + vbYesNo, "データ取込処理") = vbNo Then Exit Sub End If '対象データ別の処理実行 Select Case Me.Cmb対象.ListIndex Case -1 'エラー MsgBox "読込むデータを指定してください", vbCritical, "データ取込処理" Exit Sub Case 0 '全データ If F_手数料明細読込() = False Then Exit Sub End If If F_奨励金読込() = False Then Exit Sub End If If F_減額読込() = False Then Exit Sub End If If F_預り金読込() = False Then Exit Sub End If Case 1 '手数料データ If F_手数料明細読込() = False Then Exit Sub End If Case 2 '奨励金データ If F_奨励金読込() = False Then Exit Sub End If Case 3 '減額データ If F_減額読込() = False Then Exit Sub Case 4 '預り金データ If F_預り金読込() = False Then Exit Sub End If End Select 今は、Case 4が黄色に反転します。

  • FileSearchがエクセル2007で使えなくなって困っています。

    2003では普通に使えたのですが、2007で使うためにはどのように変えればいいのでしょうか?途方にくれているのでVBAに詳しい方ご教授ください。処理文で回答頂けるとうれしいです。 Public Sub p_更新() For i = 1 To 100: gwKillFL(i) = "": Next i With Application.FileSearch .LookIn = gAAFLD .SearchSubFolders = True .Filename = "*T" & Format(gBB, "00") & ".txt" .FileType = msoFileTypeAllFiles If .Execute(SortBy:=msoSortByFileName, _ SortOrder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count gwKillFL(i) = .FoundFiles(i) Call p_ReadData(.FoundFiles(i)) Next i For i = 1 To .FoundFiles.Count If gwKillFL(i) <> "" Then Kill gwKillFL(i) End If Next i If gMenu1 > 0 Then Range("A2").Select MsgBox "更新", vbOKOnly, "確認" End If Else If gMenu1 > 0 Then MsgBox "更新ファイルなし。", vbOKOnly, "確認" End If End If End With End Sub

  • 変数を保持して呼び出す方法

    変数を保持する方法 2022/02/10 15:36 変数が受け継がれない 2022/02/10 15:24 sub A(),subB()と複数のプロシージャをModule1に配置。 Sub Aでターゲットファイル(T_File)を指定して Sub Bで同じT_Fileを呼び出そうとしたのですが Subの前に配列は宣言しているのでPrivateのハズなのに 変数が受け継がれません T_Fileが”””となります。 多分、Sub A()が終了した時点で一度マクロが終了して 新たにSub B()を呼び出すので上手く変数が受け継がれないのだと思います。 何処かのシートのセルに変数を保持して呼び出す方法が考えられますが そのほかに変数を保持する方法は有りませんか? (できればシートのセルに保持しない方法があれば教えて下さい。) 以下コード(コードが長いので必要と思われる所だけを記載しています。) ’------------------------------------ Option Explicit Dim dlg As FileDialog Dim T_File As String Sub A() Set dlg = Application.FileDialog(msoFileDialogFilePicker) If dlg.Show = False Then MsgBox "処理はキャンセルされました。" Exit Sub Else End If '指定テキストファイル読み込み T_File = dlg.SelectedItems(1) '(途中のコード省略) If rc = vbNo Then MsgBox "処理を中止します。", vbCritical Exit Sub Else MsgBox "処理が終了しました。", vbInformation End If End Sub Sub B() ’T_File = dlg.SelectedItems(1) Folder_Name = CreateObject("Scripting.FileSystemObject").GetParentFolderName(T_File) End Sub

  • Excel VBAで検索(Win2000 Excel2000)

    現在、下記のようなコードを書いています。データテーブルの縦と横の検索値を探してその列数と行数を返したいのですが、下記の Sub検索1 と Sub検索2 を1つのSubで実行させるにはどうしたらよいのでしょうか?よろしくお願い致します。 ----------------------------------------- Sub 検索1() Worksheets("Data").Activate Dim x As Integer For x = 3 To 22 If Cells(2, x).Value >= 12 Then MsgBox x Exit Sub End If Next MsgBox "見つかりません" End Sub --------------------------------------------- Sub 検索2() Worksheets("Data").Activate Dim i As Integer For i = 4 To 42 If Cells(i, 2).Value = "A" Then MsgBox i Exit Sub End If Next MsgBox "見つかりません" End Sub