08. november 2003 - 10:47Der er
8 kommentarer og 2 løsninger
Starte excel macro hver gang der kommer en ny fil i in-folder
Jeg har en in-folder hvor der kommer en del data filer i txt format. Dataerne er EAN13 koder. En kode på hver linie. Koderne kan være flere ens, men også forskellige. Dem skal jeg opsamle i en excel fil. Et fil for hver txt fil. I excel skal der laves en optælling af ens EAN koder, indsættes en dato, formatere celler til nummer (heltal). Excel filen skal gemmes i en out-folder. Den oprindelige txt-fil i in-folderen skal slettes. Jeg kunne godt tænke mig et script der kører i baggrunden, når der kommer nye filer i in-folderen så startes excel og macroen laver sit arbejde.derefter skal excel lukkes igen.
Det jeg har nu er: En macro i excel der åbner en navngiven txt fil (den jeg optag macroen til), markerer celle A1, laver en sammentælling v.h.a. VB, indsætter dato (now() ), formatterer celler, og gemmer i out folder i xls format.
Jeg er stødt ind i følgende problemer: 1. Starte excel og macro når fil kommer i in-folder 2. Macro ser kun efter file med navn data.txt 3. Macro gemmer altid i out-folder med navn data.xls 4. Den oprindelige fil i in-folder skal slettes
Hvis punkt 1 volde problemer kan jeg evt. lave en scheduled task der kører hver 1/2 time, men jeg ønsker ingen fejlmeddelser hvis in-folderen er tom.
Desuden mangler jeg at EAN nr i sammentællingen skal slås op i en acces database, for at hente en varebeskrivelse. Det vil jeg tro kan gøres v.h.a. ODBC
Dette skulle kunne klare 2, 3 og 4 1. chekker en folder for txt filer. åbner dem alle en for en. 2. Gemmer som xl-fil som dato og klokkeslet 3. sletter textfilene igen en for en
Private Sub ListFiles() Dim InDirectory As String, OutDirectory As String Dim i As Long InDirectory = "c:\textfiler" OutDirectory = "c:\xlfiler\" On Error Resume Next With Application.FileSearch .NewSearch .LookIn = InDirectory .Filename = "*.txt" .SearchSubFolders = False .Execute If Not .FoundFiles.Count > 0 Then Exit Sub ReDim filer(.FoundFiles.Count) For i = 1 To .FoundFiles.Count Workbooks.OpenText .FoundFiles(i) Call myOwnMacro 'her indsætter du et kald til dim egen makro ActiveWorkbook.SaveAs Filename:=OutDirectory & Format(Now, "ddmmyy-hhmm"), FileFormat:=xlNormal Kill .FoundFiles(i) Next i End With End Sub
Det første spørgsmål kan ikke laves inde fra Excel. En makro, der kører i Excel kan ikke startes før Excel er startet, og kan altså ikke starte Excel. Derfor er du nok nødt til at programmere en exe-fil, som checker din mappe for nye filer og i givet fald starter Excel og afspiller makroen. Men denne Exe fil skal til gengæld køre (være åben) hele tiden ellefr starte automatisk med meget jævne mellemrum, for se om der er kommet nye filer.
Her må du ug og have fat i et programmeringsværktøj.
Schedule 3.5.31 Operations can be scheduled to launch based on a flexible range of dates and times when file or directory changes occur when windows or programs open or close when Schedule is started
Bak > Det ser fint ud. Jeg var nødt til at ændre i filnavnet på outfilen, da det går så hurtigt at den kan generere mere end en fil på minut. Jeg har derfor tilføjet sekunder. txt filerne lukke ikke. Jeg har prtøvet med: ActiveWindow.Close men så spørger den om ændringer skal gemmes. Det skal de jo ikke. Man hvordan for jeg dette med i makroen. Hvordan tilføjer jeg in filnavn til out filnavn? Bak smid et svar
Jeg er klar over at jeg ikke kan starte excel fra en excel macro. Men det må være muligt at starte excel og aktivere en makro fra et vbs script i windows 2000. Ja jeg fik ikke fortalt at det kører på win2000. Kan man lukke excel fra en excel makro? Selvfølgelig er der muligheden for at have excel åben, men lad os se om det andet ikke er muligt.
Et par modifikationer: gemmer som textfil-navnet + datotid lukker filerne efter sig lukker excel som afslutning
Sub ListFiles() Dim InDirectory As String, OutDirectory As String Dim i As Long, x As Variant, FilNavn As String InDirectory = "c:\" OutDirectory = "c:\" On Error Resume Next With Application.FileSearch .NewSearch .LookIn = InDirectory .Filename = "*.txt" .SearchSubFolders = False .Execute If Not .FoundFiles.Count > 0 Then Exit Sub ReDim filer(.FoundFiles.Count) For i = 1 To .FoundFiles.Count Workbooks.OpenText (.FoundFiles(i)) x = Split(.FoundFiles(i), "\") FilNavn = Left(x(UBound(x)), InStr(1, UCase(x(UBound(x))), ".TXT") - 1) Call myOwnMacro 'her indsætter du et kald til dim egen makro ActiveWorkbook.SaveAs Filename:=OutDirectory & FilNavn & Format(Now, "ddmmyy-hhmmss"), FileFormat:=xlNormal ActiveWorkbook.Close savechanges:=False Kill .FoundFiles(i) Next i End With Application.Quit ' Lukker excel efter brug End Sub
Så fungerer det. Tilbage er kun at få det til at køre uden excel er åben. Det kan være jeg benytter stefanfuglsang's forslag med at køre med excel åben. Derfor får han også nogle point
hvis du har windows 2000 eller højere, så kan den indbyggede Planlægningagent bruges til at starte en "task" fx. hver 20 min. Denne "task" kan sagtens være at åbne et bestemt excelark. På engelsk "Scheduled tasks".
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.