Explorer openen met specifieke folder

Status
Niet open voor verdere reacties.

henkhoogerbrug

Gebruiker
Lid geworden
25 sep 2008
Berichten
107
Hieronder de code die ik gebruik om de explorer te openen, zodat gebruikers naar een bepaalde folder kunnen navigeren. In het formulier wat ze moeten invullen moet namelijk ook worden aangegeven in welke folder dit moet worden opgeslagen.
Probleem is dat de explorer standaard bij deze computer start, ik wil echter dat gebruikers in excel al een default folder kunnen opgeven.

vb. gebruiker heeft in excel de default folder: "C:\My Documents\Forms_February"
Zodra nu de explorer wordt gestart moet deze folder al geselecteerd zijn, zodat de gebruiker van daaruit verder kan klikken.

Dit is de code die wordt gebruikt zodra er op de "Zoek folder"-knop wordt geklikt.
Code:
Sub SelectFolder_Click()

Dim FName As String
    
FName = BrowseFolder(Caption:="Select A Folder")
If FName = vbNullString Then
    Debug.Print "No Folder Selected"
Else
    ActiveWorkbook.Worksheets("Control data").Range("C14").Value = FName
End If

End Sub

In het txt bestand de code die gebruikt wordt om de explorer te openen, ik ben deze tegengekomen op internet en heb alleen de code SelectFolder_Click gemaakt.

Is het mogelijk om de BrowseInfo uit te breiden met een default folder?
 

Bijlagen

Als je in Excel werkt kan het veeleenvoudiger met

Code:
Sub tst()
    ChDrive "C"
    ChDir "C:\Windows2"
    Application.GetSaveAsFilename , , , "zoek een mapje"
End Sub
Als je op dezelfde drive blijft kan de instruktie ChDrive achterwege blijven.
 
dat is alleen niet helemaal wat ik zoek, want het bestand waar men in werkt wordt niet opgeslagen.
De map die men moet opgeven wordt gebruikt door een macro, die een nieuw bestand creëert (en opslaat in de opgegeven map) obv gegevens uit het geopende bestand.

Daarnaast wil ik eigenlijk gebruik maken van het explorer scherm wat ik nu ook gebruik, omdat ik dat de mooiste oplossing vind.

Ik heb zelf ook zitten denken aan SHGetFolderLoacation, maar ben daar ook nog niet veel verder mee gekomen.
Ik heb de folder locatie als string (gewoon het bestandspad, wat per gebruiker anders kan zijn), en daarmee wil ik dus de functie BrowseFolder mee beïnvloeden, maar hoe?
 
ChangeFileOpenDirectory krijg ik niet aan de praat, maar doet dat niet hetzelfde als ChDir?

In de macro in module2 (zie module2.txt) staat BrowseInfo. In die browseinfo staat ook pidlRoot, wanneer ik pidlRoot nu een getal als waarde geef wordt de juiste map geopend, alleen kan ik dan niet meer verder navigeren.
Het getal vind ik door de macro stap voor stap uit te voeren en dan in de explorer een map te selecteren, vervolgens krijgt "ID" een waarde (getal). Als je dit getal invult bij pidlRoot, dan wordt de explorer met deze map geopend, alleen zie je dan geen structuur meer.

Ik had bijv. de map "D:\Test", wat als nummer 218790808 kreeg.

De vraag is dus: hoe krijg ik het getal van een map (ik dacht met SHGetFolderLocation)
en waar moet ik dat getal invullen en behoud ik toch de boomstructuur in de verkenner.
 
Dag Henk,

ChangeFileOpenDirectory gebruik je samen met menu Bestand-Openen. Het is alsof je in menu Extra-Opties de mappen instelt.

Je kunt wel Shell "pad van verkenner" gebruiken om de verkenner te starten.

Gegroet,

Axel Hagg.
 
ik heb nog even verder gezocht en ben wel weer een stukje verder gekomen. Ik kan nu achterhalen wat het folder ID is.
Probleem is nu dat ik niet kan navigeren in de explorer. Standaard opent de explorer met "Computer". Ik heb het nu gewijzigd in "C:\", ik kan nu nog wel verder navigeren, maar niet meer terug naar "Computer". Als ik het pad instel op "C:\Users\" kan ik helemaal niet navigeren, maar krijg ik alleen de map "C:\Users".

Functie om ID van folder op te halen is:
Code:
Declare Function SHSimpleIDListFromPath Lib "shell32" Alias "#162" ( _
    ByVal szPath As String) As Long

De browseinfo wordt nu als volgt (deze code staat in de functie BrowseFolder, zie ook bijlage 1e post):
Code:
With BrowseInfo
   .hOwner = 0
   .pidlRoot = SHSimpleIDListFromPath(StrConv("C:\", vbUnicode))
   .pszDisplayName = String$(MAX_PATH, vbNullChar)
   .lpszINSTRUCTIONS = Caption
   .ulFlags = BIF_RETURNONLYFSDIRS
   .lpfn = 0
End With
 
Ik heb nu ook nog een eenvoudiger script gevonden, wat eigenlijk hetzelfde doet (en helaas ook nog hetzelfde probleem heeft).

@ Axel Hagg: dit is misschien ook wat jij bedoelt?

Code:
Sub BrowseForFolder_Shell()

Dim objShell As Object
Dim objFolder As Object
Dim strFolderFullPath As String

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0, "Please select a folder", 0, "C:\Program Files")


If (Not objFolder Is Nothing) Then
    ' NB: If SpecFolder= 0 = Desktop then ....
    On Error Resume Next
    If IsError(objFolder.Items.Item.Path) Then strFolderFullPath = CStr(objFolder): GoTo GotIt
    On Error GoTo 0
    ' Is it the Root Dir?...if so change
    If Len(objFolder.Items.Item.Path) > 3 Then
        strFolderFullPath = objFolder.Items.Item.Path & Application.PathSeparator
    Else
        strFolderFullPath = objFolder.Items.Item.Path
    End If
Else
    MsgBox "User cancelled": GoTo Xit
End If

GotIt:
MsgBox "You selected:= " & strFolderFullPath, vbInformation, "ObjectFolder:= " & objFolder

Xit:
Set objFolder = Nothing
Set objShell = Nothing

End Sub

Probleem is dus, dat als ik als default "C:\Users\" (of wat dan ook) opgeef ik bijvoorbeeld niet meer naar het bureaublad kan navigeren (omdat dat een niveau hoger ligt).
Als ik "C:\" als default heb betekent dit zelfs ook dat ik niet meer naar "D:\" kan navigeren.
 
Dan wordt de oplossing het niet specificeren van het hoogste nivo:

Code:
Sub ga()
    c4 = CreateObject("Shell.Application").BrowseForFolder(0, "Kies een map", 0)
End Sub
Resterend probleem is dat niet het volledige pad in de variabele wordt gezet, slechts de naam van de gekozen map.
 
Ik heb de oplossing gevonden (na lang zoeken op internet). Ik kan nu alle kanten op navigeren.
in de bijlage de oplossing.

Om de juiste parameters aan de functie te geven heb ik dit gebruikt:
Code:
strFolder = GetFolder("Select a folder", strInitialFolder, True)

waarbij strInitialFolder een variabele is, die door de gebruiker kan worden ingesteld.
met True wordt aangegeven dat de gebruiker ook nieuwe mappen mag aanmaken in het geopende explorer scherm.

In ieder geval bedankt voor het meedenken.
 

Bijlagen

Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan