03. september 2003 - 12:08Der er
35 kommentarer og 1 løsning
Hvordan laver jeg denne skabelon i excel?
Jeg har et tekstdokument som bliver genereret af et andet program, som indeholder kommaseparerede værdier. Dette dokument kan jeg i øjeblikket indlæse i Excel og få værdierne opdelt så de står efter hinanden.
Der er altid det samme antal værdier (der er mange, men det er kun de 6-7 første der skal bruges i hver række). Med hensyn til antal rækker, så varierer det fra gang til gang, alt mellem 1 og 1000 (sandsynligvis vil det normale antal rækker ligge på mellem 1 og 30 evt. maks 100, men der er ikke nogen grænse....)
Her et forslag du kan prøve (ved ikke om det virker for dig). Kopier makroen til et modul og kør det. Den åbner txt filen i et ny excelark, hvorefter den danner et nyt ark med de nye formater. Husk at skifte filnavn ud i linje 1.
Sub open_and_format() Workbooks.OpenText FileName:="C:\DINFIL.txt", _ Tab:=True, Comma:=True, FieldInfo:=Array(Array(1, 1), _ Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)) kol = 5 ' definer hvor mange kolonner rak = (ActiveSheet.UsedRange.Rows.Count) Sheets.Add b = 1 For a = 1 To rak 'rak Sheets(2).Activate Range(Cells(a, 1), Cells(a, kol)).Copy Sheets(1).Activate Cells((kol * a - 5 + b), 2).Select Cells((kol * a - 5 + b), 1) = "Tid" Cells((kol * a - 4 + b), 1) = "Dato" Cells((kol * a - 3 + b), 1) = "Værdi" Cells((kol * a - 2 + b), 1) = "Værdi2" Cells((kol * a - 1 + b), 1) = "Værdi3" b = b + 1 Selection.PasteSpecial xlAll, Transpose:=True Next End Sub
OK jeg prøver at guide. 1) Åben excel 2) Åben Visual Basic (Vis/Værktøjslinjer/Visual Basic) 3) I venstre skærmbillede ser du nu dine åbne filer. Klik på den fil du ønsker skal indeholde din makro. (evt. bare Mappe 1) 4) indsæt modul (Indsæt/Modul) 5) kopier makroen over 6) Ret linje 1 i makroen så den åbner din tekstfil 7) Gå over i excel (du behøver ikke gemme i visual basic) 8 ) Kør makro (Alt+F8) Vælg "open_and_format
>>hugopedersen Dit script virker rigtig godt, og jeg har også fundet ud af at rette det lidt til så det passer efter mine værdier. Jeg har bare det problem at nogle af rækkerne bliver indlæst af excel så den tror at det er en dato og derfor skriver dette i stedet for den rigtige værdi, hvordan kan jeg undgå dette?
Desuden, hvad med sådan noget som at lave fed skrift på overskrifterne eller rammer omkring dataene, kan det lade sig gøre via scriptet? (jeg er begynder i det her... =) )
>>aheiss Jeg har lige prøvet dit script og det virker faktisk også perfekt.. Det eneste er at jeg godt kunne tænke mig at den springer over den første linje i tekstfilen, kan den det? og så er der det med fed skrift osv, kan man det?
Den springer over den første som den skal og overskrifterne bliver fede. Der kommer så ramme om hvert feldt med data (ikke overskrifter), jeg ville gerne ha ramme om hele "linjen" altså én stor ramme om alle overskrifter og data for den angivne linje, hvis det er muligt... =)
Sub open_and_format() Workbooks.OpenText FileName:="C:\MINFIL.txt", _ Tab:=True, Comma:=True, FieldInfo:=Array(Array(1, 1), _ Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)) kol = 5 ' definer hvor mange kolonner rak = (ActiveSheet.UsedRange.Rows.Count) Sheets.Add b = 1 For a = 2 To rak Step 1 Sheets(2).Activate Range(Cells(a, 1), Cells(a, kol)).Copy Sheets(1).Activate Cells((kol * a - 10 + b), 2).Select Selection.PasteSpecial xlAll, Transpose:=True Cells((kol * a - 10 + b), 1) = "Tid" Cells((kol * a - 9 + b), 1) = "Dato" Cells((kol * a - 8 + b), 1) = "Værdi" Cells((kol * a - 7 + b), 1) = "Værdi2" Cells((kol * a - 6 + b), 1) = "Værdi3" Range(Cells((kol * a - 10 + b), 1), _ Cells((kol * a - 10 + b + kol - 1), 2)).Select With Selection.Borders(xlEdgeLeft) .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .Weight = xlThin End With
Range(Cells((kol * a - 10 + b), 1), _ Cells((kol * a - 10 + b + kol - 1), 1)).Select Selection.Font.Bold = True b = b + 1 Next End Sub
Kolonnebredde skulle være OK. Mht. til at åbne i samme fil kan det ikke lade sig gøre. Men det skulle nu være løst alligevel. Nu åbnes filen, formaterer, og kopierer sig selv over i din master, hvorefter txtfilen lukkes uden at gemme ændringer. Alt i alt er din master opdateret men txt. filen uændret. Du skal nu tilpasse række 5, 6 og 7.
__________________________________
Sub open_and_format() Application.ScreenUpdating = False Dim minmappe As String Dim minfil As String minmappe = "C:\tempfolder\" ' ret mappen minfil = "mappe6.txt" ' ret filen aktuelfil = "tester2.xls" ' ret til din master filen Workbooks.OpenText FileName:=minmappe & minfil kol = 5 ' definer hvor mange kolonner rak = (ActiveSheet.UsedRange.Rows.Count) Sheets.Add b = 1 For a = 2 To rak Step 1 Sheets(2).Activate Range(Cells(a, 1), Cells(a, kol)).Copy Sheets(1).Activate Cells((kol * a - 10 + b), 2).Select Selection.PasteSpecial xlAll, Transpose:=True Cells((kol * a - 10 + b), 1) = "Tid" Cells((kol * a - 9 + b), 1) = "Dato" Cells((kol * a - 8 + b), 1) = "Værdi" Cells((kol * a - 7 + b), 1) = "Værdi2" Cells((kol * a - 6 + b), 1) = "Værdi3" Range(Cells((kol * a - 10 + b), 1), _ Cells((kol * a - 10 + b + kol - 1), 2)).Select Selection.ColumnWidth = 12 ' bredde på kolonne 1 With Selection.Borders(xlEdgeLeft) .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .Weight = xlThin End With Range(Cells((kol * a - 10 + b), 1), _ Cells((kol * a - 10 + b + kol - 1), 1)).Select Selection.Font.Bold = True Selection.ColumnWidth = 9 ' bredde på kolonne 2 b = b + 1 Next ActiveSheet.Copy Before:=Workbooks(aktuelfil).Sheets(1) Workbooks(minfil).Close (False) [a1].Select End Sub
Ja der var lige en sidste ting, så skal jeg nok stoppe =)
Jeg har været ved at rode lidt med at få den til at springe over en værdi i tekstfilen, altså hvis man har værdi1, værdi2, værdi3, værdi4, værdi5, værdi6 så vil jeg gerne ha værdi5 ud, men jeg kan ikke rigtig få det til at virke...
I denne "nye" udgave definerer du også i starten hvilke kolonner du vil have med. Håber det funker efter hensigten
______________________________ Sub open_and_format() Application.ScreenUpdating = False Dim minmappe As String Dim minfil As String minmappe = "C:\tempfolder\" ' ret mappen minfil = "mappe6.txt" ' ret filen aktuelfil = "tester2.xls" ' ret til din master filen kol1 = "A" ' første kolonne som skal med kol2 = "B" ' anden osv. kol3 = "C" kol4 = "D" kol5 = "F" Workbooks.OpenText Filename:=minmappe & minfil kol = 5 ' definer hvor mange kolonner rak = (ActiveSheet.UsedRange.Rows.Count) Sheets.Add b = 1 For a = 2 To rak Step 1 Sheets(2).Activate omrode = kol1 & rak & "," & kol2 & rak & "," & _ kol3 & rak & "," & kol4 & rak & "," & kol5 & rak Range(omrode).Copy Sheets(1).Activate Cells((kol * a - 10 + b), 2).Select Selection.PasteSpecial xlAll, Transpose:=True Cells((kol * a - 10 + b), 1) = "Tid" Cells((kol * a - 9 + b), 1) = "Dato" Cells((kol * a - 8 + b), 1) = "Værdi" Cells((kol * a - 7 + b), 1) = "Værdi2" Cells((kol * a - 6 + b), 1) = "Værdi3" Range(Cells((kol * a - 10 + b), 1), _ Cells((kol * a - 10 + b + kol - 1), 2)).Select Selection.ColumnWidth = 12 ' bredde på kolonne 1 With Selection.Borders(xlEdgeLeft) .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .Weight = xlThin End With Range(Cells((kol * a - 10 + b), 1), _ Cells((kol * a - 10 + b + kol - 1), 1)).Select Selection.Font.Bold = True Selection.ColumnWidth = 9 ' bredde på kolonne 2 b = b + 1 Next ActiveSheet.Copy Before:=Workbooks(aktuelfil).Sheets(1) Workbooks(minfil).Close (False) [a1].Select End Sub
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.