Avatar billede hnto Nybegynder
08. januar 2004 - 14:34 Der er 9 kommentarer og
1 løsning

VBA i access 2003 hurtigt svar ønskes

jeg har et script der skal kunne læse antallet af biblioteker fro filkopiering. Problemet er bare at der ikke tage alle underfoldere med i scriptgennemløbet.
Hvad er det der mangler i scriptet.

(NB har fået hjælp fra eksperten til denne del af scriptet)

Function kopierbilleder()
Dim db As Database
Dim rs As DAO.Recordset
Dim n As Long
Dim StartFolder As String
Dim Folder As String
Dim FolderNavn(1 To 1000) As String
Dim I As Integer
Dim FolderAntal As Integer



StartFolder = "d:\folder1\"
Folder = Dir(StartFolder, vbDirectory)
I = 0
Do While Folder <> ""
      If Folder <> "." And Folder <> ".." Then  ' Ignorer det overordnede bibliotek.
        If (GetAttr(StartFolder & Folder) And vbDirectory) = vbDirectory Then
            I = I + 1
            FolderNavn(I) = Folder
        End If
    End If
    Folder = Dir    ' Hent næste folder
Loop

FolderAntal = I
Avatar billede madschristensen Nybegynder
08. januar 2004 - 15:20 #1
Hvis du nu laver en function der tæller foldere:
Function Count_Folders(StrFolder as string) as Long
Count_Folders=0 'Skal returnere 0 hvis der ikke er andre mapper

Her laver du din dirfunction og kalder rekursivt hvis du møder endnu en mappe - der ved modtager du det samlede antal undermapper i undermapper

Count_Folders=I
End Function

