Avatar billede hjald8 Nybegynder
06. december 2004 - 12:15 Der 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)

På forhånd tusind tak for hjælpen.
Avatar billede bak Forsker
06. december 2004 - 16:44 #1
hvordan ser din makro ud nu ?
Avatar billede hjald8 Nybegynder
06. december 2004 - 18:46 #2
Den ser således ud:

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
Avatar billede bak Forsker
06. december 2004 - 19:40 #3
Det er nemt nok at konvertere , til . men jeg er ikke sikker på at det er det du mener
erstat
strTemp = strTemp & rngOmr(x, y).Text

med
strTemp = strTemp & Replace(rngOmr(x, y).Text, ",", ".")

men vend tilbage, hvis det ikke er det du mener
Avatar billede bak Forsker
06. december 2004 - 19:48 #4
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.
Avatar billede hjald8 Nybegynder
07. december 2004 - 09:58 #5
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
Avatar billede bak Forsker
07. december 2004 - 11:55 #6
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 .
Avatar billede hjald8 Nybegynder
07. december 2004 - 12:43 #7
Tusind tak - endnu engang.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester