ユーザー@Alainのカスタム定義関数を複製する可能性が高い関数を作成したと思いますFindConstants("Message Here")
. VBA でディレクトリ パスを呼び出す方法は、Windows API を使用することです。この関数は、ファイル DLL を呼び出してディレクトリ ブラウザを表示します。次に、選択内容を に保存しDirPath()
ます。これらの宣言を 64 ビット マシンで呼び出す方法がわかりません。これは、Windows 7 を実行していることを前提としています。
Option Explicit
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
'32-bit API declarations
Declare Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) _
As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Function DirPath(Optional Msg) As String
Dim bInfo As BROWSEINFO
Dim path As String
Dim r As Long, x As Long, pos As Integer
bInfo.pidlRoot = 0&
' Window title information
If IsMissing(Msg) Then
bInfo.lpszTitle = "Select a folder."
Else
bInfo.lpszTitle = Msg
End If
' Directory information to return
bInfo.ulFlags = &H1
' Display the browsing dialog
x = SHBrowseForFolder(bInfo)
' Parse
path = Space$(512)
r = SHGetPathFromIDList(ByVal x, ByVal path)
If r Then
pos = InStr(path, Chr$(0))
DirPath = Left(path, pos - 1)
Else
DirPath = "" ' Saves no directory if nothing is selected!
End If
End Function
上記の関数をテストする Sub は次のとおりです。
Sub Test()
Dim Msg As String
Msg = "Please select a template repository."
MsgBox GetDirectory(Msg)
End Sub
少し面倒で申し訳ありませんが、Markdown でコード ブロックをクリーンアップする方法がわかりません...これは完全な答えではなく、API を介した呼び出しに慣れていないため、到達するのに時間がかかりました。さらに、MSDN は C+ を念頭に置いて書かれていますが、それは私にはわかりません。そのため、C+ の宣言を VBA の宣言と同一視するテーブル化されたリソースを見つける必要がありました (As Long と *FAR など)。アランのコードで見つけた関数をアドオンまたはよく知られた UDF として誰かが貢献または特定できる場合に備えて、質問を開いたままにします。作成して学習するにつれて、この回答をさらに編集します。