25. marts 2003 - 15:36Der er
48 kommentarer og 1 løsning
Makro der henter eksisterende tekstfil
Hej
Jeg har et eksisterende excel dokument der har x antal kollonner med overskrift og en masse eksisterende data!
Nu har jeg også en tekstfil med data som skal tilføjes i bunden af denne tekstfil, efter de eksisterende data! Denne tekstfil er tabulator separaret. Men formatet af denne kan ændres hvis nødvendigt.
Hvordan laver jeg en makro der henter denne tekstfil, som altid har samme filnavn, og tilføjer dens data til slutningen af regnearket i arket ved navn "data"
Prøv med nedenstående. Forudsætter at data starter i kolonne A, og at der ikke er tomme rækker. Ret filnavn og sti for filen der skal importeres. Forudsætter også at der ikke er overskrifter i txt filen.
Sub Import() Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Activate a = Selection.Address
bak-> Som jeg opfatter det, er det ikke de samme data fra gang til gang. Jeg har læst det som nye data, siden de skal tilføjes i bunden af de eksiterende. Disse skal ikke ændres. Han bruger bare samem filnavn til at gemme dem i, inden eksport. Men jeg kan selvfølgelig tage fejl.
JKrons-> jeg har ikke testet det, men du laver en query på en textfil hver gang. Det, jeg er lidt betænkelig ved, er om de foregående query's også vil blive opdateret, således at du vil få flere gange samme data. Måske opdateres de ikke og så er alt jo godt.
Tough Job, men jeg prøver. Så håber jeg bare at du kan bruge forklaringerne til noget :-)
Sub Import() ’Først vælges det aktuelle ark - i dette tilfælde data Worksheets("data").Activate
’Så skal vi sikre at vi starter i A1 Range("A1").Select
’Herfra går vi til sidste celle, der er udfyldt i A-kolonnen Selection.End(xlDown).Select
’Og så yderligere en celle ned, for at komme til en tom celle ActiveCell.Offset(1, 0).Activate
’Så gemmer vi denne celles adresse til senere brug a = Selection.Address
’Så er vi klar til selve importen. Først skal vi have fat importfilen ’og samtidigt skal vi bestemme hvor den skal placeres. Dette gøres ’med Destination:=Range(a), hvor a er adressen vi tidligere gemte With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Dokumenter\impo.txt", _ Destination:=Range(a))
’De følgende linier kode svarer til de indstillinger man kan foretage i Guiden tekstimport. ’De steder, hvor der står True, svarer det til at noget er valgt i Guiden. ’Står der False, svarer det til, at det IKKE er valgt.
’Navn på inputområdet. Tilsyneladende samme navn som importfilen har, men det kan ændres. .Name = "impo"
’Første linie indeholder IKKE overskrifter, ellers = True .FieldNames = False
’ Skal eventuelle rækkenumre i kildefilen importeres med .RowNumbers = False
’Skal efterfølgende kolonner fyldes med formler ’Sættes til True, hvis celler ved siden af importområdet ’indeholder formler, der skal kopieres ned til de nye data .FillAdjacentFormulas = False
’Skal forespørgslen køres igen når filen åbnes .RefreshOnFileOpen = False
’Der indsættes ny celler til de importerede data. Ikke anvendte celler slettes. ’Her er flere andre muligheder - se Guiden .RefreshStyle = xlInsertDeleteCells
’Skal en eventuel adgangskode gemmes .SavePassword = False
’Skal efterfølgende separatorer opfattes som én ? ’Mest interessant ved brugerdefinerede separatorer bestående af flere tegn .TextFileConsecutiveDelimiter = False
’Er separatoren en tabulator .TextFileTabDelimiter = True
’Er separatoren et semikolon .TextFileSemicolonDelimiter = False
’Er separatoren et komma .TextFileCommaDelimiter = False
’Er separatoren et mellemrum .TextFileSpaceDelimiter = False
’Beskriver antallet af kolonner i importfilen (tror jeg). 1 tal pr. kolonne. .TextFileColumnDataTypes = Array(1, 1)
’Skal forespørgslen opdatere i baggrund .Refresh BackgroundQuery:=False End With
Du kan i hvert fald slette hele filen, om du også kan slette indholdet og lad filen stå tilbage kan jeg ikke lige gennemskue.
Så skal du bare tilføje denne linie lige før End Sub
Kill ("C:\Dokumenter\impo.txt")
Men du skal være sikker på at din import er gået godt, så måske skal den "pakkes ind" i noget bekræftelse af hvorvidt sletningen SKAL gennemføres, fx
ans = MsgBox("Skal importfilen slettes nu?", vbYesNo + vbQuestion, "Sletteadvarsel") If ans = vbYes Then Kill ("C:\Dokumenter\impo.txt") Else Exit Sub End If
FileExist = Dir("C:\Dokumenter\impo.txt") If FileExist = "" Then MsgBox "Der eksisterer ingen importfil. Importen afbrydes", vbOKOnly + vbInformation, "Filfejl" Exit Sub End If
Hvis hele Importfunktionen er ny i 2000 (og det kan godt tænkes) kan du erstatte hele din kode i 97 med følgende - noget primitive metode. Den åbner importfilen i Excel og kopierer hele indholdet over til det ark, den skal sættes ind i. Derefter lukkes importfilen igen. Kontrol for om filen findes, samt sletning af filen er bebeholdt fra det oprindelige forslag.
Løsningen er noget mere primitiv - og lidt langsommere. Til gengæld burde den virke såvel i 2000/XP som i 97.
Sub mysub() FileExist = Dir("C:\Dokumenter\import2.txt") If FileExist = "" Then MsgBox "Der eksisterer ingen importfil. Importen afbrydes", vbOKOnly + vbInformation, "Filfejl" Exit Sub End If Workbooks.OpenText Filename:="C:\Dokumenter\import2.txt" Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Windows("importertilark.xls").Activate Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste Windows("import2.txt").Close ans = MsgBox("Skal importfilen slettes nu?", vbYesNo + vbQuestion, "Sletteadvarsel") If ans = vbYes Then Kill ("C:\Dokumenter\import2.txt") Else Exit Sub End If
Jeg skulle måske lige sige, at import2.txt selvfølgelig er tesktfilen, mens importertilark.xls er den fil, der skal importeres til, og som indeholder koden.
Dette virker selv om der er tomme kolonner i importfilen under forudsætning af, at den altid går til kolonne F, og at den ikke indeholder helt tomme rækker.
Sub mysub() FileExist = Dir("C:\Dokumenter\import2.txt") If FileExist = "" Then MsgBox "Der eksisterer ingen importfil. Importen afbrydes", vbOKOnly + vbInformation, "Filfejl" Exit Sub End If Workbooks.OpenText Filename:="C:\Dokumenter\import2.txt" Range("A1").Select Selection.End(xlDown).Select Adr = ActiveCell.Row Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range("A1:F" & Adr).Select Selection.Copy Windows("importertilark.xls").Activate Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste Windows("import2.txt").Close ans = MsgBox("Skal importfilen slettes nu?", vbYesNo + vbQuestion, "Sletteadvarsel") If ans = vbYes Then Kill ("C:\Dokumenter\import2.txt") Else Exit Sub End If
Men en enkelt undtagelses! I den tekstfil jeg vil importere indgår en formel i et af felterne! Denne formel bliver bare skrevet i feltet uden at blive "eksekveret". De står bare som tekst i feltet!
Er det muligt at få det lavet sådan så denne formel bliver eksekveret? Altså så det / de felter med formeler bliver lavet om fra tekstfelt til formel!
Hvis der altid er tale om den samme formel, kan følgende måske løse dit problem
Sub mysub()
FileExist = Dir("C:\Dokumenter\import2.txt") If FileExist = "" Then MsgBox "Der eksisterer ingen importfil. Importen afbrydes", vbOKOnly + vbInformation, "Filfejl" Exit Sub End If Workbooks.OpenText Filename:="C:\Dokumenter\import2.txt" Range("A1").Select Selection.End(xlDown).Select Adr = ActiveCell.Row Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range("A1:F" & Adr).Select Selection.Copy Windows("importertilark.xls").Activate Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste Windows("import2.txt").Close r = Selection.Address For Each c In Worksheets("ark1").Range(r).Cells cv = c.Value If Left(cv, 1) = "=" Then c.FormulaR1C1 = "=(INDIRECT(REPLACE(REPLACE(ADDRESS(ROW(),4),1,1,""""""""),2,1,""""""""))*Priser!R[-1]C[-3])+(INDIRECT(REPLACE(REPLACE(ADDRESS(ROW(),5),1,1,""""""""),2,1,""""""""))*Priser!RC[-3])" End If Next c ans = MsgBox("Skal importfilen slettes nu?", vbYesNo + vbQuestion, "Sletteadvarsel") If ans = vbYes Then Kill ("C:\Dokumenter\import2.txt") Else Exit Sub End If
Det er samme formel i alle kolonner - det er bare vigtigt at de begge alle bliver ganget med henholdsvis B3 og B4 i arket priser og at den ikke bliver forskubbet!
Jeg tester det i morgen og giver der nogle ekstra point der :-) Du har redeligt fortjent dem
Dit script virker perfekt nu, med en enkelt undtagelse... Der er lidt for mange " i formlen som vil melde fejl #REFERENCE, men det er rettet - og det kører perfekt nu!
Jeg har lige et spørgsmål. Hvis nu jeg kun ønsker de linier importeret hvor f.eks "wq=" fremkommer i importfilen? Hvordan klarer jeg lige det? Jeg laver lige et nyt spørgsmål på http://www.eksperten.dk/spm/724057
Synes godt om
Ny brugerNybegynder
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.