06. december 2004 - 12:15Der er
6 kommentarer og 1 løsning
Gem som csv - men med korrekt decimalseperator=.
Hej
Jeg har en fin makro, som gemmer et ark som csv-fil, med semikolonseperering istedet for komma.
De fleste tal-celler i arket er uden særlig formatering - som fx tusindtals-seperator mm.
Der er nogle få felter, som skal udtrykkes med seperator - nemlig decimalseperator=. istedet for decimalseperator=, Sidstenævnte er og skal være standard i resten af projektmappen.
Hvordan får jeg lettest kodet det således at csv-filen gemmes - reelt som nu - men med den tilføjelse af disse felter har decimalseperator=. (punktum). (måske kunne alle felter gemmes således)
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Const Delim As String = ";" Dim y As Long Dim x As Long Dim strTemp As String Dim lRows As Long Dim lCols As Long Dim lFno As Long Dim CSVFilename As String Dim rngOmr As Range
CSVFilename = "Filnavn"
lFno = FreeFile lRows = ActiveSheet.Cells.Find(What:="*", After:=ActiveSheet.Range("A1"), _ Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, MatchCase:=False).Row lCols = ActiveSheet.Cells.Find(What:="*", After:=ActiveSheet.Range("A1"), _ Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, MatchCase:=False).Column Set rngOmr = Range(Cells(1, 1), Cells(lRows, lCols)) Open CSVFilename For Output As #lFno
For x = 1 To lRows strTemp = "" For y = 1 To lCols strTemp = strTemp & rngOmr(x, y).Text If y < lCols Then strTemp = strTemp & Delim Else Print #lFno, strTemp End If Next
Hvilken excel-version bruger du..? I XP og højere er det muligt under Funktioner / indstillinger / International selv at sætte seperatorene og makroen, du har vist, skriver nøjagtigt som der står i cellerne. Dvs at hvis du bruger . som decimalseperator vil csv-filen også få punktum som decimalseperator.
Modellen med strTemp = strTemp & Replace(rngOmr(x, y).Text, ",", ".")
virker helt ok. Bortset fra at den selvfølgelig konvertere alle kommaer, også kommaer i tekst. Mindre heldigt. Min fejl.
Jeg bruger p.t. Excel 2002/Excel 2003 - midt i en konvertering for alle brugere.
Men inspireret af din kommentar2, så har jeg tilføjet en 'With Application' i starten og i slutningen. Dermed har jeg fået den til at virke - Jeg har kun lige teste det én gang. Den virkede dog lidt langsom.
Læg et svar. De konstruktive kommentarer har frembragt en løsning. Hvis den burde være lavet anderledes - så giv et praj. Tak for input.
Se nedenfor:
With Application .DecimalSeparator = "." .ThousandsSeparator = "." .UseSystemSeparators = False End With Const Delim As String = ";" Dim y As Long Dim x As Long Dim strTemp As String Dim lRows As Long Dim lCols As Long Dim lFno As Long Dim CSVFilename As String Dim rngOmr As Range
CSVFilename = "Filnavn"
lFno = FreeFile lRows = ActiveSheet.Cells.Find(What:="*", After:=ActiveSheet.Range("A1"), _ Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, MatchCase:=False).Row lCols = ActiveSheet.Cells.Find(What:="*", After:=ActiveSheet.Range("A1"), _ Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, MatchCase:=False).Column Set rngOmr = Range(Cells(1, 1), Cells(lRows, lCols)) Open CSVFilename For Output As #lFno
For x = 1 To lRows strTemp = "" For y = 1 To lCols strTemp = strTemp & rngOmr(x, y).Text If y < lCols Then strTemp = strTemp & Delim Else Print #lFno, strTemp End If Next
Next Close #lFno With Application .DecimalSeparator = "," .ThousandsSeparator = "." .UseSystemSeparators = True End With
Ok, her er et svar. Hvis din løsning bliver for langsom, kan vi få den gamle makro til at chekke om cellens indhold er numerisk, før den erstatter , med .
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.