- 締切済み
連続のフォルダ選択について教えて下さい
フォルダの選択をShellで連続して行う時について教えてください。 下記のようなマクロ(途中までですが)がある時 Shellでフォルダ選択の画面が開かれてフォルダを選んで、という作業を9回連続しておこなっています。 この時、指定のフォルダ内には膨大の数のフォルダがあり、1回選択してフォルダ選択の画面が閉じられて 再度フォルダ選択の画面が開くと始めの位置戻ります。それは普通だと思うのですが 今回行いたいのは、1回目にフォルダを選択して、フォルダ選択の画面が閉じられて 再度フォルダ選択の画面が開いた時に、カーソルの位置を1回目に選んだフォルダの位置から開きたいということです。 1回目に選んだフォルダの階層ではなく、カーソルの位置です。指定のフォルダの中に1000以上のフォルダが入っているので いちいち一番上に戻られると非常に不便です。ネットでも調べてはみましたが、こんな特殊な事をしてる人がおらず 困っています。 もしできるようであれば、教えて下さい。 Sub 回転WARP() Dim CriteriaName(8), myBox, CriteriaDT(8) As Double, myFolder As Object, _ i As Long, myFolderName As String, NameEnd As String, ParentPath As String, _ OutputCell(9) As String, myIsDate(8) As Boolean, OutputRange As Range Dim r As Long OutputCell(0) = "B4:B14" '1つ目のフォルダー名を入力するセルのセル番号 OutputCell(1) = "D22:D32" '2つ目のフォルダー名を入力するセルのセル番号 OutputCell(2) = "P22:P32" '3つ目のフォルダー名を入力するセルのセル番号 OutputCell(3) = "D37:D47" '3つ目のフォルダー名の表わす日時が2つ目のフォルダー名の表わす日時から3時間以上経過しているか否かを表示するセルのセル番号 OutputCell(4) = "P37:P47" '11個前のフォルダー名の表わす日時が1つ目のフォルダー名の表わす日時から3時間以上経過しているか否かを表示するセルのセル番号 OutputCell(5) = "D52:D62" '11個前のフォルダー名の表わす日時が2つ目のフォルダー名の表わす日時から24時間以上経過しているか否かを表示するセルのセル番号 OutputCell(6) = "P52:P62" '3つ目のフォルダー名を入力するセルのセル番号 OutputCell(7) = "D67:D77" '3つ目のフォルダー名の表わす日時が2つ目のフォルダー名の表わす日時から3時間以上経過しているか否かを表示するセルのセル番号 OutputCell(8) = "P67:P77" '11個前のフォルダー名の表わす日時が1つ目のフォルダー名の表わす日時から3時間以上経過しているか否かを表示するセルのセル番号 OutputCell(9) = "D82:D92" '11個前のフォルダー名の表わす日時が2つ目のフォルダー名の表わす日時から24時間以上経過しているか否かを表示するセルのセル番号 NameEnd = "_IKK" '処理の対象とするフォルダー名から日時を表す部分を除いた字列 Set OutputRange = Range("R20:R30") '3つ目のフォルダー名~11個前のフォルダー名を入力するセル範囲 ParentPath = "C:\Users\" ParentPath = Cells(2, 2).Value Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For i = 0 To 8 label1: Set myFolder = CreateObject("Shell.Application"). _ BrowseForFolder(0, i + 1 & "つ目のフォルダーを選択して下さい", _ 785, ParentPath & "") If myFolder Is Nothing Then myBox = MsgBox(i + 1 & "つ目のフォルダーが選択されていません。" _ & vbCrLf & "フォルダーの選択をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:フォルダーの選択をやり直します" & vbCrLf _ & "[いいえ]:処理を中止してマクロを終了します", _ vbYesNo + vbExclamation, "フォルダー未選択") If myBox = vbNo Then GoTo sub_Exit Else With myFolder.Items.Item CriteriaName(i) = .Name myIsDate(i) = Left(CriteriaName(i), 14) & NameEnd = CriteriaName(i) _ And IsDate(Format(Val(CriteriaName(i)), "0000-00-00 00:00:00")) If myIsDate(i) Then CriteriaDT(i) = Val(CriteriaName(i)) Else myBox = MsgBox( _ "選択したフォルダーの名称はこのマクロで処理の対象としている形式の名称になっておりません。" _ & vbCrLf & "このマクロで処理の対象としているのは" & vbCrLf & vbCrLf _ & "yyyymmddhhmmss" & NameEnd & vbCrLf _ & "(4桁の西暦年&2桁の月&2桁の日&2桁の時刻&2桁の分&2桁の秒" & NameEnd & ")" _ & vbCrLf & vbCrLf & "という形式になっているフォルダー名だけです。" _ & vbCrLf & "フォルダーの選択をやり直しますか?" & vbCrLf & vbCrLf _ & "[はい]:フォルダーの選択をやり直します" & vbCrLf _ & "[いいえ]:このまま処理を続行しますが、日時の比較は行いません。" & vbCrLf _ & "[キャンセル]:処理を中止してマクロを終了します", _ vbYesNoCancel + vbExclamation + vbDefaultButton2, "無効な選択") Select Case myBox Case vbCancel GoTo sub_Exit Case vbNo Case Else GoTo label1 End Select End If ParentPath = Left(.Path, InStrRev(.Path, "\") - 1) End With End If Set myFolder = Nothing Next i
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kumatti1
- ベストアンサー率60% (73/121)
COM(ラッパー)でなくてAPIのSHBrowseForFolderなら、初期フォルダを指定出来ます。
- NotFound404
- ベストアンサー率70% (288/408)
Explorer.exeなら Shell "Explorer.exe /select,C:\users" などとすると 指定したフォルダ/ファイルを選択状態にしてエクスプローラーが開くのですが、 今回の場合はユーザーがさらにフォルダ/ファイルを手動で選択したモノを 取得したいようなので、多分…、没。 指定のフォルダ/ファイルを選択状態にして開く選択方法は用意されてなかったような・・・。 一旦フォルダ/ファイルのリストをシートに書き出して このシートのリストから参照するようにすれば 出来そうな気がします。 思いつきレベルなので検証してはいません。ご参考まで。
お礼
ご回答ありがとうございました。 今回は自分のレベルではとても難しそうでしたので諦めました。 またよろしくお願いします。
- Prome_Lin
- ベストアンサー率42% (201/470)
普通に考えると、どうしても「ムリ」なのですが、「どうしても」なら、「Folder.Attributes 」を使って、最初に表示されたフォルダから上のフォルダ(この場合の「上」とは、エクスプローラーで表示される「上」で、例えば「1」「2」「3」というフォルダがあり、今、「2」を最初に選択したとした場合、「1」フォルダ)を「隠しフォルダ」に設定してしまうのです。 そして、マクロ終了時に「隠しフォルダ」に設定したフォルダを、通常の設定に戻す、という方法しか、私には思い浮かびません。 今、仕事が来るので、ゆっくりプログラムを考える時間がありませんが、ご参考まで。 なお、当然、エクスプローラーのメニュー「表示」→「オプション」でフォルダオプションを出し、「表示」タブから「隠しファイル、フォルダー、または隠しドライブを表示しない」にチェックを入れておくことをお忘れなく。
お礼
ご回答ありがとうございました。 説明して頂いた意味はなんとなくわかりました。しかし自分には少しレベルが高いようでしたので今回は諦めました。 ありがとうございました。
お礼
参考情報ありがとうございました。 今回は自分のレベルでは無理そうでしたので諦めました。 ありがとうございます。