• ベストアンサー

Excel2003 マクロ(VBA) どこにあるか分からないフォルダAのワークブックAを開く

いつもお世話になっております。 新しいマクロの記録でフォルダAのワークブックAを開きました。 ChDir "C:\フォルダA" Workbooks.Open Filename:= _ "C:\フォルダA\ワークシートA.xls" しかし、今はフォルダAがCドライブにありますが、 明日はデスクトップ上にあったり、フォルダBの中に入っていたりするかもしれません。 このような時、上記のようなVBAでは開けません。 どこにあるか分からないフォルダAのワークブックAを開くには どこをどのように直せばよろしいのでしょうか? 以上、よろしくお願いいたします。

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

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

こんばんは。 以下は、当たり前のことですが、同名ファイルは、1回きりしか開けません。ただ、すべてを検索してきます。その中で、同名なら、1回だけ開けられます。 なお、ワイルドカードは、あまり使わないほうがよいです。FileSearchオブジェクトは、MS-DOS・コマンドプロンプトとは違う法則になっていますので、独自のワイルドカードはかなりヘンな癖を持っています。また、一旦検索すると、そのキャッシュが残りますので、時間は、多少速くなるはずです。 なお、以下は、Windows のバージョンに多少影響を受けます。XP以上なら、問題ないと思ってよいです。 '標準モジュール設定 Sub TestFindFile() Dim i As Long Dim ret As Integer '検索ファイル名 Const FNAME As String = "ワークシートA.xls"  With Application.FileSearch     .NewSearch     'バス指定     .LookIn = "C:\Documents and Settings\"     .Filename = FNAME     .SearchSubFolders = True     .Execute     If .FoundFiles.Count > 0 Then     For i = 1 To .FoundFiles.Count       ret = MsgBox(.FoundFiles.Count & " 個のファイルが見つかりました。" & vbCrLf & _       .Filename & " を、" & vbCrLf & _       Mid$(.FoundFiles(i), 1, InStrRev(.FoundFiles(i), "\")) & vbCrLf & _       "で見つけました。" & vbCrLf & _       .Filename & "をオープンしますか?", vbOKCancel)       If ret = vbOK Then        Workbooks.Open .FoundFiles(i)        '一回きりしか開けません。        Exit Sub       End If     Next     Else       MsgBox "対象ファイルはありませんでした"     End If   End With End Sub

kenta-s
質問者

お礼

できました!! 対象のワークシートには他では付けないような名前が付いているので ""を含むファイルを開く感じで全然大丈夫でした。 まだまだ理解できないコードが沢山ありますが、 徐々にそれを理解して応用できるように頑張りたいと思います。 ありがとうございました。

その他の回答 (5)

回答No.6

ANo.2の者です。 以下全部をエディタへ貼り付けマクロ「OpenDialog」を 実行すると、正常に動作しますよ。 おそらく、最後のFuctionの部分を貼り付けてられなかったのでは? Sub OpenDialog() Dim File種類, Prompt, Item As String Dim FileNamePath As Variant 'ファイルのパスを取得します File種類 = "Excel ファイル (*.xls),*.xls" Prompt = "out課題1.xlsを選択してください" FileNamePath = SelectFileNamePath(File種類, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If Workbooks.Open Filename:=FileNamePath End Sub Function SelectFileNamePath(File種類, Prompt) As Variant SelectFileNamePath = Application.GetOpenFilename(File種類, , Prompt) End Function

kenta-s
質問者

お礼

End Subの後にもコードをかけるんですね…。 勉強になりました! 書いてくださったVBA、試してみたのですが オープンダイアログ?が開かれて「ワークブックAを選択してください」と表示されるだけで、ワークブックAが開かれるわけではないようです。 他の方の回答で無事解決しました。 回答ありがとうございました。

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

#3の補足: # 同名ファイルは、1回きりしか開けません。ただ、すべてを検索してきます。その中で、同名なら、1回だけ開けられます。 同名ファイルは、違うフォルダなら、何個でも存在することは可能ですが、Excelで、開く段になると、1つしか選べません。同じファイル名を開けようとすれば、エラー・ダイアログで、 「! '○○.xls'と同じ名前のファイルが既に開いています。保存先か別のフォルダでも、同じ名前のファイルを同時に開くことはできません。2つめのファイルを開く場合、一方のファイルを閉じるか、またはいずれかのファイルの名前を変更してください。」 となります。 なお、#3 のコードは、 .Filename & "をオープンしますか?", vbOKCancel)      ↓ Mid$(.FoundFiles(i), InStrRev(.FoundFiles(i), "\") + 1) & "をオープンしますか?", vbOKCancel) と変えたほうがよいです。そのまま、ファイル名を入れても、ワイルドカードが働いていることが分かりました。 例: 検索名: TEST1.xls ヒットファイル名:MYTEST1.xls たぶん、ワイルドカードを防ぐ方法はあるかとは思いますが、あまり、細かな設定は、逆に、自由度を失うのでやめました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

フォルダやドライブが違えば、同名のファイル名が許されるのではないでしたっけ。 そうだとすれば(質問のケースでは通常ではつけないような、特殊なファイル名をつけているとは思いますが)あるフォルダに見つかったからといって、目指すものでない可能性が万に一起こりませんか。システムではあまり質問のようなことはしないことではないですか。(<=今はフォルダAがCドライブにありますが、明日はデスクトップ上にあったり、フォルダBの中に入っていたりするかもしれません。という状況を許すというのが、どういう必要性なのか) ーー こういう類の問題は VBAよりも、VBScriptのFSOの方が、ふさわしくないかと、本をざっと 見てみましたが、ファイル名を中心に、どのドライブやフォルダにあるというのを、一発で検索してくれるものはなさそうです。 フルパスを指定してFileExists(パス)というので限定のパスについて、調べるか、しらみつぶし式に調べるかではないですか。 FSOの解説を調べれば、「全てのドライブを参照したい」からはじまる、「コレクションのFor Eachが使えるもの」の解説が出てきますので、使えないか見てください。 http://www.bcap.co.jp/hanafusa/VBHLP/FSO01.htm のFileSystemObject オブジェクトの箇所など多数 ただしツリー構造のもの(ファイルシステム)を探索する(バックトラック法に類したことなど)などなれないと難しいかも。 小生にとって、あまり日常的に取り扱っている分野でないので、参考程度にしてください。   

kenta-s
質問者

お礼

難しい用語が多く、どのコードをどこで使えば良いかまだ理解できません。 それがわかるようになれば教えてくださったリンク先が十分参考になると思います。精進します。 ありがとうございました。

回答No.2

以下のリンクのやり方では如何でしょうか? http://www.k1simplify.com/vba/tipsleaf/leaf12.html

kenta-s
質問者

お礼

リンク先を参照し、ちょっといじってみたのですが…。 Sub OpenDialog() Dim File種類, Prompt, Item As String Dim FileNamePath As Variant 'ファイルのパスを取得します File種類 = "Excel ファイル (*.xls),*.xls" Prompt = "ワークシートA.xlsを選択してください" FileNamePath = SelectFileNamePath(File種類, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If Workbooks.Open Filename:=FileNamePath End Sub SelectFileNamePathの部分も変える必要があるみたいなのですが、 どう変えれば良いのかわかりません。 PC初心者レベルなので専門用語(違うかもですが)がさっぱりと言って良いほどわかりません。 なのでリンク先は今の私には難しいようです。 徐々に理解していけるようになれたら と思います。 回答ありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

普通にドライブ内のファイル検索を実行してみれば、結構時間がかかるかと思います。 開くたびにそのような時間を消費してもいいのでしょうか?

kenta-s
質問者

補足

時間がかかるとしても、その方法以外にないのでしたらそれで構いません。 実際にフォルダの場所がころころ変わるので… 以上、よろしくお願いいたします。