Directory kiezen met BrowseForFolder en submapnaam

Status
Niet open voor verdere reacties.

vibor

Gebruiker
Lid geworden
25 mrt 2016
Berichten
45
Hoi
Genoeg geklooid ;) ik kom er niet uit en vraag ik dus maar weer eens om hulp.

Ik wil gegevens uit een tekst bestand met INI opmaak uitlezen op basis van een op te geven projectnummer en dit in de velden van een beveiligd formulier plaatsen.
De gebruiker kan daarna de gegevens aanpassen en verder aanvullen. Hoeft niet meer terug in de INI.
Gebruikers beginnen met dit bestand als DOT. Scheelt werk en fouten als men bij de start van het document alvast bekende gegevens kunnen opvragen.

Ik heb een formulier wat perfect werkt, maar de gebruiker moet dan exact het juist project nummer opgeven. Daar wil ik een nu een keuze uit een directory voor maken.

De directory kiezen via Function BrowseForFolder heb ik voor elkaar. Maar hoe kan ik de folder naam als STRING opslaan om deze weer te gebruiken bij het uitlezen van het INI bestand? Bij alle wat ik probeer komt de directorynaam van het Word document naar voren en niet van de gekozen map.

Code:
Private Sub CommandButton1_Click()

' Inlezen van klantgegevens

Dim projectnummer As String
Dim bedrijfsnaam As String
Dim bedrijfsadres As String
Dim bedrijfsplaats As String
Dim Ret As String
Dim pjnr As String


    '~~> Specify your start folder here
  Ret = BrowseForFolder("D:\Projecten")
    
    
    'HIER MOET EEN CODE KOMEN OM HET PROJECTNUMMER UIT DE GEKOZEN DIRECTORY TE KIEZEN en als string 'pjnr'op te slaan
     
    
    projectnummer = System.PrivateProfileString("D:\Projecten\" & pjnr & "\AA" & pjnr & ".INI", "PROJECT", "projectnummer")
    ActiveDocument.FormFields("bNummer").Result = projectnummer

    bedrijfsnaam = System.PrivateProfileString("D:\Projecten\" & pjnr & "\AA" & pjnr & ".kg", "PROJECT", "naam")
    ActiveDocument.FormFields("bNaam").Result = bedrijfsnaam

    bedrijfsadres = System.PrivateProfileString("D:\Projecten\" & pjnr & "\AA" & pjnr & ".kg", "PROJECT", "adres")
    ActiveDocument.FormFields("bAdres").Result = bedrijfsadres

    bedrijfsplaats = System.PrivateProfileString("D:\Projecten\" & pjnr & "\AA" & pjnr & ".kg", "PROJECT", "plaats")
    ActiveDocument.FormFields("bPlaats").Result = bedrijfsplaats

    End Sub

Function BrowseForFolder(Optional OpenAt As Variant) As Variant

'Function BrowseForFolder(Optional OpenAt As Variant) As Variant
     'Function purpose:  To Browser for a user selected folder.
     'If the "OpenAt" path is provided, open the browser at that directory
     'NOTE:  If invalid, it will open at the Desktop level

    Dim ShellApp As Object

     'Create a file browser window at the default folder
    Set ShellApp = CreateObject("Shell.Application"). _
    BrowseForFolder(0, "Kies de gewenste Pebbles-map", 0, OpenAt)

     'Set the folder to that selected.  (On error in case cancelled)
    On Error Resume Next
    BrowseForFolder = ShellApp.self.Path
    On Error GoTo 0

     'Destroy the Shell Application
    Set ShellApp = Nothing

     'Check for invalid or non-entries and send to the Invalid error
     'handler if found
     'Valid selections can begin L: (where L is a letter) or
     '\\ (as in \\servername\sharename.  All others are invalid
    Select Case Mid(BrowseForFolder, 2, 1)
    Case Is = ":"
        If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid
    Case Is = "\"
        If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid
    Case Else
        GoTo Invalid
    End Select


Invalid:
     'If it was determined that the selection was invalid, set to False
    BrowseForFolder = False



End Function

De mappenopbouw is vast en ziet er zo uit:
Projecten.png

In de bijlage het testbestandje.
Wie heeft een oplossing?
B.v.d.
Vibor
 

Bijlagen

Als je geen aparte folders maakt voor projektnummers (wat slim is) , maar alle ini-bestanden in de map 'projekten' zet.

Code:
Sub M_snb()
  with application.filedialog(3)
     .initialfilename= "D:\Projecten\*.INI"
     If .Show Then c00 = CreateObject("scripting.filesystemobject").opentextfile(.SelectedItems(1)).readall
  end with
end sub
 
Laatst bewerkt:
Hoi snb, bedankt voor je antwoord.
Hoe slim dat ook lijkt, maar ik ben helaas een klein schakeltje in een groter geheel. De mappenstructuur is een gegeven waar ik mee moet dealen. Andere applicaties werken ook met die gegevens. De INI is slechts 1 filetje in die map waar doorgaans 10 tallen bestanden in zitten. Dus helaas gaat dat hem niet worden.
De structuur is gelukkig bij alle gebruikers hetzelfde.

Ik wil dus echt de map kunnen kiezen en de naam daarvan kunnen gebruiken om de naam van de INI file te kunnen opbouwen.

Ik hoop dat iemand raad weet hoe ik een submap naam als bv string kan opslaan.

Grt. Vibor
 
Laatst bewerkt:
Code:
Sub M_snb()
  With Application.FileDialog(4)
    .InitialFileName = "D:\Projekten\"
    If .Show Then c00 = CreateObject("scripting.filesystemobject").opentextfile(.SelectedItems(1) & "\AA" & Replace(.SelectedItems(1), "D:\Projekten\", "") & ".INI").readall
  End With
   
  MsgBox c00
End Sub
 
Laatst bewerkt:
Hoi snb,
Helaas werkt dit niet.
Strat wel in de juiste directory (nadat ik de k in een c had aangepast).
Daarna krijg ik de melding:
Ongeldige bestandsnaam of ongeldig bestandsnummer.
 
Laatst bewerkt:
De directorynaam moet je op 2 plaatsen aanpassen.
En debuggen laten wij graag aan vragenstellers over uit educatief oogpunt.
 
Leer momenten zijn zeker welkom.
Ik ben aan het puzzelen gegaan en een paar kleine dingetjes aangepast:
Code:
   With Application.FileDialog(4)
    .InitialFileName = "D:\Projecten\"
    If .Show Then c00 = CreateObject("scripting.filesystemobject").opentextfile(.SelectedItems(1) & "\AA_" & Replace(.SelectedItems(1), "D:\Projecten\", "") & ".INI").readall
    End With
   
  MsgBox c00

In de mesagebox staat nu de gehele inhoud van de .INI file ik wil echter enkel de filename zodat ik die uit kan lezen met:
Code:
   With Application.FileDialog(4)
    .InitialFileName = "D:\Projecten\"
    If .Show Then c00 = CreateObject("scripting.filesystemobject").opentextfile(.SelectedItems(1) & "\AA_" & Replace(.SelectedItems(1), "D:\Projecten\", "") & ".INI").readall
    End With
   
  MsgBox c00

    
    projectnummer = System.PrivateProfileString(c00, "PROJECT", "projectnummer")
    ActiveDocument.FormFields("bNummer").Result = projectnummer

    bedrijfsnaam = System.PrivateProfileString(c00, "PROJECT", "naam")
    ActiveDocument.FormFields("bNaam").Result = bedrijfsnaam

Om dat aan te passen moet ik iets met Property moeten doen, maar voor 'OpenTekstFile' vind ik geen passende Property voor 'ReadAll'.
Dan denk ik ik doen het ipv 'OpenTekstFile' met de methode 'OpenAsTexstStream' maar krijg ik ook niet werkend.

Nog wat gezocht, toen kwam ik de filefolderpicker tegen. Daar de onderstaand code mee opgebouwd en die werkt. Valt dit nu onder het kopje: er zijn meerdere wegen die naar Rome leiden, of is er nog een functioneel verschil in de methoden?:

Code:
Private Sub CommandButton1_Click()

' Inlezen van klantgegevens

Dim projectnummer As String
Dim bedrijfsnaam As String
Dim bedrijfsadres As String
Dim bedrijfsplaats As String
Dim subDir As String
Dim sFolder As String

    ' Open the select folder prompt
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Kies de juiste Project map"
        .ButtonName = "Ok, pak deze map"
        .InitialFileName = "D:\Projecten"
        
        If .Show = -1 Then ' if OK is pressed
            sFolder = .SelectedItems(1)
        End If
    End With
    
    If sFolder <> "" Then ' if a file was chosen
         subDir = Dir(sFolder, vbDirectory)
    End If
    
   
    projectnummer = System.PrivateProfileString("D:\Projecten\" & subDir & "\AA_" & subDir & ".INI", "PROJECT", "projectnummer")
    ActiveDocument.FormFields("bProject").Result = projectnummer

    bedrijfsnaam = System.PrivateProfileString("D:\Projecten\" & subDir & "\AA_" & subDir & ".INI", "PROJECT", "naam")
    ActiveDocument.FormFields("bNaam").Result = bedrijfsnaam

    bedrijfsadres = System.PrivateProfileString("D:\Projecten\" & subDir & "\AA_" & subDir & ".INI", "PROJECT", "adres")
    ActiveDocument.FormFields("bAdres").Result = bedrijfsadres

    bedrijfsplaats = System.PrivateProfileString("D:\Projecten\" & subDir & "\AA_" & subDir & ".INI", "PROJECT", "plaats")
    ActiveDocument.FormFields("bPlaats").Result = bedrijfsplaats

End Sub

In ieder geval bedankt voor de hulp snb. Heb weer veel geleerd.
Fijne feestdagen
Grt. ViBoR
 
Wat is de bedoeling in het Worddocument ?
 
Oh sorry als dat niet duidelijk was. Dit is een beveiligd formulier waar standaard gegevens (oa n.a.w.) nu met de hand worden ingevuld. Daarnaast staan er veel andere vragen op die wel handmatig ingevuld moet worden.
Doordat de VBA code het formulierveld invult wordt, kan de gebruiker dit weer overschrijven als de gegevens in het systeem niet juist zijn.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan