Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3617 / 13644 ツリー ←次へ | 前へ→

【61060】エクスプローラで選択されているファイル名を取得したい ヨシナガ 09/4/7(火) 14:19 質問[未読]
【61067】Re:エクスプローラで選択されているファイ... Abyss 09/4/7(火) 22:41 発言[未読]
【61074】Re:エクスプローラで選択されているファイ... ichinose 09/4/8(水) 7:06 発言[未読]
【61081】Re:エクスプローラで選択されているファイ... ヨシナガ 09/4/8(水) 16:17 回答[未読]
【61083】Re:エクスプローラで選択されているファイ... Abyss 09/4/8(水) 16:30 回答[未読]
【61092】Re:エクスプローラで選択されているファイ... ヨシナガ 09/4/9(木) 9:59 お礼[未読]
【61093】Re:エクスプローラで選択されているファイ... ichinose 09/4/9(木) 10:11 発言[未読]
【61099】Re:エクスプローラで選択されているファイ... Abyss 09/4/9(木) 13:05 回答[未読]
【61139】Re:エクスプローラで選択されているファイ... ヨシナガ 09/4/10(金) 22:48 お礼[未読]
【61141】Re:エクスプローラで選択されているファイ... Abyss 09/4/10(金) 23:21 発言[未読]

【61060】エクスプローラで選択されているファイル...
質問  ヨシナガ  - 09/4/7(火) 14:19 -

引用なし
パスワード
   現在ウィンドウズ・エクスプローラ上で選択されているファイル名をVBAから取得したい

【61067】Re:エクスプローラで選択されているファ...
発言  Abyss  - 09/4/7(火) 22:41 -

引用なし
パスワード
   可能ですが、Windows Explorerが複数起動状態の場合の
対応は?

【61074】Re:エクスプローラで選択されているファ...
発言  ichinose  - 09/4/8(水) 7:06 -

引用なし
パスワード
   おはようございます。

>現在ウィンドウズ・エクスプローラ上で選択されているファイル名をVBAから取得したい

一例として・・・、新規ブックにて試してください。

最初に上記新規ブックに参照設定にて、

「Microsoft Internet Controls」
「Microsoft Shell Controls And Automation」

上記二つにチェックを入れてください。


Thisworkbookのモジュールに

'===============================================================
Option Explicit
Private Declare Function BringWindowToTop Lib "USER32" (ByVal hWnd As Long) As Long
Private WithEvents ep As InternetExplorer
Private WithEvents flv As ShellFolderView
Sub main()
  Call stt_folder("D:\My Documents\TESTエリア\testarea2002")
End Sub
'=======================================================
Sub stt_folder(ByVal mypath As Variant)
  Set ep = CreateObject("InternetExplorer.Application")
  With ep
   .Visible = True
   .MenuBar = False
   .Navigate2 mypath
   Do While .Busy = True Or .ReadyState <> 4
    DoEvents
    Loop
   Set flv = .document
  End With
End Sub
'=======================================================
Private Sub ep_OnQuit()
  Set flv = Nothing
  Set ep = Nothing
End Sub
'=======================================================
Private Sub flv_SelectionChanged()
  Dim g0 As Long
  Dim sitm As Object
  For Each sitm In flv.SelectedItems
    Cells(g0 + 1, 1).Value = sitm.Name
    g0 = g0 + 1
  Next
  If g0 > 0 Then
    ep.Quit
  Else
    Call BringWindowToTop(ep.hWnd)
  End If
End Sub


これでThisworkbook.mainを実行してみてください。

指定されたフォルダが表示されえます。
適当に中のファイル(フォルダ)を選択して下さい。
選択されたファイル(フォルダ)名がアクティブシートのA列に
書き込まれます。


試してみてください

もっとも特定のフォルダから、ファイルを選択させたいという意味なら、

Application.GetOpenFilenameを使ったほうが簡単ですけどね!!

【61081】Re:エクスプローラで選択されているファ...
回答  ヨシナガ  - 09/4/8(水) 16:17 -

引用なし
パスワード
   ichinose さん、早速のご回答、ありがとうございます。
ご指示の如く、実行すると、
 Private WithEvents ep As InternetExplorer
 Private WithEvents flv As ShellFolderView
のWithEventsで「オブジェクトモジュールでのみ有効です」と表示され中断されました。どういうことでしょうか。何か不備があるのでしょうか。
また、説明が簡略すぎたようです。再度、
 既にエクスプローラは起動されていて、あるファイル、例えば D:\work\abc.xls というファイルがあれば、ファイルビューで abc.xls が選択された状態になっている。この状態で、VBAからエクスプローラ上で選択されているファイル名を取得したい。
 ご面倒をおかけしますがよろしくご教授ください。

【61083】Re:エクスプローラで選択されているファ...
回答  Abyss  - 09/4/8(水) 16:30 -

引用なし
パスワード
   IchinoseさんのコードはObject Module
つまりThisWorkbookモジュールに書く必要がありあす。

しかし、IE7以上がインストールされたなら、
動作しないでしょう。

大分省略されていますが、以下のコードで
可能だと思います。

(標準モジュール)

Sub CatchFolderItems()

  Dim oFolderItems As Object
  Dim e As Object
  
  For Each e In CreateObject("Shell.Application").Windows
    If TypeName(e) = "IWebBrowser2" Then
      If UCase(e.FullName) Like "*EXPLORER.EXE" Then
        Exit For
      End If
    End If
  Next
  
  If e Is Nothing Then
    MsgBox "FolderViewが立ち上がっていない": Exit Sub
  End If
  
  Set oFolderItems = e.Document.SelectedItems
  
  If oFolderItems.Count = 0 Then
    MsgBox "選択されている項目がない": Exit Sub
  End If
  
  For Each e In oFolderItems
    MsgBox e.Path
  Next
  
End Sub

【61092】Re:エクスプローラで選択されているファ...
お礼  ヨシナガ  - 09/4/9(木) 9:59 -

引用なし
パスワード
   Abyssさん、的確な回答をありがとうございました。ここ数日、オブジェクトの取り扱いですっかり悩まされました。
IchinoseさんのコードはAbyssさんのご指摘のようにThisWorkbookに書くとコンパイルエラーは出なくなりましたが、IE7であるためでしょうか、特定不能なシステムエラーが出てしました。こちらはエクスプローラ上でファイルを選択する度にイベントが生じ、自動的にエクセルシート上に書き込まれるようですので、大いに利用できそうに思えます。エラーの対処法が分かりましたご面倒ですがお願いします。
お二人にはすっかりお世話になりました。ところで、こういうオブジェクト操作の情報はどこから得られておられるのでしょうか。参考図書などありましたらお教え願えないでしょうか。

【61093】Re:エクスプローラで選択されているファ...
発言  ichinose  - 09/4/9(木) 10:11 -

引用なし
パスワード
   ▼ヨシナガ さん:
おはようございます
私は、IE6.0なので正常に作動していました。
IE7での確認は私の環境ではできませんでした。
失礼しました。

【61099】Re:エクスプローラで選択されているファ...
回答  Abyss  - 09/4/9(木) 13:05 -

引用なし
パスワード
   IE7以降なら下記のようなコードに
なるでしょう。

(ThisWorkbook Module)
----------------------------------

'参照設定
' Microsoft Browser Helpers
' Microsoft Shell Controls And Automation

Private Declare Function BringWindowToTop Lib "User32" _
  (ByVal hWnd As Long) As Long
  
Private WithEvents ie As InternetExplorer
Private WithEvents View As ShellFolderView


Public Sub Test()
  SetExplorer "C:\"
End Sub


Public Sub SetExplorer(ByVal sPath As Variant)

  Const ShellBrowserWindow = _
      "{C08AFD90-F2A1-11D1-8455-00A0C91F3880}"
  Const CLSID_FOLDER = _
      "{EFA24E64-B078-11D0-89E4-00C04FC9E26E}"
  
  Set ie = GetObject("new:" & ShellBrowserWindow)
  With ie
    .Visible = True
    .ShowBrowserBar CLSID_FOLDER, True
    .Navigate2 sPath
  End With
  
  BringWindowToTop ie.hWnd
  
End Sub

Private Sub ie_NavigateComplete2 _
    (ByVal pDisp As Object, URL As Variant)
  Set View = pDisp.Document
  
End Sub

Private Sub view_SelectionChanged()

  Dim e As Object
  Dim i As Long
  
  Columns(1).ClearContents
  
  For Each e In View.SelectedItems
    i = i + 1
    Cells(i, 1).Value = e.Name
  Next
  
End Sub

Private Sub ie_OnQuit()
  Set View = Nothing
  Set ie = Nothing
  
End Sub

【61139】Re:エクスプローラで選択されているファ...
お礼  ヨシナガ  - 09/4/10(金) 22:48 -

引用なし
パスワード
   Abyssさん、またまた、ありがとうございました。
御貴殿からの2つの回答を頂いて、これらを併用して作業の効率が上がりそうです。
これまではエクスプローラ上でフォルダ名とファイル名をそれぞれコピー&ペーストでエクセルへ取り込んでいましたから、ずいぶんと便利になります。
感謝いたします。
再三で申し訳ありませんが、こういうオブジェクト操作の参考書などを紹介していただけませんか。よろしくお願いします。

【61141】Re:エクスプローラで選択されているファ...
発言  Abyss  - 09/4/10(金) 23:21 -

引用なし
パスワード
   >再三で申し訳ありませんが、こういうオブジェクト操作の参考書などを紹介していただけませんか。

私の場合ですが、今回のようなケースに役に立つ参考書は
ないかと思います。たとえば、IE6までは問題なかったのに、
OSやIEのVersionが変わったら動作しないなど。
参考書があってもすぐに過去の物になってしまう。
実際、IE8になって動作しないObjectは既にあるし。

試行錯誤の中で得る物も多いかな。

MSDNなどのサイトも参考になると思います。
今回のような場合、こちら。↓

> http//msdn.microsoft.com/en-us/library/bb774049(VS.85).aspx

3617 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free