
いつもお世話になっております。
新しいマクロの記録でフォルダAのワークブックAを開きました。
ChDir "C:\フォルダA"
Workbooks.Open Filename:= _
"C:\フォルダA\ワークシートA.xls"
しかし、今はフォルダAがCドライブにありますが、
明日はデスクトップ上にあったり、フォルダBの中に入っていたりするかもしれません。
このような時、上記のようなVBAでは開けません。
どこにあるか分からないフォルダAのワークブックAを開くには
どこをどのように直せばよろしいのでしょうか?
以上、よろしくお願いいたします。
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
できました!!
対象のワークシートには他では付けないような名前が付いているので
""を含むファイルを開く感じで全然大丈夫でした。
まだまだ理解できないコードが沢山ありますが、
徐々にそれを理解して応用できるように頑張りたいと思います。
ありがとうございました。
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
End Subの後にもコードをかけるんですね…。
勉強になりました!
書いてくださったVBA、試してみたのですが
オープンダイアログ?が開かれて「ワークブックAを選択してください」と表示されるだけで、ワークブックAが開かれるわけではないようです。
他の方の回答で無事解決しました。
回答ありがとうございました。
No.5
- 回答日時:
#3の補足:
# 同名ファイルは、1回きりしか開けません。ただ、すべてを検索してきます。その中で、同名なら、1回だけ開けられます。
同名ファイルは、違うフォルダなら、何個でも存在することは可能ですが、Excelで、開く段になると、1つしか選べません。同じファイル名を開けようとすれば、エラー・ダイアログで、
「! '○○.xls'と同じ名前のファイルが既に開いています。保存先か別のフォルダでも、同じ名前のファイルを同時に開くことはできません。2つめのファイルを開く場合、一方のファイルを閉じるか、またはいずれかのファイルの名前を変更してください。」
となります。
なお、#3 のコードは、
.Filename & "をオープンしますか?", vbOKCancel)
↓
Mid$(.FoundFiles(i), InStrRev(.FoundFiles(i), "\") + 1) & "をオープンしますか?", vbOKCancel)
と変えたほうがよいです。そのまま、ファイル名を入れても、ワイルドカードが働いていることが分かりました。
例:
検索名: TEST1.xls
ヒットファイル名:MYTEST1.xls
たぶん、ワイルドカードを防ぐ方法はあるかとは思いますが、あまり、細かな設定は、逆に、自由度を失うのでやめました。
No.4
- 回答日時:
フォルダやドライブが違えば、同名のファイル名が許されるのではないでしたっけ。
そうだとすれば(質問のケースでは通常ではつけないような、特殊なファイル名をつけているとは思いますが)あるフォルダに見つかったからといって、目指すものでない可能性が万に一起こりませんか。システムではあまり質問のようなことはしないことではないですか。(<=今はフォルダAがCドライブにありますが、明日はデスクトップ上にあったり、フォルダBの中に入っていたりするかもしれません。という状況を許すというのが、どういう必要性なのか)
ーー
こういう類の問題は
VBAよりも、VBScriptのFSOの方が、ふさわしくないかと、本をざっと
見てみましたが、ファイル名を中心に、どのドライブやフォルダにあるというのを、一発で検索してくれるものはなさそうです。
フルパスを指定してFileExists(パス)というので限定のパスについて、調べるか、しらみつぶし式に調べるかではないですか。
FSOの解説を調べれば、「全てのドライブを参照したい」からはじまる、「コレクションのFor Eachが使えるもの」の解説が出てきますので、使えないか見てください。
http://www.bcap.co.jp/hanafusa/VBHLP/FSO01.htm
のFileSystemObject オブジェクトの箇所など多数
ただしツリー構造のもの(ファイルシステム)を探索する(バックトラック法に類したことなど)などなれないと難しいかも。
小生にとって、あまり日常的に取り扱っている分野でないので、参考程度にしてください。
難しい用語が多く、どのコードをどこで使えば良いかまだ理解できません。
それがわかるようになれば教えてくださったリンク先が十分参考になると思います。精進します。
ありがとうございました。
No.2
- 回答日時:
リンク先を参照し、ちょっといじってみたのですが…。
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初心者レベルなので専門用語(違うかもですが)がさっぱりと言って良いほどわかりません。
なのでリンク先は今の私には難しいようです。
徐々に理解していけるようになれたら と思います。
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
- Excel(エクセル) 【マクロ】フォルダを2つのモニターの定位置に並べたい 2 2022/09/02 01:14
- Excel(エクセル) マクロVBAのフォルダ階層別で検索の方法 4 2022/04/03 23:23
- Excel(エクセル) 【マクロ】フォルダを3つ、POモニター上に、決まった並べ方をしたい 4 2022/08/31 11:05
- Visual Basic(VBA) ワイルドカード「*」を使うとうまくいかないマクロの添削をお願いします 3 2022/03/26 09:39
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) 【VBA】ファイルパスに半角スペースが入ると、VBAが動かない 5 2022/08/04 20:52
- Visual Basic(VBA) エクセルのマクロについて教えてください 物件ごとのフォルダを作成してます そのフォルダ内にサブフォル 2 2023/07/02 17:58
- Android VBA、フォルダのパスに環境文字 ㉑ があり、VBAが機能しません。 2 2022/07/27 09:16
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのVBAでフォルダ指定がで...
-
Windows10でコマンドプロンプト...
-
Access VBA で フォルダ権限...
-
HSPの実行ファイルが実行で...
-
C++Builder Ver6.0.でコンポー...
-
デスクトップの画像をhtmlに表...
-
エクセルのデータをメモ帳に貼...
-
ファイル名と同名のフォルダを...
-
ファイル名から該当フォルダへ移動
-
VBA フォルダ名に特定の文字を...
-
VBA 最新のフォルダ取得
-
excelマクロ 冒頭3文字が一致す...
-
API関数(DLL)の呼び出しにお...
-
フォルダAから1つのファイルだ...
-
条件に合うフォルダが存在する...
-
エクセルのマクロについて教え...
-
Excelのハイパーリンクについて...
-
C ファイル出力で、フォルダが...
-
フルパスから指定階層目のフォ...
-
フォルダ内のPDFファイル名を変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10でコマンドプロンプト...
-
会社のネットワーク上のファイ...
-
ファイル名と同名のフォルダを...
-
VBA 最新のフォルダ取得
-
【マクロ】ファイル名の日付に...
-
Access VBA で フォルダ権限...
-
デスクトップの画像をhtmlに表...
-
パス名に2バイト文字(マルチバ...
-
VBA フォルダ名に特定の文字を...
-
VBA フォルダの複数選択ができない
-
Excelで指定したフォルダに保存...
-
excel VBA Dirにて検索したフォ...
-
エクセルマクロで指定フォルダ...
-
ディレクトリ名変更してコピー...
-
サーバ内のフォルダ名と各フォ...
-
VBプロジェクトでのフォルダ構...
-
excelマクロ 冒頭3文字が一致す...
-
Excelのハイパーリンクについて...
-
フォルダの場所を可変にしたい...
-
VB.NRT FolderBrowserDialogを...
おすすめ情報