- ベストアンサー
マクロで特定のフォルダの中から任意のフォルダを開きたい
マクロで特定のフォルダの中から、任意のフォルダを開きたいのです。 または、特定のフォルダの中から最新のブックを開きたいのですが このような方法ご存知の方ご教示いただけませんでしょうか^^; 以下のコードは、似たような方法がないか検索して 見つけたマクロなのですが、この方法ですと 特定のフォルダを指定して開くことはできますが 任意のフォルダを一発で開くということは難しいようです。 Private Sub Worksheet_BeforeDoubleClick() Cancel = True Const dataDir As String = "C:\テスト\保存データ\" Dim dataFilePath As String dataFilePath = dataDir & Target.Value & ".xls" Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExists(dataFilePath) Then Workbooks.Open (dataFilePath) End If 保存データというフォルダに番号がフォルダ名のフォルダが複数入っています。 例) 100 101 102 103 104 と、いった具合です。 保存フォルダの中の104(任意のフォルダ)を開くマクロまたは番号のフォルダは関係なく 保存フォルダの中の最新ブックを開くことができるような方法はないでしょうか? 開きたいブックというのは、最新ブックのみですので、この例の場合 104が最新のフォルダというわけではなく、番号のフォルダ自体は 104以降もあり、最新ファイルが104にある場合は105以降のフォルダは 空の状態です。 分かりにくい説明ではございますが、よろしくお願いします^^;
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
要求がちょっと分からなくなってきています。 各フォルダ(100,101、102,103,104など)の最新を開くのでしょうか(複数開く それとも全フォルダーの中での最新を開くのでしょうか? いちおう全フォルダーの中で最新ということでのコード Sub LastFileopen() Dim FSysObj As Object Dim Flscol As Object Dim Fldcol As Object Dim Fld As Object Dim Flds As Object Dim Fl As Object Dim initpath As String Dim maxdate As Date Dim lastfl As String Dim fldname As String initpath = "C:\テスト\保存データ" Set FSysObj = CreateObject("Scripting.FileSystemObject") Set Fld = FSysObj.GetFolder(initpath) Set Fldcol = Fld.Folders For Each Flds In Fldcol Set Flscol = Flds.Files For Each Fl In Flscol If Fl.DateCreated >= maxdate And Split(Fl.Name, ".")(1) = "xls" Then maxdate = Fl.DateCreated lastfl = Fl.Name fldname = Flds.Name End If Next Next If lastfl <> "" Then Workbooks.Open (initpath & "\" & fldname & "\" & lastfl) End If End Sub テストしてませんので(環境作るのが面倒)あしからず。
その他の回答 (4)
- rivoisu
- ベストアンサー率36% (97/264)
すみません。跡で回答と思っていて忘れていました。 もう一個for each をネストすればいいんですが、明日にでも回答します。
- cistronezk
- ベストアンサー率38% (120/309)
Sub Mcr1() Dim dic As New Scripting.Dictionary '参照設定で「Microsoft Scripting Runtime」をチェック Dim lastestFile As String, lastestDate As Date, i As Integer '「保存データ」以下のフォルダにある全ファイル名と作成日時情報を取得 GetAllFiles "保存データ", dic '最新のxlsファイルを取得 For i = 0 To dic.Count - 1 If lastestDate < dic.Item(dic.keys(i)) And LCase(Right(dic.keys(i),4)) = ".xls" Then lastestFile = dic.keys(i) lastestDate = dic.Item(lastestFile) End If Next i If lastestFile<> "" Then Workbooks.Open (lastestFile) End If End Sub Private Sub GetAllFiles(strPath As String, dic As Scripting.Dictionary) Dim fso As Object, fl As Object, fldr As Object, subfldr As Object Set fso = CreateObject("Scripting.FileSystemObject") Set fldr = fso.GetFolder(strPath) For Each fl In fldr.files 'ファイルのパスをキー、作成日時をitemとして格納 dic.Add fl.Path, fl.DateCreated Next For Each subfldr In fldr.SubFolders GetAllFiles subfldr.Path, dic Next Set fldr = Nothing Set fso = Nothing End Sub
お礼
回答頂きまして、ありがとうございます^^ お礼、返答遅れまして申し訳ございません^^; いただきました、コードを当方のデータで使わせてもらったのですが 当方の技量、知識不足によるところが大きいと思われますが いろいろ試してみたのですが、なぜかうまくいきませんでした^^; 自分自身のスキルアップの必要性を痛切に感じました^^; せっかく作成していただいたのですが、生かすことが出来ずもうしわけございません。
- rivoisu
- ベストアンサー率36% (97/264)
Sub LastFileopen() Dim FSysObj As Object Dim Flscol As Object Dim Fld As Object Dim Fl As Object Dim initpath As String Dim maxdate As Date Dim lastfl As String initpath = "C:\テスト\保存データ" Set FSysObj = CreateObject("Scripting.FileSystemObject") Set Fld = FSysObj.GetFolder(initpath) Set Flscol = Fld.Files For Each Fl In Flscol If Fl.DateCreated >= maxdate And Split(Fl.Name, ".")(1) = "xls" Then maxdate = Fl.DateCreated lastfl = Fl.Name End If Next If lastfl <> "" Then Workbooks.Open (initpath & "\" & lastfl) End If End Sub 最後に作られたFileを開きます。 「最後に更新された」だったらDateCreatedをDateLastModified にします。 要するにそのフォルダのファイルズコレクションをFor Each Nextで見ながら一番日付の大きいファイルの名前を取得してopenする。
補足
ご回答ありがとうございます^^ 当方、マクロ初心者ですので、とてもコードの内容までは理解できませんが、複雑なコードと詳細な解説で助かります。 早速当方のデータに使わせていただいたのですが 当方の説明が不十分だった為、巧くいかないようです。 ブックを保存しているのは、保存データの中の 番号がフォルダ名の中ですので C:\テスト\保存データ\104 このような感じになります。104の中にブックがありますので initpath = "C:\テスト\保存データ\104" と、記述すると確かに狙った効果があるのですが この場合104にしか、対応できません^^; 最後の104の部分を任意に変更、または自動で最新ファイルのあるフォルダに移動できる方法ございますでしょうか? せっかくご回答いただいたのに、失礼ではありますが お時間ございましたら、再度知恵を貸していただけると幸いです^^;
- watabe007
- ベストアンサー率62% (476/760)
>マクロで特定のフォルダの中から任意のフォルダを開きたい 特定のフォルダは、"G:\テスト\保存データ\" 任意のフォルダーはダイアログで選択なら Const dataDir As String = "G:\テスト\保存データ\" Dim myFolder As Object Set myFolder = CreateObject("Shell.Application").BrowseForFolder(0, "フォルダを選択してください", 0, dataDir) If myFolder Is Nothing Then MsgBox "キヤンセルしました。" Else MsgBox myFolder.Items.Item.Path & Chr(13) & " が選択されました。" End If
お礼
ご回答ありがとうございます^^ 早速当方のデータでためさせていただきました。 ですが当方のやり方が悪いのか、狙った効果は得られませんでした^^; 選択されました。 と、メッセージボックスは出てくるのですが 肝心のフォルダが開かれませんでした^^; せっかくご教示頂いた方法ですので、もう少し試行錯誤してみたいと思います^^
お礼
改めて、ご回答頂きましてありがとうございます^^ 説明が分かりにくくなってしまい、申し訳ありませんでした。 要求させていただいていたのは、全フォルダーの中での最新を開く と、言うことです。 今回ご回答いただけました内容で狙った効果が得られました^^ お手数おかけしました、そして改めてご回答ありがとうございました^^