Någon som vet hur jag kan låta användaren välja en mapp i ett dialogfönster, har gjort detta i VB men minns inte syntaxen.... <code> Om jag fattar rätt skall pidlRoot initieras med ett ID för startmappen, frågan är nu bara hur jag får tag i den.... Testade API:erna ovan utan att kunna initiera dialogrutans startmapp. John Walkenbach: Mappval
Mvh
MichaelSv: Mappval
'---------------------------------------------------
' WinAPI Declarations
'---------------------------------------------------
Private Declare Sub CoTaskMemFree _
Lib "ole32.dll" ( _
ByVal hMem As Long _
)
Private Declare Function SHBrowseForFolder _
Lib "shell32" ( _
lpbi As BrowseInfo _
) As Long
Private Declare Function SHGetPathFromIDList _
Lib "shell32" ( _
ByVal pidList As Long, _
ByVal lpBuffer As String _
) As Long
Private Declare Function GetActiveWindow _
Lib "user32" ( _
) As Long
'-------------------------------------------------
' User-Defined Types
'-------------------------------------------------
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
'-------------------------------------------------
' Module-level Constants
'-------------------------------------------------
'used for SHBrowseForFolder APIs
Const BIF_RETURNONLYFSDIRS = 1
Const MAX_PATH = 260
Function BrowseForFolder() As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
With udtBI
.hwndOwner = GetActiveWindow&
.lpszTitle = "Choose a folder"
.ulFlags = BIF_RETURNONLYFSDIRS
End With
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = _
SHGetPathFromIDList _
(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, _
vbNullChar)
If iNull Then _
sPath = Left$(sPath, iNull - 1)
End If
BrowseForFolder = sPath
End Function
</code>
Välj mapp med BrowseForFolder.
/Niklas JanssonSv: Mappval
/MiZSv: Mappval
Med VBA-funktionen Application.GetOpenFilename kan dock hela problemet lösas i tre steg, i vart fall i Excel.
1. Ange startmapp genom att ändra aktiv mapp för Excel med ChDir.
2. Använd GetOpenFilename och låt användaren välja en mapp
3. Hämta sökvägen till den nyligen valda aktiva mappen med CurDir
Som exempel kan du sen skicka sökvägen till Shell-funktionen, om du vill öppna mappen.
<code>
' API-funktion som identifierar sökvägen till Utforskaren
Declare Function GetWindowsDirectory Lib "kernel32" _
Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Declare Function ShellExecute Lib _
"shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nshowcmd As Long) As Long
Private Const SW_SHOWNORMAL = 1
Sub OpenMapp()
Dim Spath As String
Dim strBuffer As String
Dim intLen As Integer
strBuffer = String(256, 0)
intLen = GetWindowsDirectory(strBuffer, Len(strBuffer))
strBuffer = Left(strBuffer, intLen)
ChDir "sökväg" 'Byt ut sökväg mot korrekt sökvägsangivelse för startmapp
Application.GetOpenFilename "Mappar (*..*),*..*", , "Öppna mapp och klicka på Avbryt!", "Mapp"
Spath = CurDir
Shell strBuffer & Application.PathSeparator & "Explorer.exe" & " /e, " & Spath, 1
End Sub
</code>
Byt ut "sökväg" mot en korrekt sökväg tex "C:\Dokument". Eftersom aktiv mapp ändras kan det vara en god idé att skapa en variabel som lagrar aktiv mapps sökväg innan dialogrutan visas och återställa till densamma när koden körts klart. API-funktionen identifierar sökvägen till Utforskaren oberoende av Windows-version (>= Windows 95).
Jag vet inte vad användaren ska göra med sin mappsökväg. Här har jag bara som exempel antagit att vald mapp ska öppnas i ett Utforskar-fönster. Du kan göra något annat med Spath och i så fall i konsekvensens namn skippa Shell- och API-funktionen inklusive strBuffer och intLen, annars är det bara en kul grej, att öppna mappar direkt inifrån Excel.
Det opedagogiskt bakvända med denna metod för mappval är att det görs med knappen Avbryt men detta har å andra sidan angetts i namlistens text. För att ge användaren möjlighet att ångra åtgärden kan en meddelanderuta läggas in efter mappvalet och där be användaren bekräfta valet eller avbryta hela operationen.
Om Avbryt-knappen är oacceptabel för Mapp-val, använd API:erna som XL-Dennis refererar till med URL:erna i sitt inlägg nedan. Det innebär mer kod, dialogrutan har något sämre överblick över katalogstrukturen och såvitt jag kan se går det inte att skapa ny mappar att hänvisa till men å andra sidan ändras inte heller aktiv mapp och slutligen, och kanske viktigast, man väljer Mapp med OK-knappen, vilket torde vara i överenstämmelse med god programmeringssed.
mvh
Lars xlSv: Mappval
http://j-walk.com/ss/excel/tips/tip29.htm
Jim Rech:
http://www.bmsltd.co.uk/MVP/Default.htm
Randy Birch:
http://www.mvps.org/vbnet/index.html?code/browse/browsefolders.htm