Avatar billede fjeld Praktikant
06. oktober 2011 - 12:50 Der er 8 kommentarer og
1 løsning

Tilpasning af makro - generering af kommafil

Hej alle.

Jeg har en makro som jeg ikke helt kan få til at virke som jeg gerne vil.

Jeg har i dag et regne ark med 8 kolonner. Min makro laver en tekst fil hvor hver kolonne er adskilt af et komma. Men makroen afslutter også med et komma. Dette skal den ikke....

Makroen ser ud som følgende:

Sub LavKommafil()
    Range("A1").Select
   
    'Kolonne = Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Column
    ActiveCell.SpecialCells(xlLastCell).Select
    Kolonne = ActiveCell.Column
   
    Range("A1").Select
   
' Filplacering og Efternavn
    Efternavn = ".txt"
    Inboks = InputBox("Indtast filnavn" & (Chr(10) & Chr(10)) & "Filen får automatisk efternavnet .txt", "Nielsen og Christensen - Eksport af kommafil", "D:\")
' Åbner en fil til output i STI med EFTERNAVN
    Open "" + Inboks + Efternavn + "" For Output As #1

' Løkke - kører alle linier igennem
    Dim iModel As Integer
    Dim sModel As String
    Do
    For iModel = 0 To Kolonne - 1
        sModel = sModel + TilDos850(ActiveCell.Offset(0, iModel)) + ","
    Next iModel
        Print #1, sModel
        sModel = ""
        ActiveCell.Offset(1, 0).Select
       
    Loop Until ActiveCell.Offset(0, 0) = "" And ActiveCell.Offset(1, 0) = "" And ActiveCell.Offset(2, 0) = ""
' Lukker filen #1
    Close #1    ' Luk filen.

' Placering efter udlæsning
    Range("A1").Select
    End
End Sub

Private Sub UserForm_Initialize()
    Application.ScreenUpdating = False
    For ix = 1 To 100 Step 1
    Model.AddItem ix
    Next ix
End Sub

'*====================================================
'* Funktion som i en tekst erstatter ANSI-koderne for
'* æøåÆØÅ til de tilsvarende koder for Dos og OS/2
'* efter tegntabel 850
'*====================================================
Function TilDos850(Tekst As String) As String

Dim ix As Integer, iz As Integer
Dim Tegn As String, Vaerdi As String
Dim Kode(1, 6) As Integer

Kode(0, 0) = 230: Kode(1, 0) = 145 'æ
Kode(0, 1) = 248: Kode(1, 1) = 155 'ø
Kode(0, 2) = 229: Kode(1, 2) = 134 'å
Kode(0, 3) = 198: Kode(1, 3) = 146 'Æ
Kode(0, 4) = 216: Kode(1, 4) = 157 'Ø
Kode(0, 5) = 197: Kode(1, 5) = 143 'Å
Kode(0, 6) = 44: Kode(1, 6) = 46 'Komma , til punktum .

For ix = 1 To Len(Tekst) Step 1
    Tegn = Mid(Tekst, ix, 1)
    For iz = 0 To UBound(Kode, 2) Step 1
        If Asc(Tegn) = Kode(0, iz) Then
            Tegn = Chr(Kode(1, iz))
            Exit For
        End If
    Next
    Vaerdi = Vaerdi & Tegn
Next
TilDos850 = Vaerdi

End Function
Avatar billede supertekst Ekspert
06. oktober 2011 - 13:13 #1
Du skal lave en test på om det er sidste kolonne eller ej
- hvis sidste kolonne skal , ikke med ellers skal det..
Avatar billede claes57 Ekspert
06. oktober 2011 - 14:21 #2
et stykke rettes til
    Do
        For iModel = 0 To Kolonne - 2
            sModel = sModel + TilDos850(ActiveCell.Offset(0, iModel)) + ","
        Next iModel
        sModel = sModel + TilDos850(ActiveCell.Offset(0, Kolonne - 1))
        Print #1, sModel
        sModel = ""
        ActiveCell.Offset(1, 0).Select
     
    Loop Until ActiveCell.Offset(0, 0) = "" And ActiveCell.Offset(1, 0) = "" And ActiveCell.Offset(2, 0) = ""

så afsluttes de enkelte linjer ikke med ,

og Function TilDos850 vil jeg rette til
'*====================================================
'* Funktion som i en tekst erstatter ANSI-koderne for
'* æøåÆØÅ til de tilsvarende koder for Dos og OS/2
'* efter tegntabel 850
'*====================================================
Function TilDos850(Tekst As String) As String

Tekst = Replace(Tekst, Chr(230), Chr(145))  'æ
Tekst = Replace(Tekst, Chr(248), Chr(155))  'ø
Tekst = Replace(Tekst, Chr(229), Chr(134))  'å
Tekst = Replace(Tekst, Chr(198), Chr(146))  'Æ
Tekst = Replace(Tekst, Chr(216), Chr(157))  'Ø
Tekst = Replace(Tekst, Chr(197), Chr(143))  'Å
Tekst = Replace(Tekst, Chr(44), Chr(46))  ', -> .
TilDos850 = Tekst

End Function
Avatar billede fjeld Praktikant
06. oktober 2011 - 14:47 #3
@supertekst -

"Du skal lave en test på om det er sidste kolonne eller ej
- hvis sidste kolonne skal , ikke med ellers skal det.. "

Præcist - jeg kan bare ikke finde ud af det...

@claus57

Jeg har nu forsøgt med din makro, men den tilføjer stadig et komma til sidst..
Avatar billede claes57 Ekspert
06. oktober 2011 - 15:05 #4
hvis sidste felt er tomt på sidste linje, så vil den slutte med komma - det laver vi så om, så den kun sætter komma hvis det er nødvendigt:

    Dim iModel As Integer
    Dim sModel As String
    Dim taller As Integer

    Do
        taller = 0
        For iModel = 0 To Kolonne - 1
            If taller = 1 Then sModel = sModel + ","
            sModel = sModel + TilDos850(ActiveCell.Offset(0, iModel))
            taller = 1
        Next iModel
        Print #1, sModel
        sModel = ""
        ActiveCell.Offset(1, 0).Select
    Loop Until ActiveCell.Offset(0, 0) = "" And ActiveCell.Offset(1, 0) = "" And ActiveCell.Offset(2, 0) = ""
' Lukker filen #1
    Close #1    ' Luk filen.
Avatar billede Tryphon Nybegynder
06. oktober 2011 - 15:25 #5
Den nemme løsning er nok, at skrive kommaet til sidst i linjen, som du allerede gør, og derefter fjerne det igen med en left og så klippe hele variablen undtagen de sidste tegn.

sModel = left(sModel,len(sModel)-1)

lige inden print #1, sModel
Avatar billede fjeld Praktikant
11. oktober 2011 - 16:15 #6
Super - nu virker det. Må dog sige, at Claus57 skal have pointene.. Claus, vil du sende et svar så du kan få pointene?
Avatar billede claes57 Ekspert
11. oktober 2011 - 19:59 #7
hvis du ikke brugte min kode-ændring, så nej tak...
Avatar billede Tryphon Nybegynder
21. oktober 2011 - 14:16 #8
Hvis du ikke har brugt nogen af løsningerne, lukker du så ikke lige tråden ved at give dig selv point?
Avatar billede fjeld Praktikant
26. juni 2014 - 00:07 #9
Lukning af tråd
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

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