Folder naam weergeven

  • Onderwerp starter Onderwerp starter wacco
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

wacco

Gebruiker
Lid geworden
9 mrt 2006
Berichten
229
Hallo,

Is het mogelijk om doormiddel van een knop, de verkenner van windows te openen.
Daarna een folder opzoek, en dze in een veld weer te geven.
In dit veld moet dus niet een bestandnaam komen, maar enkel de folder (map) naam.
De bedoeling is dus :
Na klikken op de knop, opend de verkenner zich.
Vervolgens ga je nar een bepalde folder, b.v c:\documents
Na in het verkennerscherm op OK geklikt te hebben, wordt in het veld weergegeven : c:\documents

Ik hoop dat hiermee duidelijk is wat ik bedoel, en ik hoop dat het mogelijk is.

Gr,
Jack
 
Ben ik weer :)

Code:
 Dim strFolderName As String

    strFolderName = BrowseFolder("Choose Folder For Import")

    If Len(strFolderName) > 0 Then
        haal je pad met: strfolder.SelectedPath plaats het ergens
    Else
     Geen geldig gekozen folder, of user canceled
    End If

[edit]http://access.mvps.org/access/api/api0002.htm[/edit]
 
Laatst bewerkt:
Dank voor de snelle reactie.
Maar als ik deze code aan de knop hang (bij klikken), dan krijg ik een compileer fout:
-Sub of function is niet gedefinieerd.
Er wordt vervolgens verwezen (geel) , naar het gedeelte Browsefolder.
Ik weet dus eigenlijk niet wat er fout gaat.
Maar de VBA code Browsefolder bestaat volgens mij niet.
Ik ben wel iets tegen gekomen waar dit in wordt genoemd, maar dat maakt het er niet simpeler op.
Er is hier iets over te vinden op de volgende link :
http://access.mvps.org/access/api/api0002.htm

Ik hoop eigenlijk dat het wat simpeler kan.
Ik kan wel een explorerscherm openen met : Shell "C:\WINDOWS\explorer.exe "
Maar daar kan ik dan verders weer niets mee.
 
Dat klopt browsefolder bestaat niet, daarvoor moet je eerst een module toevoegen met deze code erin:

Code:
'************** Code Start **************
'This code was originally written by Terry Kreft.
'It is not to be altered or distributed,
'except as part of an application.
'You are free to use it in any application,
'provided the copyright notice is left unchanged.
'
'Code courtesy of
'Terry Kreft

Private 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

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _
            "SHGetPathFromIDListA" (ByVal pidl As Long, _
            ByVal pszPath As String) As Long
            
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
            "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) _
            As Long
            
Private Const BIF_RETURNONLYFSDIRS = &H1
Public Function BrowseFolder(szDialogTitle As String) As String
  Dim X As Long, bi As BROWSEINFO, dwIList As Long
  Dim szPath As String, wPos As Integer
  
    With bi
        .hOwner = hWndAccessApp
        .lpszTitle = szDialogTitle
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With
    
    dwIList = SHBrowseForFolder(bi)
    szPath = Space$(512)
    X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
    
    If X Then
        wPos = InStr(szPath, Chr(0))
        BrowseFolder = Left$(szPath, wPos - 1)
    Else
        BrowseFolder = vbNullString
    End If
End Function
'*********** Code End *****************

Ik had inderdaad die link bij de vorige post willen zetten, ben ik vast vergeten?
 
De Functie kan een stuk simpeler, als je de juiste bibliotheek aan zet;

Code:
Function SelectFolder(Optional Title As String, Optional TopFolder As String) As String
Dim objShell As New Shell32.Shell
Dim objFolder As Shell32.Folder

'Deze functie maakt gebruik van de bibliotheek <Microsoft Shell Controls And Automation>
'Als je 16384 gebruikt in plaats van 1 op de volgende regel, dan worden ook de bestanden getoond.
    Set objFolder = objShell.BrowseForFolder(0, Title, 1, TopFolder)
    If Not objFolder Is Nothing Then
        SelectFolder = objFolder.Items.Item.Path
    End If

End Function

En je gebruikt 'm zo:
Code:
Private Sub cmdMapSelecteren_Click()
    strPath = SelectFolder("Selecteer een map...", "")
    If Len(strPath) Then
        Me.Documents = strPath
    Else
        MsgBox "Er is op <Cancel> gedrukt..."
    End If
End Sub
 
Beiden, hartelijk dank.
Ik heb de optie van Mastermindzh gebruikt, en deze werkt.
Is toch veel ingewikkelder dan ik had verwacht, maar het werkt wel.
Ik heb alleen nog wel een (hopelijk) klein probleempje.
Als ik het formulier afsluit, en ik open daarna dit zelfde formulier weer.
Dan is het tekstveld, waarin de folder verwijzing staat, weer leeg.
Ik gebruik nu de volgende code :

Code:
Private Sub Knop_locatie_Click()
            'Verwijzing voor actie "browsefolder"staat in Module 1
Dim strFolderName As String
            'Open het keuzescherm voor de backup folder
    strFolderName = BrowseFolder("Kies een locatie voor de backup")

    If Len(strFolderName) > 0 Then
            'Sla de folderverwijzing op in het veld
    Me.TxtPath.Value = strFolderName
    Else
            'Als er op Cancel wordt gedruk, geef dan bericht
    MsgBox "Het kiezen van een backup locatie is geannuleerd...."
    End If

End Sub

Ik zou dus graag willen dat de verwijzing blijft staan.

Is dit mogelijk, en wat moet er dan veranderd / aangepast worden.
 
Persoonlijk gebruik ik de code van access.mvps.org niet meer; die is ontwikkeld voor een oudere Access versie. Mijn motto: hou het simpel, en gebruik de functies met het minste werk. Maar de keus is uiteraard geheel aan jou ;)
Waarschijnlijk heb je het tekstveld in je formulier niet gekoppeld aan een tabelveld.
 
Beide codes gaan uit van Shell32.dll.
Heeft dus in feite niets van doen met de Access versie.
Bij de ene code heb je geen verwijzing nodig, bij de andere wel (VBA-venster, menu Extra-Verwijzingen).
 
Ik zei het misschien niet zorgvuldig genoeg... Op de site van access.mvps.org staat deze code al een aantal jaren. De code an sich is dan wel universeel (en inderdaad niet specifiek Access), maar Terry Kreft is een Access MVP. Dus een goede kans dat hij de code daadwerkelijk ten nutte van Access heeft geschreven.
En met een verwijzing naar de juiste bibliotheek blijft de code een behoorlijk stuk korter.
 
Persoonlijk gebruik ik de code van access.mvps.org niet meer; die is ontwikkeld voor een oudere Access versie. Mijn motto: hou het simpel, en gebruik de functies met het minste werk. Maar de keus is uiteraard geheel aan jou ;)
Waarschijnlijk heb je het tekstveld in je formulier niet gekoppeld aan een tabelveld.


Je hebt helemaal gelijk, ik had een tijdelijk veld gemaakt, om het e.ea uit te proberen....en natuurlijk was het hieraan gelinkt.
Bedankt (beide), voor de gegeven oplosing(en).....en in de discussie wat nu het beste is....meng ik mij liever niet, dit gaat ver boven mijn kennis.
Status zet ik op opgelost
 
Als je VBA procedures gaat gebruiken (zelf gemaakt of van internet geplukt) dan zul je op zijn minst moeten begrijpen wat er gebeurt, anders wordt het wel heel lastig om de procedure op de juiste manier te gebruiken en te onderhouden. Wat betreft de twee varianten die je zijn aangeboden:
Variant 1 (de code van access.mvps.org) maakt gebruik van zgn. Late Binding. Dat houdt in dat de code altijd in een database werkt, omdat alle benodigde elementen in de code zelf zitten. Je kunt de db dus probleemloos op een andere computer gebruiken. Bij Late binding kun je doorgaans de elementen ervan niet via Objectnamen aanspreken, maar alleen via de Waardegetallen.
Met de tweede variant (Early Binding) moet je een bibiliotheek activeren via <Extra>, <Verwijzingen>. Daarna kun je de objecten uit die bibliotheek gewoon bij naam gebruiken, door een punt te typen. Je typt dus objFolder. en ziet dan gelijk een lijst met beschikbare objecten en eigenschappen, zoals Item. Dit werkt dus op dezelfde manier als je Access objecten gebruikt. Nadeel: als je de db op een andere computer gebruikt waar de bibliotheek niet is geladen, dan werkt de code niet.
Procedures op basis van Early binding werken sneller als procedures met Late binding, omdat met Late binding alles ter plekke moet worden opgebouwd; Early binding haalt zijn objecten gewoon op.
Korotm: of je buiten een discussie wilt blijven of niet (er is wat mij betreft geen discussie, hooguit het aanreiken van verschillende opties), je zult een keuze moeten maken die voor jouw situatie het beste werkt. Daar moet je over nadenken, en die keuze zou uiteraard niet bepaald moeten worden door het eerste antwoord dat je krijgt.
 
octafish,

Hartelijk dank voor de extra uitleg.
Ik heb (meer geluk, dan wijsheid) voor de juiste oplossing gekozen, omdat deze DB op andere computers gebruikt gaat worden.

Gr,
Jack
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan