みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

いつもお世話になっております。

新しいマクロの記録でフォルダAのワークブックAを開きました。
ChDir "C:\フォルダA"
Workbooks.Open Filename:= _
"C:\フォルダA\ワークシートA.xls"

しかし、今はフォルダAがCドライブにありますが、
明日はデスクトップ上にあったり、フォルダBの中に入っていたりするかもしれません。

このような時、上記のようなVBAでは開けません。
どこにあるか分からないフォルダAのワークブックAを開くには
どこをどのように直せばよろしいのでしょうか?

以上、よろしくお願いいたします。

投稿日時 - 2007-09-20 16:28:02

QNo.3361610

困ってます

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

こんばんは。

以下は、当たり前のことですが、同名ファイルは、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

投稿日時 - 2007-09-20 19:56:04

お礼

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

投稿日時 - 2007-09-21 12:31:03

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.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

投稿日時 - 2007-09-21 10:48:28

お礼

End Subの後にもコードをかけるんですね…。
勉強になりました!

書いてくださったVBA、試してみたのですが
オープンダイアログ?が開かれて「ワークブックAを選択してください」と表示されるだけで、ワークブックAが開かれるわけではないようです。

他の方の回答で無事解決しました。

回答ありがとうございました。

投稿日時 - 2007-09-21 12:45:38

ANo.5

#3の補足:
# 同名ファイルは、1回きりしか開けません。ただ、すべてを検索してきます。その中で、同名なら、1回だけ開けられます。

同名ファイルは、違うフォルダなら、何個でも存在することは可能ですが、Excelで、開く段になると、1つしか選べません。同じファイル名を開けようとすれば、エラー・ダイアログで、

「! '○○.xls'と同じ名前のファイルが既に開いています。保存先か別のフォルダでも、同じ名前のファイルを同時に開くことはできません。2つめのファイルを開く場合、一方のファイルを閉じるか、またはいずれかのファイルの名前を変更してください。」

となります。

なお、#3 のコードは、

.Filename & "をオープンしますか?", vbOKCancel)
     ↓
Mid$(.FoundFiles(i), InStrRev(.FoundFiles(i), "\") + 1) & "をオープンしますか?", vbOKCancel)


と変えたほうがよいです。そのまま、ファイル名を入れても、ワイルドカードが働いていることが分かりました。

例:
検索名: TEST1.xls

ヒットファイル名:MYTEST1.xls

たぶん、ワイルドカードを防ぐ方法はあるかとは思いますが、あまり、細かな設定は、逆に、自由度を失うのでやめました。

投稿日時 - 2007-09-20 22:27:47

ANo.4

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

投稿日時 - 2007-09-20 20:56:04

お礼

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

投稿日時 - 2007-09-21 12:36:58

ANo.2

以下のリンクのやり方では如何でしょうか?

http://www.k1simplify.com/vba/tipsleaf/leaf12.html

投稿日時 - 2007-09-20 17:10:49

お礼

リンク先を参照し、ちょっといじってみたのですが…。
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初心者レベルなので専門用語(違うかもですが)がさっぱりと言って良いほどわかりません。
なのでリンク先は今の私には難しいようです。
徐々に理解していけるようになれたら と思います。

回答ありがとうございました。

投稿日時 - 2007-09-20 17:35:57

ANo.1

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

投稿日時 - 2007-09-20 16:51:29

補足

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

以上、よろしくお願いいたします。

投稿日時 - 2007-09-20 17:00:30

あなたにオススメの質問