08. januar 2004 - 14:34Der 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
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\")
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
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
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.
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
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.