Specifieke folder openen in explorer via VBA

Status
Niet open voor verdere reacties.

jarsky

Gebruiker
Lid geworden
19 feb 2009
Berichten
36
Hallo,

Ik ben op zoek naar een mogelijkheid om vanuit een access database, windows verkenner (explorer) te open, maar dan specifiek naar een bepaalde map die een deel van een waarde bevat die ook als criteria wordt opgegeven vanuit access. bijvoorbeeld:
Ergens op een schijf (vast gegeven) staat een folder genaamd "klantnaam" en daarin allemaal subfolders, waarbij 1 van de folders een deel van de naam P0001 bevat, Dit is wel een uniek nummer.
De waarde P0001 staat ook geregistreed in de database. Nu wil ik met een simpele dubbelklik dat de waarde van het record, dus P0001 er voor zorgdraagt dat Explorer wordt geopend in de folder die deze waarde bevat.

dus de folder C:\projecten\klantnaam\klantnaamP0001 moet worden geopend omdat in dit geval P0001 voorkomt in de foldernaam en dit ook de waarde is van de actieve record.
Het vetgedrukte gedeelte is een vast gegeven.

ik hoop dat ik duidelijk genoeg ben en hoop op een positieve reactie
ik ben zelf al met getfolder en filescriptingobject bezig geweest maar kom er niet uit.

Vast bedankt
 
Dit heb ik zelf ook al eens gevraagd en toen kwam OctaFish met de volgende oplossing:

Ik heb een knop die cmdOpenFolder heet en op de onClick heb ik deze code geplaatst:
Code:
Private Sub cmdOpenFolder_Click()
    ShellExecute Me.hwnd, "Open", CurrentProject.Path & "\Facturen\", vbNullString, CurrentProject.Path & "\Facturen\", SW_SHOWMAXIMIZED
End Sub

Deze code bovenin het VBA blad:
Code:
Option Compare Database
Option Explicit
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     As Long = 1
Private Const SW_SHOWMINIMIZED  As Long = 2
Private Const SW_SHOWMAXIMIZED  As Long = 3

Hoop dat je hier wat aan hebt!
 
Laatst bewerkt:
Beste rolfohtar,

Voor een deel werkt dit prima en zover was ik ook ongeveer gekomen, zij het op een iets andere manier.
Wat is nu echter het probleem:

Ik werk met unieke projectnummers waarbij de omschrijving die erbij hoort variabel is.
Dus een foldernaam heet altijd "Projectnummer" en "omschrijving" Dus bijvoorbeeld "P0001 - Dec" Ik heb in de database alleen het projectnummer, dus P0001 tot mijn beschikking.
De vraag is dus hoe kan ik met een deel van een foldernaam toch de juiste folder openen. In dit geval heb ik in de database P0001 als waarde en hoe krijg ik nu de folder open waarbij een deel van de foldernaam de P0001 bevat.

Capture.JPG
 
Dit gaat mij nu ook te ver. Dan toch even iemand anders met meer verstand ervan afwachten.

Misschien iets toevoegen aan de path? Zoals Me.Projectnummer. Ik weet niet of dit werkt hoor.

Code:
Private Sub cmdOpenFolder_Click()
    ShellExecute Me.hwnd, "Open", CurrentProject.Path & "\projecten\" & Me.Projectnummer, vbNullString, CurrentProject.Path & "\projecten\" & Me.Projectnummer, SW_SHOWMAXIMIZED
End Sub

Verder kan ik je helaas hier niet mee helpen. Succes!
 
Rolfohtar,

bedankt in ieder geval voor je reactie, en ik wacht even verder af.
 
Je zegt dat je het projectnummer in je tabel apart opslaat (lijkt mij ook logisch). In je plaatje zit het projectnummer in het veld Klantnaam, en dus ook een deel van de omschrijving. Als ik het goed begrijp, wil je dus uit de 'Klantnaam' "Project 2001 Jan" het stuk "P0001 Jan" hebben? En is dat dan ook een mapnaam? Heb je daarbij dan ook een map "P0001 Jan"? Dus dan heb je een map "D:\P0001\P0001 Jan" en een map "D:\P0001\P0001 Feb"? Of ligt het anders? En uit hoeveel 'woorden' kan een klantnaam bestaan? Je hebt er nu bijvoorbeeld 3 in "Project P0001 Jan".
 
Michel,

op het werk hebben wij een centrale opslag (netwerkschijf) van alle projectdocumenten in een bepaalde Folderstructuur Dit is bij elkaar een behoorlijke aantal mappen.
De folderstructuur is zeg maar \\Projecten\Regio-1\klantnaam\xxxxxx (is Projectnummer) - uitbreidingen\. In de map klantnaam kunnen heel veel mappen staan die dus xxxxxxx (is projectnummer) - heten, waarbij na het - van alles kan staan. het projectnummer is wel een uniek nummer, dus komt in in de map \Klantnaaam\ maar 1 keer voor.
In de database heb ik de klantnaam en het projectnummer voorhanden, maar dus niet de beschrijving na het - teken. De clou is nu dat ik vanuit de database met een klik op een knop wil dat de folder wordt geopend die behoort bij de klantnaam en het projectnummer. De voorgaande folderstructuur kan gewoon hard worden neergezet. omdat dit een vast gegeven is. Het probleem zit hem in de variabele naam van de laatste map.