Function kopierBilleder()
Dim antal as long
antal=Count_folders("d:\folder1\")

End Function
Avatar billede hnto Nybegynder
08. januar 2004 - 15:55 #2
de skal vel også registreres eller lign i hukommelsen da de skal bruges senere i scriptet for kopiering eller??

Her er resten /hele scriptet til orientering, da jeg ikke er klar over om der måske er udeladt noget i mon forklaring..

Function kopierbilleder()
Dim db As Database
Dim rs As DAO.Recordset
Dim n As Long
Dim StartFolder As String
Dim Folder As String
Dim FolderNavn(1 To 1000) As String
Dim I As Integer
Dim FolderAntal As Integer

StartFolder = "d:\folder1\"
Folder = Dir(StartFolder, vbDirectory)
I = 0
Do While Folder <> ""
      If Folder <> "." And Folder <> ".." Then  ' Ignorer det overordnede bibliotek.
        If (GetAttr(StartFolder & Folder) And vbDirectory) = vbDirectory Then
            I = I + 1
            FolderNavn(I) = Folder
        End If
    End If
    Folder = Dir    ' Hent næste folder
Loop

FolderAntal = I

Set db = CurrentDb
Set rs = db.OpenRecordset("billeder_kopieres", dbOpenSnapshot)
rs.MoveLast
For I = 1 To FolderAntal
    rs.MoveFirst
    For n = 1 To rs.RecordCount
        If Dir(StartFolder & FolderNavn(I) & "\" & rs![billednavn]) <> "" Then
            FileCopy StartFolder & FolderNavn(I) & "\" & rs![billednavn], "d:\dest\" & rs![billednavn]
            'FileCopy StartFolder & FolderNavn(I) & "\" & rs![billednavn], "\\Dkedbs01\Stibo$\Ventilationskatalog\Kopi_Billeder\" & rs![billednavn]
        End If
        rs.MoveNext
    Next n
Next I

rs.Close
Set rs = Nothing
db.Close
MsgBox "jeg er nu færdig med denne opgave... ;-)"
End Function
Avatar billede kabbak Professor
08. januar 2004 - 21:23 #3
Har lavet søgningen af underfoldere om til at bruge dir fra shell, som gemmer oplysningerne i en fil, som så genindlæses.
Jeg kører win XP og office 2000, så jeg håber at det kan bruges.

Function kopierbilleder()
Dim db As Database
Dim rs As DAO.Recordset
Dim n As Long
Dim folder As String
Dim FolderAntal As Integer
Dim I As Long, FolderNavn() As String
I = -1
Shell "cmd.exe /k dir d:\folder1\ /a:d /s /b > folder.txt", vbHide
For Pause = 1 To 50000000: Next ' holder pause, for at shell kan blive færdig
Open "folder.txt" For Input As #1
Do Until EOF(1)
I = I + 1
ReDim Preserve FolderNavn(I)
Input #1, FolderNavn(I)
Loop
  Close #1
FolderAntal = I
Set db = CurrentDb
Set rs = db.OpenRecordset("billeder_kopieres", dbOpenSnapshot)
rs.MoveLast
For I = 0 To FolderAntal
    rs.MoveFirst
    For n = 1 To rs.RecordCount
        If Dir(FolderNavn(I) & "\" & rs![billednavn]) <> "" Then
            FileCopy FolderNavn(I) & "\" & rs![billednavn], "d:\dest\" & rs![billednavn]
            'FileCopy FolderNavn(I) & "\" & rs![billednavn], "\\Dkedbs01\Stibo$\Ventilationskatalog\Kopi_Billeder\" & rs![billednavn]
        End If
        rs.MoveNext
    Next n
Next I

rs.Close
Set rs = Nothing
db.Close
MsgBox "jeg er nu færdig med denne opgave... ;-)"
End Function
Avatar billede kabbak Professor
01. februar 2004 - 01:15 #4
Hvordan går det. ?
Avatar billede hnto Nybegynder
01. februar 2004 - 19:40 #5
sorry... masser at gøre på jobbet...

smid et svar og du skal få point.

NB
Kunne du måske lige forklare hvad det er du gør i disse linier. gerne med en komment ud for hver ;-)

Dim I As Long, FolderNavn() As String
I = -1
Shell "cmd.exe /k dir d:\folder1\ /a:d /s /b > folder.txt", vbHide
For Pause = 1 To 50000000: Next ' holder pause, for at shell kan blive færdig
Open "folder.txt" For Input As #1
Do Until EOF(1)
I = I + 1
ReDim Preserve FolderNavn(I)
Input #1, FolderNavn(I)
Loop
  Close #1
FolderAntal = I


På denne måde er det ikke kun en læsning men også for mig et værktøj til at forstå handlingerne i scriptet til en anden gang.
Avatar billede hnto Nybegynder
01. februar 2004 - 19:42 #6
læsning = løsning
Avatar billede kabbak Professor
01. februar 2004 - 19:53 #7
Dim I As Long, FolderNavn() As String
I = -1 ' -1 fordi første skal være 0
' kalder dir i dos, beder kun om mapper, også i undermapper
  og skriver det til en fil folder.txt _
vbHide, fordi jeg ikke vil se dosvinduet.
Shell "cmd.exe /k dir d:\folder1\ /a:d /s /b > folder.txt", vbHide
For Pause = 1 To 50000000: Next ' holder pause, for at shell kan blive færdig _
inden koden fortsætter.
Open "folder.txt" For Input As #1' henter data ind fra folder.txt
Do Until EOF(1)' læs indtil EOF = end of file på #1
I = I + 1 ' I bliver + med 1 så den starter med 0 og vokser
ReDim Preserve FolderNavn(I)' da jeg ikke ved hvor mange mapper der _
er skrevet i filen, redimmer jeg til 1 større  ved hver linie.
Input #1, FolderNavn(I)' Det hele er nu i variablen FolderNavn(I)
Loop
  Close #1
FolderAntal = I ' det antal mapper der er fundet
Avatar billede kabbak Professor
01. februar 2004 - 19:55 #8
skulle være et svar.
denne linie

For Pause = 1 To 50000000: Next ' holder pause, for at shell kan blive færdig _
inden koden fortsætter.

Der kan du justere tallet efter To, men hvis dos ikke er færdig, kan du få fejl, eller læse gamle data ind.
Avatar billede hnto Nybegynder
01. februar 2004 - 20:26 #9
jeg takker mange gange ;-)
Avatar billede kabbak Professor
01. februar 2004 - 20:28 #10
tak for point ;-))
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
Kategori
Kurser inden for grundlæggende programmering

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