目安箱 IV

目安箱投稿のルールはこちらをごらんください。
ご意見は電子メールで承っています。
「目安箱」は質問禁止です。技術的な質問はそれぞれの質問箱へどうぞ。

迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
99 / 118 ツリー ←次へ | 前へ→

【62】フォルダの選択 Jaka 04/8/11(水) 9:06 Excel[未読]
【68】フォルダ選択<API使用> BOTTA 04/8/23(月) 19:31 Excel[未読]
【69】フォルダ選択<Shell使用> BOTTA 04/8/23(月) 19:32 Excel[未読]
【70】フォルダ選択<FileDialog使用> BOTTA 04/8/23(月) 19:32 Excel[未読]
【93】Re:フォルダ選択<FileDialog使用> ちゃっぴ 05/3/18(金) 23:48 Excel[未読]
【71】Re:フォルダの選択 Jaka 04/8/30(月) 16:33 Excel[未読]
【94】Re:フォルダの選択 ちゃっぴ 05/3/19(土) 0:04 Excel[未読]
【95】Re:フォルダの選択 ちゃっぴ 05/3/19(土) 0:06 Excel[未読]

【62】フォルダの選択
Excel  Jaka  - 04/8/11(水) 9:06 -

引用なし
パスワード
   任意にフォルダを選択してパスを取得します。
IE4.0以上が、インストールされていることが前提。

Sub F選択()
Dim obj As Object

'デスクトップ
MsgBox "デスクトップが、トップ"
Set obj = CreateObject("Shell.Application"). _
      browseforfolder(0, "フォルダを選択してください", 0)
If Not obj Is Nothing Then
  MsgBox obj.Items.Item.Path
Else
  MsgBox "キャンセル"
End If
Set obj = Nothing

'マイコンピュータ(Win2000&ExL2000でも同じ)
MsgBox "マイコンピュータが、トップ"
Set obj = CreateObject("Shell.Application"). _
      browseforfolder(0, "フォルダを選択してください", 0, "")
If Not obj Is Nothing Then
  MsgBox obj.Items.Item.Path
Else
  MsgBox "キャンセル"
End If
Set obj = Nothing

'C(Win2000&ExL2000でも同じ)
MsgBox "Cが、トップ"
Set obj = CreateObject("Shell.Application"). _
      browseforfolder(0, "フォルダを選択してください", 0, "C:\")
If Not obj Is Nothing Then
  MsgBox obj.Items.Item.Path
Else
  MsgBox "キャンセル"
End If
Set obj = Nothing

End Sub

【68】フォルダ選択<API使用>
Excel  BOTTA  - 04/8/23(月) 19:31 -

引用なし
パスワード
   Jakaさん、どもっ。
「フォルダの選択」には悩んだことがありまして、補足させて頂きます。
'********************************************************************************
'<API使用>
'参考  http://support.microsoft.com/default.aspx?scid=kb;ja;179497
'APIを使ったもの、これが一番汎用性があるみたい
Option Explicit
Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" _
  (lpbi As BrowseInfo) As Long

Declare Function SHGetPathFromIDList Lib "shell32.dll" _
  Alias "SHGetPathFromIDListA" _
  (ByVal pidl As Long, _
  ByVal pszPath As String) As Long

Declare Sub CoTaskMemFree Lib "OLE32.dll" (ByVal pv As Long)

Type BrowseInfo
  hWndOwner As Long    '親ウィンドウハンドル
  pIDLRoot As Long     'ルートフォルダ(デスクトップは &H0)
  pszDisplayName As String '選択したフォルダ
  lpszTitle As String   'タイトル
  ulFlags As Long     '動作方法の指定(フォルダ選択は &H1)
  lpfnCallback As Long
  lParam As Long
  iImage As Long
End Type

Sub f選択01()
  Dim B_Info As BrowseInfo
  Dim lpIDList As Long '戻り値
  Dim SelectedF As String

  With B_Info
    .pIDLRoot = &H0 'デスクトップをルートに設定
    .lpszTitle = "フォルダを選択してネ"
    .ulFlags = &H1 'フォルダ選択限定
  End With

  lpIDList = SHBrowseForFolder(B_Info)     '「フォルダ選択」ダイアログを表示
  SelectedF = String$(256, vbNullChar)     '受取領域確保
  Call SHGetPathFromIDList(lpIDList, SelectedF) 'フォルダパス取得
  CoTaskMemFree lpIDList            'メモリ解放

  If lpIDList <> 0 Then
    If Left(SelectedF, 1) = vbNullChar Then MsgBox "選択不可!!", 16: Exit Sub
    SelectedF = Left(SelectedF, InStr(SelectedF, vbNullChar) - 1)
    MsgBox SelectedF, 64, "選択されたフォルダ"
  End If
End Sub

【69】フォルダ選択<Shell使用>
Excel  BOTTA  - 04/8/23(月) 19:32 -

引用なし
パスワード
   '<Shell使用>Jakaさんコードに追加
'obj.Items.Item.Pathだと「デスクトップフォルダ」が選択できなくなるので
'「デスクトップフォルダ」選択時の処理を追加
Sub f選択02()
  Dim obj As Object
  Dim tmpF As String
  Dim SelectedF As String
  Set obj = CreateObject("Shell.Application"). _
    browseforfolder(0&, "フォルダを選択してネ", &H1, &H0)
  If Not obj Is Nothing Then
    If Not obj.ParentFolder Is Nothing Then
      tmpF = obj.Items.Item.Path
    Else
      Dim objDskTop As Object
      Set objDskTop = CreateObject("WScript.Shell")
      tmpF = objDskTop.SpecialFolders("DeskTop")
      Set objDskTop = Nothing
    End If
    If tmpF = "" Then MsgBox "選択不可!!", 16: GoTo HdlExit
    SelectedF = tmpF
    MsgBox SelectedF, 64, "選択されたフォルダ"
  End If
HdlExit:
  Set obj = Nothing
End Sub
'補足
'>IE4.0以上が、インストールされていることが前提
'ですが、もっと詳しくは、
'IE4.0以上で、SHELL32.DLLのバージョンが4.71以降でないとエラーになります。
'(IE4.0でも、シェル統合インストールしていない場合はSHELL32.DLLのバージョンは
'4.71未満のままだそうです。>by JuJuさん)

【70】フォルダ選択<FileDialog使用>
Excel  BOTTA  - 04/8/23(月) 19:32 -

引用なし
パスワード
   '<FileDialog使用>
'Excel2002以降、FileDialogオブジェクトが使えるようになった
'引数「fileDialogType」にmsoFileDialogFolderPickerを指定
'従って、Excel2002以降限定
'個人的にはDialogの形がFile選択と同じであまり好きではない
Sub f選択03()
  With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show = -1 Then
      MsgBox .SelectedItems(1), 64, "選択されたフォルダ"
    End If
  End With
End Sub

【71】Re:フォルダの選択
Excel  Jaka  - 04/8/30(月) 16:33 -

引用なし
パスワード
   おお〜、いつのまにかこんなにたくさん。
どこにつけて良いのか解らなかったんでここに。
んで、

>obj.Items.Item.Pathだと「デスクトップフォルダ」が選択できなくなるので
???デスクトップはC開いてXX開いて・・・開いてで、開けるじゃん。
と、思っていたら、てっぺんのデスクトップの事だったんですね。
ここって触れるのね。
知らんかった。

私のだとてっぺんのデスクトップを選んだら、エラーになっちゃいますね!
今度からは、.SpecialFolders("DeskTop")を使わせてもらいます。
ありがとうございます。
それと、今のところフォローがここだけしかないんですけど、他のは....。

【93】Re:フォルダ選択<FileDialog使用>
Excel  ちゃっぴ  - 05/3/18(金) 23:48 -

引用なし
パスワード
   Windows XP(2000) 以降だったかな?
Shell32 に Folder3 という Object ができて、
表示される Shortcut の実体も透過的に扱える Self という
Property が出来ました。

'[BROWSEINFO]構造体使用オプションフラグ列挙型定数(ulFlags)
Enum BrowseInfoFlags
  BIF_RETURNONLYFSDIRS = &H1
  BIF_DONTGOBELOWDOMAIN = &H2
  BIF_STATUSTEXT = &H4
  BIF_RETURNFSANCESTORS = &H8
  BIF_EDITBOX = &H10
  BIF_VALIDATE = &H20
  BIF_NEWDIALOGSTYLE = &H40
  BIF_USENEWUI = (BIF_NEWDIALOGSTYLE Or BIF_EDITBOX)
  BIF_BROWSEINCLUDEURLS = &H80
  BIF_UAHINT = &H100
  BIF_NONEWFOLDERBUTTON = &H200
  BIF_NOTRANSLATETARGETS = &H400
  BIF_BROWSEFORCOMPUTER = &H1000
  BIF_BROWSEFORPRINTER = &H2000
  BIF_BROWSEINCLUDEFILES = &H4000
  BIF_SHAREABLE = &H8000
End Enum

Function strBrowseForFolderPath( _
  ByRef strTitle As String, _
  Optional ByVal lngHwnd As Long = 0, _
  Optional ByVal lngOptions As BrowseInfoFlags = 0, _
  Optional ByRef strRoot As String = "") As String
  
  Dim objShell As New Shell32.Shell
  Dim objFolder As Shell32.Folder3
  
  Set objFolder = objShell.BrowseForFolder( _
    lngHwnd, strTitle, lngOptions, strRoot)
  If Not objFolder Is Nothing Then
    If objFolder.Self.IsFileSystem = True Then
      strBrowseForFolderPath = objFolder.Self.Path
      Set objFolder = Nothing
    End If
  End If
  Set objShell = Nothing
End Function

【94】Re:フォルダの選択
Excel  ちゃっぴ  - 05/3/19(土) 0:04 -

引用なし
パスワード
   SHBrowseForFolderを使用して、Default表示Folderを変更するVersion

長さ制限で引っかかったので・・・
宣言部分だけ・・・


'///////////////////////////////////////////////////////////////////////////////////////////
'モジュール内共通構造体
'///////////////////////////////////////////////////////////////////////////////////////////
'[BROWSEINFO]構造体([SHBrowseForFolder]で使用する構造体)
Private Type tagBROWSEINFO
  hOwner     As Long     '親Windowのハンドル
  pidlRoot    As Long     'ルートフォルダのポインタ(PID)
  pszDisplayName As String    '選択されたフォルダ名
  lpszTitle    As String    'ダイアログに表示する文字列
  ulFlags     As Long     'オプションフラグ(BrowseInfoFlags)
  lpfn      As Long     'コールバック関数のアドレス
  lParam     As Long     'コールバック関数へのパラメータ
  iImage     As Long     'フォルダ用アイコンのシステムイメージリストID(不用のとき0)
End Type

'///////////////////////////////////////////////////////////////////////////////////////////
'共通定数
'///////////////////////////////////////////////////////////////////////////////////////////
Private Const MAX_PATH   As Long = 260&  'パス長最大値
Private Const WM_USER    As Long = &H400& 'アプリケーションメッセージコード範囲の開始値

'[BROWSEINFO]構造体使用ルートフォルダ(PID)列挙型定数(pidlRoot)
Public Enum gEnumCSIDL
  CSIDL_DESKTOP = &H0&
  CSIDL_INTERNET = &H1&
  CSIDL_PROGRAMS = &H2&
  CSIDL_CONTROLS = &H3&
  CSIDL_PRINTERS = &H4&
  CSIDL_PERSONAL = &H5&
  CSIDL_FAVORITES = &H6&
  CSIDL_STARTUP = &H7&
  CSIDL_RECENT = &H8&
  CSIDL_SENDTO = &H9&
  CSIDL_BITBUCKET = &HA&
  CSIDL_STARTMENU = &HB&
  CSIDL_MYDOCUMENTS = &HC&
  CSIDL_MYMUSIC = &HD&
  CSIDL_MYVIDEO = &HE&
  CSIDL_DESKTOPDIRECTORY = &H10&
  CSIDL_DRIVES = &H11&
  CSIDL_NETWORK = &H12&
  CSIDL_NETHOOD = &H13&
  CSIDL_FONTS = &H14&
  CSIDL_TEMPLATES = &H15&
  CSIDL_COMMON_STARTMENU = &H16&
  CSIDL_COMMON_PROGRAMS = &H17&
  CSIDL_COMMON_STARTUP = &H18&
  CSIDL_COMMON_DESKTOPDIRECTORY = &H19&
  CSIDL_APPDATA = &H1A&
  CSIDL_PRINTHOOD = &H1B&
  CSIDL_LOCAL_APPDATA = &H1C&
  CSIDL_ALTSTARTUP = &H1D&
  CSIDL_COMMON_ALTSTARTUP = &H1E&
  CSIDL_COMMON_FAVORITES = &H1F&
  CSIDL_INTERNET_CACHE = &H20&
  CSIDL_COOKIES = &H21&
  CSIDL_HISTORY = &H22&
  CSIDL_COMMON_APPDATA = &H23&
  CSIDL_WINDOWS = &H24&
  CSIDL_SYSTEM = &H25&
  CSIDL_PROGRAM_FILES = &H26&
  CSIDL_MYPICTURES = &H27&
  CSIDL_PROFILE = &H28&
  CSIDL_SYSTEMX86 = &H29&
  CSIDL_PROGRAM_FILESX86 = &H2A&
  CSIDL_PROGRAM_FILES_COMMON = &H2B&
  CSIDL_PROGRAM_FILES_COMMONX86 = &H2C&
  CSIDL_COMMON_TEMPLATES = &H2D&
  CSIDL_COMMON_DOCUMENTS = &H2E&
  CSIDL_COMMON_ADMINTOOLS = &H2F&
  CSIDL_ADMINTOOLS = &H30&
  CSIDL_CONNECTIONS = &H31&
  CSIDL_COMMON_MUSIC = &H35&
  CSIDL_COMMON_PICTURES = &H36&
  CSIDL_COMMON_VIDEO = &H37&
  CSIDL_RESOURCES = &H38&
  CSIDL_RESOURCES_LOCALIZED = &H39&
  CSIDL_COMMON_OEM_LINKS = &H3A&
  CSIDL_CDBURN_AREA = &H3B&
End Enum

'[BROWSEINFO]構造体使用オプションフラグ列挙型定数(ulFlags)
Public Enum BrowseInfoFlags
  BIF_RETURNONLYFSDIRS = &H1
  BIF_DONTGOBELOWDOMAIN = &H2
  BIF_STATUSTEXT = &H4
  BIF_RETURNFSANCESTORS = &H8
  BIF_EDITBOX = &H10
  BIF_VALIDATE = &H20
  BIF_NEWDIALOGSTYLE = &H40
  BIF_USENEWUI = (BIF_NEWDIALOGSTYLE Or BIF_EDITBOX)
  BIF_BROWSEINCLUDEURLS = &H80
  BIF_UAHINT = &H100
  BIF_NONEWFOLDERBUTTON = &H200
  BIF_NOTRANSLATETARGETS = &H400
  BIF_BROWSEFORCOMPUTER = &H1000
  BIF_BROWSEFORPRINTER = &H2000
  BIF_BROWSEINCLUDEFILES = &H4000
  BIF_SHAREABLE = &H8000
End Enum

'コールバック関数が受信するメッセージコード列挙型定数(uMsg)
Private Enum BFFM_CallBackMsgCode '  [説明]      [lParam]
  BFFM_INITIALIZED = 1      '初期化終了コード   NULL
  BFFM_SELECTIONCHANGE = 2    '設定変更コード    選択フォルダPID
  BFFM_VALIDATEFAILED = 3    'EditBox入力値エラー EditBox入力値PID
End Enum

'[SendMessage]で[SHBrowseForFolder]に送信できるメッセージコード列挙型定数(wMsg)
Private Enum BFFM_SendMsgCode       '  [説明]      [wParam]   [lParam]
  BFFM_SETSTATUSTEXTA = (WM_USER + 100) 'ステータス変更         設定するテキスト
  BFFM_ENABLEOK = (WM_USER + 101)    'OKボタン有効/無効設定     0:無効, 以外:有効
  BFFM_SETSELECTIONA = (WM_USER + 102) '初期フォルダの設定    0   フォルダPID
                     '             1   文字列のポインタ
End Enum

'///////////////////////////////////////////////////////////////////////////////////////////
'モジュール内有効API定義
'///////////////////////////////////////////////////////////////////////////////////////////
'-------------------------------------------------------------------------------------------
'[FindWindow](ウィンドウハンドルを返すAPI)宣言
'
'戻り値                   0:失敗, 1:成功
'
'引数        lpClassName       対象クラス名(String)
'          lpWindowName      対象ウィンドウのタイトル(String)
'-------------------------------------------------------------------------------------------
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
         
'-------------------------------------------------------------------------------------------
'[SHBrowseForFolder](フォルダ選択ダイアログAPI)宣言
'
'戻り値                   選択フォルダのPID(Long)
'
'引数        lpBrowseInfo      [BROWSEINFO]構造体のアドレス(tagBROWSEINFO)
'-------------------------------------------------------------------------------------------
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _
              (lpBrowseInfo As tagBROWSEINFO) As Long
                
'-------------------------------------------------------------------------------------------
'[SHGetPathFromIDList](PIDをパス名に変換するAPI)宣言
'
'戻り値                   対象アイテムのパス名
'
'引数        pidl          対象アイテムのPID(Long)
'          pszPath         対象アイテムのパス名(String)
'-------------------------------------------------------------------------------------------
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
              (ByVal pidl As Long, ByVal pszPath As String) As Long
                
'-------------------------------------------------------------------------------------------
'[CoTaskMemFree](タスクのメモリブロックを解放するAPI)宣言
'
'引数        pv             解放するブロックへのポインタID(Long)
'-------------------------------------------------------------------------------------------
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)

'-------------------------------------------------------------------------------------------
'[SendMessage](指定されたハンドルへメッセージを送るAPI)宣言
'
'引数        hwnd            対象ウインドウハンドル(Long)
'          wMsg            送信メッセージ(Long)
'          wParam           メッセージパラメータ1(Long)
'          lParam           メッセージパラメータ2(Long)
'-------------------------------------------------------------------------------------------
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hwnd As Long, ByVal wMsg As BFFM_SendMsgCode, ByVal wParam As Long, lParam As Any) As Long
  
'///////////////////////////////////////////////////////////////////////////////////////////
'共通変数
'///////////////////////////////////////////////////////////////////////////////////////////
Private mstrDefaultPath As String        '初期表示フォルダ

【95】Re:フォルダの選択
Excel  ちゃっぴ  - 05/3/19(土) 0:06 -

引用なし
パスワード
   んでもって本体

'*******************************************************************************************
'[BrowseCallbackProc]          コールバックされたメッセージによってメッセージを送る
'                    (コールバック関数)
'
'引数        hwnd        [SHBrowseForFolder]ウィンドウハンドル(Long)
'          uMsg        受信メッセージコード(Long)
'          lParam       パラメータ値(Long)
'          lpData       BROWSEINFO構造体のlParamメンバに設定された値(Long)
'*******************************************************************************************
Private Function BrowseCallbackProc(ByVal hwnd As Long, ByVal uMsg As BFFM_CallBackMsgCode, _
  ByVal lParam As Long, ByVal lpData As Long) As Long
  
  'メッセージコードが初期化終了の場合
  Select Case uMsg
    Case BFFM_INITIALIZED
      '初期フォルダを設定するメッセージ送信
      Call SendMessage(hwnd, BFFM_SETSELECTIONA, 1, ByVal mstrDefaultPath)
    Case Else
  End Select
End Function

'*******************************************************************************************
'[FARPROC]               AddressOf演算子の戻り値を戻す関数
'
'  ※ AddressOf演算子の値を変数に直接代入することができないので、
'    ダミーとして標準モジュール上に[FARPROC]関数を作成する。
'
'戻り値                 対象モジュールのアドレス
'
'引数        pfn         対象モジュールのアドレス(Long)
'*******************************************************************************************
Private Function FARPROC(pfn As Long) As Long
  FARPROC = pfn
End Function

'*******************************************************************************************
'[F_strSHBrowseForFolder]        BrowseForFolderを表示し、選択されたパス名を返す
'
'戻り値                 選択フォルダパス名(String)
'
'引数        strDefaultPath   初期表示フォルダ(String)
'          strPrompt      表示文字列(String)
'          lngFlag       [BROWSEINFO]構造体のulFlag(Long)
'          lngpidlRoot     [BROWSEINFO]構造体のpidlRoot(Long)
'          hOwner       親ウィンドウハンドル(Long)
'*******************************************************************************************
Public Function F_strSHBrowseForFolder( _
  Optional ByVal strDefaultPath As String = "", _
  Optional ByVal strPrompt As String = "フォルダを選択してください。", _
  Optional ByVal lngFlag As BrowseInfoFlags = BIF_RETURNONLYFSDIRS, _
  Optional ByVal lngpidlRoot As gEnumCSIDL = CSIDL_DESKTOP, _
  Optional ByVal hOwner As Long = -1) As String
  
  Dim udtBrowseInfo  As tagBROWSEINFO      '[BROWSEINFO]構造体
  Dim lngFolderPID  As Long           '選択フォルダPID
  Dim strFolderPath  As String * MAX_PATH    '選択フォルダパス名(初期値:vbNullChar * MAX_PATH )


  '初期フォルダ指定
  mstrDefaultPath = IIf(strDefaultPath = "", CurDir, strDefaultPath)

  '[BROWSEINFO]構造体初期化
  With udtBrowseInfo
    '親ウィンドウ設定
    .hOwner = IIf(hOwner = -1, FindWindow("XLMAIN", vbNullString), hOwner)
    .pidlRoot = lngpidlRoot             'ルートフォルダ指定
    .lpszTitle = strPrompt             '表示文字列指定
    .ulFlags = lngFlag               'オプションフラグ指定
    .lpfn = FARPROC(AddressOf BrowseCallbackProc)  'コールバック関数のアドレス代入
  End With
  
  'フォルダ選択ダイアログの表示
  lngFolderPID = SHBrowseForFolder(udtBrowseInfo)
  
  '選択フォルダのPIDが取得できた場合
  If lngFolderPID <> 0 Then
    '選択フォルダのPIDをパス名に変換
    If SHGetPathFromIDList(lngFolderPID, strFolderPath) <> 0 Then
      'NULL文字を削除
      F_strSHBrowseForFolder = _
         Left$(strFolderPath, InStr(strFolderPath, vbNullChar) - 1)
    End If
    '選択フォルダPIDのメモリを開放
    Call CoTaskMemFree(lngFolderPID)
  End If
End Function

Sub Test()
  MsgBox F_strSHBrowseForFolder("", , BIF_NEWDIALOGSTYLE Or BIF_NONEWFOLDERBUTTON)
End Sub

  新規投稿 ┃ツリー表示 ┃一覧表示 ┃トピック表示 ┃検索 ┃設定 ┃ホーム  
99 / 118 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:   
0
(SS)C-BOARD v3.8 is Free