#2の補足ですが、参考になるかどうか自信はありません f(^_^)
APIからのフォルダ参照によるフルパス取得です。
下記コードを御参考下さい。VB精通者から見ると ”なんじゃこりゃ” ってなお粗末なコードですがご勘弁下さい m(_ _)m
また、毎回指定を回避するには指定内容をレジストリに記録するか設定ファイル(iniファイル)に記録して参照する方法があります、いずれもやはりAPI使用により可能です。
お勧めは後者(設定ファイル作成方法)です・・・理由>>不必要になった場合レジストリにゴミを残さない為です。(レジストリ内容も削除はできますが)
レスが長くなりましたが参考になれば幸いです。
'API宣言
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Private Const MaxP = 260
Private Type yochi
Own As Long
Roo As Long
Nam As String
Tit As String
End Type
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal PointerToIdList As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBROWSEINFO As yochi) As Long
Private Declare Function CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long) As Long
Dim Z As Integer
'------------------------------------------------------------------------------------------------
Sub Folder()
'フォルダの選択
Dim Path As String
Dim Hw As Long
Dim Ro As Long
Dim Dr As String
Z = 0
Dr = "フォルダを指定して下さい."
Ro = GetFo(Hw, Dr, Path)
If Ro = 0 Then
If Z = 1 Then
MsgBox "このフォルダは指定出来ません。"
Exit Sub
End If
MsgBox Path
ElseIf Ro = 1 Then
End 'Exit Sub
End If
End Sub
'------------------------------------------------------------------------------------------
Private Function GetFo(ByVal Hw As Long, ByVal Msg As String, ByRef Path As String) As Long
Dim bi As yochi
Dim pidl As Long
Dim iRo As Long
On Error GoTo ErrorHandler
bi.Tit = Msg
pidl = SHBrowseForFolder(bi)
If pidl = 0 Then
Exit Function
End If
Path = String$(MaxP + 1, Chr$(0))
If SHGetPathFromIDList(ByVal pidl, ByVal Path) = 0 Then
iRo = CoTaskMemFree(pidl)
Z = 1
Exit Function
End If
Path = Left(Path, InStr(Path, Chr$(0)) - 1)
iRo = CoTaskMemFree(pidl)
If iRo <> 0 Then
End If
Exit Function
ErrorHandler:
If pidl <> 0 Then CoTaskMemFree pidl
End Function
お礼
長い長いコードをありがとうございます。 訳のわからない質問に、こんなに時間を掛けて・・・ 敬意を表します。 一行一行勉強します。 自分が情けない(・_・、)