De code in het bericht van Rolfothar werkt uitstekend maardan moet de laatste mapnaam excact overeen komen met de waarde in mijn database. En dat is dus niet zo

Code:
Option Compare Database
Option Explicit
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     As Long = 1
Private Const SW_SHOWMINIMIZED  As Long = 2
Private Const SW_SHOWMAXIMIZED  As Long = 3


Private Sub test_DblClick(Cancel As Integer)

 ShellExecute Me.hwnd, "Open", CurrentProject.Path & "\Klantnaam\" & Me.test, vbNullString, CurrentProject.Path & " \ Klantnaam \" & Me.test, SW_SHOWMAXIMIZED
'de Me.test bevat dus een stukje naam van de uiteindelijke mapnaam op de netwerkschijf.
End Sub
 
Laatst bewerkt:
Je geeft nog niet helemaal antwoord op mijn vragen. Met name de laatste is belangrijk voor de oplossing.
 
Euhh, ik begrijp je niet helemaal meer, denk ik:confused:
Wat in het plaatje staat is een deel van de folderstructuur in explorer en niet in de database.
In de databaase heb ik in een tabel klantnamen staan en een tabel projectnummers. Deze zijn aan elkaar gekoppeld. Vanuit een Formulier heb ik de beschikking over deze 2 waardes.

De folderstructuur zoals omschreven is redelijk vast. dus in explorer zie je dus bijvoorbeeld "C:\documenten\klantnaam\xxxxxxx - omschrijving" waarbij de xxxxxx een projectnummer is. Die xxxxxxx heb ik dus ook in de database staan en de klantnaam ook. De klantnaam in de folderstructuur kan uit meerdere woorden bestaan bijvoorbeeld "Pietje Puk B.V."
De klantnaam in de folderstructuur is altijd gelijk aan de klantnaam in de database, dus deze is hard. De naam van de uiteindelijk te bereiken map met het projectnummer in de mapnaam is altijd opgebouwd als XXX-XXXXXXX-XXXX - willekeurige omschrijving, dus bijvoorbeeld "ZNL-P005555-2000 - dit is mijn klant"
Is dit wat je bedoeld?
 
Laatst bewerkt:
Niet helemaal; je stelt de mapnaam op een bepaalde manier samen. Ik wil weten hoe je die maakt. En, vooral dat, uit hoeveel woorden hij bestaat, en wat de structuur is.
 
Ik had net het bericht aangepast voordat jou bericht in het scherm kwam. hoop dat dit is wat je bedoeld
 
Misschien is het handiger als ik eerst uitleg wat het probleem is, en hoe dat de oplossing beïnvloedt. In één van je eerdere berichten kwam je met dit voorbeeld: "P0001 - Dec" dat werd onderbouwd met een plaatje waar ook nog het woord "Project" is toegevoegd aan de naam. Nu kom je met: <XXX-XXXXXXX-XXXX - willekeurige omschrijving> als sjabloon met "ZNL-P005555-2000 - dit is mijn klant" als voorbeeld. Als we die laatste tekst als uitgangspunt nemen, dan zou ik deze code via SPLIT aan een matrix variabele willen toewijzen met - als scheidingsteken. In dit voorbeeld krijg je dan een variabele tmp(#) met de volgende gegevens:
tmp(0) = "ZNL"
tmp(1) = "P005555"
"tmp(2) = "2000 "
"tmp(3) = " dit is mijn klant"
Hiervan zou je dan tmp(2) en tmp(3) willen samenvoegen, want dat is dan volgens mij de naam van de submap die je wilt openen.
Pak ik je eerste voorbeelden erbij (die uit het plaatje) dan gaat dat niet; in die mappen zit geen -, maar heb je wel spaties. Dus kun je wel Split gebruiken, maar moet je dat doen op basis van spaties. Alleen: als je in je omschrijving meerdere woorden hebt, krijg je ook meerdere spaties. Hopelijk zie je nu waar ik naar toe wil: hoe gestructureerd is de naam, en is het mogelijk om op basis van die structuur de samengestelde naam te splitsen in variabelen, die je dan op basis van die structuur weer kunt samenvoegen tot een naam die de exacte mapnaam genereert. Kan dat, dan heb je een oplossing; kan dat niet, dan is er een probleem.
 
Michel,

ik begrijp je verhaal. Echter ging ik er vanuit dat dit met een deel van de naam ook kon. Eigenlijk ook wat je in een zoek functie kan doen. Als je even het plaatje vergeet dan is is de opbouw zo.

De submap begint altijd met een projectnummer "ZNL-P000000-0000 - ". De nummers zijn fictief maar de opbouw is altijd hetzelfde. na het projectnummer komt dus de omschrijving. De omschrijving heeft geen structuur en is elke keer anders het kan kort zijn maar ook lang met meerdere leestekens etc., . Het projectnummer is dus altijd 20 karakters lang waarbij het laatste streepje ook altijd aanwezig is.

Ik hoop dat je dit wilde weten.
 
Dat komt inderdaad overeen met wat ik op basis van je laatste code al vermoedde. Dat betekent dus dat je inderdaad met Split de tekst kunt opbreken, en de laatste variabele (het hoogste matrixnummer) kunt gebruiken om de map op te zoeken. Eventueel kun je, als het alleen om het laatste deel gaat, ook nog de functie InstrRev gebruiken om naar het laatste - teken te zoeken. En op basis daarvan met Left het laatste deel van de string uit te lezen.
Rest nog de code waarmee je de string uitleest; die heb ik nog niet gezien.
 
Michel,

oke dan zitten we op 1 lijn. Alleen breekt bij mij even het lijntje bij de functie Split.
Ik had de code zoals boven getoont als leidraad genomen, maar ik weet dus even niet hoe dit nu zo aan te passen dat het gaat werkenen of dit wel de juiste weg is. Een hint zou dus wat dat betreft welkom zijn.
 
Die hint zoek ik ook: hoe bepaal je nu die string waaruit je de mapnaam wilt halen?
 
Michel,

Volgens mij heb ik een oplossing gevonden. Misschien wel niet helemaal volgens het boekje en wat grof maar het werkt wel.

in delen zoals al boven een keer getoond met jou stukje:

Code:
Option Compare Database
Option Explicit
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     As Long = 1
Private Const SW_SHOWMINIMIZED  As Long = 2
Private Const SW_SHOWMAXIMIZED  As Long = 3

Het 2e stukje ziet er zo uit;

Code:
Private Sub Open_Folder_Click()

    Dim fs, f, f1, fc, sM, sL, myPath
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder("C:\Users\xxxxxxxxxx\Documents\Klanten\" & Me.Klantnaam)
    Set fc = f.SubFolders
    
    For Each f1 In fc

        sL = Left(f1.Name, 16)
        sM = Mid(f1.Name, 17)
        
            If sL = Me.Projectnummer Then
                myPath = "C:\Users\xxxxxxxx\Documents\Klanten\" & Me.Klantnaam & "\" & Me.Projectnummer & sM
                ShellExecute Me.hwnd, "Open", myPath, vbNullString, myPath, SW_SHOWMAXIMIZED
                Exit Sub
                                
            End If
    Next
    If sL <> Me.Projectnummer Then MsgBox "Map bestaat niet"

End Sub

Ik heb als uitgangspunt het projectnummer gekozen wat altijd 16 karakters heeft "sL in code"
Vervolgens kijk ik met "sM in de code" naar wat er achterstaat vanaf karakter 17
Met "sL" heb ik dan het projectnummer geisoleerd wat overeen moet komen met het projectnummer uit de database "Me.Projectnummer"
Als die vergelijking waar is dan is de rest kinderspel.

Als de map niet bestaat krijg ik keurig een melding

Graag zie ik jou jou mening over bovenstaand, en in ieder geval vast bedankt voor het op weg helpen.:thumb:
 
Laatst bewerkt:
Behalve dat je de variabelen heel slecht declareert (niet namelijk) kun je met het DIR commando controleren of een bestand of map bestaat of niet. En op basis daarvan actie ondernemen. Met DIR lees je een map of bestand in op basis van een startwaarde. Bijvoorbeeld Temp = DIR("D:\HelpMij\*.mdb") om een database te zoeken in de map D:\HelpMij. DIR zet het eerste bestand dat gevonden wordt in de variabele Temp. Levert het commando niks op, dan is er dus geen database en blijft Temp leeg. En dat is de check die je dus doet. Zijn er meerdere bestanden, dan geeft DIR in eerste instantie met deze opdracht het eerste bestand terug. Geef je daarna nog een keer het commando DIR (zonder parameters) dan krijg je het volgende bestand te zien. Met een lus DO WHILE Temp <>"" kun je dus alle mappen of bestanden doorlopen op zoek naar het gewenste.
Kijk als je dit niet snapt in de Help en zoek op DIR, dan krijg je wat meer informatie. O.a. ook over hoe je op mappen zoekt i.p.v. bestanden.
 
Opggelost middels onderstaande code:
1e code:
Code:
Option Compare Database
Option Explicit
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     As Long = 1
Private Const SW_SHOWMINIMIZED  As Long = 2
Private Const SW_SHOWMAXIMIZED  As Long = 3

2e code:
Code:
Private Sub Knop12_Click()
Dim myPath, MyName

myPath = "\\JARSKY2\MyShare\Mijn Documenten\Klanten\" & Me.Klantnaam & "\"
MyName = Dir(myPath, vbDirectory)

Do While MyName <> ""
    If MyName <> "." And MyName <> ".." Then
        If (GetAttr(myPath & MyName) And vbDirectory) = vbDirectory And Left(MyName, 16) = Me.Projectnummer Then
            ShellExecute Me.hwnd, "Open", myPath & MyName, vbNullString, myPath, SW_SHOWMAXIMIZED
        End If
    End If
    
    MyName = Dir
Loop

End Sub

mvgr Jan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan