Avatar billede stik3 Praktikant
01. januar 2018 - 11:57 Der er 19 kommentarer

Opret mappe med undermapper

Hej alle
Jeg har brug for hjælp til følgende:
Jeg har i dag et script der opretter en mappe med dette navn: Me.Sagsnummer & Space(2) & Adresse & Space(2) & Postnummer & Space(2) & By fra formularen hvor scriptet kaldes, samtidig bliver der tjekket den ikke findes i forvejen ell. den oprettes og derfor kommer med en af disse msg. "Mappen er nu oprettet" ell. "Mappen "'Navn på mappen'" findes i forvejen"
Så vidt så godt, men nu vil jeg gerne have koden til at oprette undermapper, en 5-6 stykker, med faste navne, for at opbygge en ordentlig mappestruktur og der kommer jeg til kort, så håber der en der kan hjælpe.
Avatar billede terry Ekspert
01. januar 2018 - 13:56 #1
Can you show the code which you use to create the folder?

How do you decide on the names of the sub folders?

Og Godt Nytår :-)
Avatar billede stik3 Praktikant
01. januar 2018 - 14:56 #2
Hej Terry
Også godt nytår til dig :)
Undermapperne kunne hedde: Billeder, Tablet, Arkiv etc. etc.

Koden ser sådan ud:
Private Sub Opret_sagsmappe_DblClick(Cancel As Integer)
strStartFilePath = "Z:\Dagligt\Nye sager Nedrivning\"
If strEndFilePath = Dir(strStartFilePath & Me.Sagsnummer & "*", vbDirectory) Then

Const strParent = "Z:\Dagligt\Nye sager Nedrivning\"
Dim strYearEntered As String
Dim strEntryNumber As String
Dim strFolder As String
Dim FSO As Object
strYearEntered = Me.Sagsnummer & Space(2) & Adresse & Space(2) & Postnummer & Space(2) & By

strFolder = strParent & strYearEntered
If Dir(strFolder, vbDirectory) = "" Then
MkDir strFolder

strFolder = strFolder & "\" & strEntryNumber
If Dir(strFolder, vbDirectory) = "*" Then MkDir strFolder
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
T0 = Timer
Do
    Delay = Timer - T0
Loop Until Delay = 1
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

MsgBox "Mappen:  " & strYearEntered & "  ,er nu oprettet."
Else:
MsgBox "Mappen eksisterer i forvejen."
Exit Sub
End If

  strStartFilePath = "Z:\Dagligt\Nye sager Nedrivning\"
    strEndFilePath = Dir(strStartFilePath & Me.Sagsnummer & "*", vbDirectory)

    Shell "explorer.exe " & strFolder, vbNormalFocus
      Else
      strYearEntered = (Me.Sagsnummer & Space(2) & Adresse & Space(2) & Postnummer & Space(2) & By)
      MsgBox "OBS!  MAPPEN TILHØRENDE:  " & strYearEntered & "  FINDES I FORVEJEN!"
         
End If
End Sub
Avatar billede Dan Elgaard Ekspert
01. januar 2018 - 15:23 #3
Du behøver vel ikke, at kontrollere, hvorvidt mappen findes i forvejen?
Findes mappen i forvejen, bliver den vel bare ikke oprettet...
...der bliver jo ikke slettet eller ændret noget, blot fordi mappen findes i forvejen, og man forsøger, at oprette mappen.

Med hensyn til at lave mappe strukturen, så er du 1000 gange bedre hjulpet, hvis du benytter API kald til windows funktionen - der med slipper du for besævret med at oprette alle undermapperne - det hele klares på en gang i en eneste kodelinje:
http://www.EXCELGAARD.dk/Bib/API/MakeDIRs/

Og, denne funktion er forøvrigt også ligeglad med, om mappen findes i forvejen - hvis mappen findes i forvejen, så springes den blot over :-)
Avatar billede terry Ekspert
01. januar 2018 - 15:56 #4
Unless you want to inform the user that folder does/does not exist then I would also go for a solution using API MakeDir.. which Dan explains

If you just want a quick solution, and the sub folders (Billeder, Tablet, Arkiv etc. etc.) are always the same then you could just add a mkdir for each sub folder

in this If Then

If Dir(strFolder, vbDirectory) = "*" Then MkDir strFolder


This assumes that because the main folder needs to be created then the sub folders need creating too ;-)

If the main folder exists it doesnt check that the sub folders exist or not!


Also assuming I have understood the code :-)
Avatar billede stik3 Praktikant
01. januar 2018 - 16:38 #5
Jeg kan godt lide Dans ide, men kan bare ikke få koden til at virke i Access...
Avatar billede Dan Elgaard Ekspert
01. januar 2018 - 16:46 #6
Hvad kommer der af fejl?
Hvad sker der?

Du har set, at API funktionen skal ligge i erklæringsområdet i toppen af modulet,ikke?
Altså uden for selve makroen...
Avatar billede Dan Elgaard Ekspert
01. januar 2018 - 16:47 #7
Koden er ligeglad med, om det er Access, Excel, Word eller andet, da koden i virkeligheden er en Windows funktion, og ikke en VBA funktion...
Avatar billede stik3 Praktikant
01. januar 2018 - 17:24 #8
Hej Dan
Jeg har oprettet em Modul:API_MakeDIRs
Option Compare Database
#If VBA7 And Win64 Then
      Private Declare PtrSafe Function MakeDIRs Lib "ImageHLP.DLL" Alias "MakeSureDirectoryPathExists" (ByVal lpPath As String) As Long
#Else
      Private Declare Function MakeDIRs Lib "ImageHLP.DLL" Alias "MakeSureDirectoryPathExists" (ByVal lpPath As String) As Long
#End If

Og kalder koden i VBA:
Private Sub Kommandoknap242_Click(MakeDIRs)
' * ' Initialize
      Const Path_To_Make As String = "D:\Dagligt\Nye sager Nedrivning\Extra\"
' * ' Make full path
      MakeDIRs Path_To_Make
End Sub
Er desværre en novice på det område, så kan ikke helt gennemskue processen...

Option Explicit
Avatar billede Dan Elgaard Ekspert
01. januar 2018 - 18:19 #9
Du kan vel ikke have din 'Option Explicit' EFTER dine makroer?!?
Den hører da til i erklæringsområdet
(Hvilket jeg osse har vist på min hjemmeside)

Hvad får du af fejlmedelelse?
Avatar billede stik3 Praktikant
01. januar 2018 - 18:58 #10
Kender ikke begrebet "erklæringsområdet"
Avatar billede finb Ekspert
02. januar 2018 - 09:15 #11
Hvorfor vil du egentlig have mapper/undermapper,
du har jo alt i Access ?
Er det som back-up ?
Avatar billede Dan Elgaard Ekspert
02. januar 2018 - 09:32 #12
Erklæringsområdet er toppen af modulet FØR alle dine makroer.

prøv, at kigge kode eksemplet, og se, hvordan 'Option Explicit' står før nogle af makroerne.

Hvad får du af fejl meddelelse?
Avatar billede terry Ekspert
02. januar 2018 - 10:32 #13
The module should look like this if you are executing function from a form. Notice I have changed Private to Public.

Option Compare Database
Option Explicit

#If VBA7 And Win64 Then
      Public Declare PtrSafe Function MakeDIRs Lib "ImageHLP.DLL" Alias "MakeSureDirectoryPathExists" (ByVal lpPath As String) As Long
#Else
      Public Declare Function MakeDIRs Lib "ImageHLP.DLL" Alias "MakeSureDirectoryPathExists" (ByVal lpPath As String) As Long
     
#End If

The Click event should start like this (WITHOUT MakeDIRsI
Private Sub Kommandoknap242_Click()
Avatar billede stik3 Praktikant
02. januar 2018 - 22:04 #14
Til finb: Jeg har rigtig mange dokumenter og billeder der ligger under hver enkelt sag, så access vil hurtig nå max grænse, og til Terry og Dan, har jeg foreløbig brugt Terrys MkDir for hver enkelt undermappe.
Og så lige, hvordan er det man tildeler point (flovt) ;)
Avatar billede Dan Elgaard Ekspert
03. januar 2018 - 07:53 #15
Terry's kode er blot en specificerering af, hvad jeg hele tiden har skrevet: 'Option Explicit' skal ligge i toppen af modulet :-)

Derudover bør 'MakeDIR' virke...
Avatar billede terry Ekspert
03. januar 2018 - 09:28 #16
The new eksperten isn't based on points. You juts accept one or more comments as the solution to your question.

Can you still not get it to work?
you could send me an example of your dB and I'll try and find problem
ekspertenATsanthell.dk
AT = @
Avatar billede stik3 Praktikant
03. januar 2018 - 09:56 #17
Okay, også et stykke tid siden jeg har været inde på forummet.
Men dejligt med nogle "skrapsakker" der vil hjælpe.
Og jo, bruger den gamle kode, og så opretter med MkDir for hver undermappe, nu skal jeg se om jeg kan få oprettet undermapper til nogle af undermapperne.
Avatar billede stik3 Praktikant
04. januar 2018 - 19:36 #18
Dan's metode virker fint, ingen fejl på det, udfordringen opstår når man skal oprette hovedmappen, som jo navngives efter data fra den formular den kaldes fra og bruger strengen:  Me.Sagsnummer & Space(2) & Adresse & Space(2) & Postnummer & Space(2) & By f.eks. 101-0101  Paradisæblevej  11  4711  Andeby
Og de faste undermapper oprettes så under denne; de mapper kunne være:
Oplæg
Billeder
Ler
og under disse andre under/under mapper
Avatar billede Dan Elgaard Ekspert
05. januar 2018 - 07:28 #19
Kan du ikke blot tildele hovedmappen til en variabel, og så dernæst oprette hovedmapperne?

Noget i denne stil:

Dim HovedMappe As String
HovedMappe = Me.Sagsnummer & Space(2) & Adresse & Space(2) & Postnummer & Space(2)

MakeDir HovedMappe & "/Oplæg/Undermappe/"
MakeDir HovedMappe & "/Billeder/UnderMapper"
MakeDir HovedMappe & "/Ler/Undermapper"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester