Kæmper med at få en VBA der laver vCard.vcf filer til at virke med æøå. VBA laver fint filerne, men når de bliver importeret, så blive æ, ø og å til en firkant på højkant med et ? tegn i.
Hvad er det der gør dette? Det står fint i vcard teksten:
Sub ExportEachToSeparateVCard_v4() Dim ws As Worksheet Dim LastRow As Long Dim i As Long Dim FileNum As Integer Dim LogNum As Integer Dim vCardText As String Dim FilePath As String Dim LogPath As String Dim SkippedContacts As Long Dim SkipReason As String Dim DateTimeStamp As String Dim FolderPath As String
' Fejlhåndtering On Error GoTo ErrorHandler
' Definer arbejdsarket Set ws = ThisWorkbook.Sheets("Ark1") ' Skift "Ark1" til dit ark-navn
' Find sidste række med data LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row If LastRow < 2 Then Err.Raise vbObjectError + 1000, , "Ingen kontakter fundet i regnearket."
' Opret tidsstempel til logfilnavn DateTimeStamp = Format(Now, "yyyy-mm-dd_HH-MM-SS")
' Find sti til mappen hvor Excel-filen er gemt FolderPath = ThisWorkbook.Path If FolderPath = "" Then Err.Raise vbObjectError + 1001, , "Excel-filen skal være gemt først."
' Sti til logfil LogPath = FolderPath & "\vCard_Log_" & DateTimeStamp & ".txt"
' Opret logfil LogNum = FreeFile Open LogPath For Output As #LogNum Print #LogNum, "===== VCard Eksport Log =====" Print #LogNum, "Dato: " & Now Print #LogNum, "--------------------------------------"
' Tæller for skippede kontakter SkippedContacts = 0
' Gennemgå hver række med kontaktinfo For i = 2 To LastRow ' Antager række 1 er overskrifter SkipReason = ""
' Tjek for manglende fornavn eller efternavn If ws.Cells(i, 1).Value = "" Then SkipReason = "Fornavn mangler." If ws.Cells(i, 3).Value = "" Then SkipReason = "Efternavn mangler."
' Hvis der er en fejl, skriv til log og spring over If SkipReason <> "" Then SkippedContacts = SkippedContacts + 1 Print #LogNum, "Række " & i & " - " & SkipReason GoTo NextContact End If
If ws.Cells(i, 4).Value <> "" Then vCardText = vCardText & "ORG:" & ws.Cells(i, 4).Value & vbCrLf If ws.Cells(i, 5).Value <> "" Then vCardText = vCardText & "TITLE:" & ws.Cells(i, 5).Value & vbCrLf If ws.Cells(i, 6).Value <> "" Then vCardText = vCardText & "TEL;TYPE=cell:" & ws.Cells(i, 6).Value & vbCrLf If ws.Cells(i, 7).Value <> "" Then vCardText = vCardText & "TEL;TYPE=work,voice:" & ws.Cells(i, 7).Value & vbCrLf If ws.Cells(i, 8).Value <> "" Then vCardText = vCardText & "TEL;TYPE=home,voice:" & ws.Cells(i, 8).Value & vbCrLf If ws.Cells(i, 9).Value <> "" Then vCardText = vCardText & "EMAIL;TYPE=work:" & ws.Cells(i, 9).Value & vbCrLf If ws.Cells(i, 10).Value <> "" Then vCardText = vCardText & "EMAIL;TYPE=home:" & ws.Cells(i, 10).Value & vbCrLf
' Adresse Arbejde If ws.Cells(i, 11).Value <> "" Or ws.Cells(i, 12).Value <> "" Or ws.Cells(i, 13).Value <> "" Or ws.Cells(i, 14).Value <> "" Or ws.Cells(i, 15).Value <> "" Then vCardText = vCardText & "ADR;TYPE=work:;;" & ws.Cells(i, 11).Value & "\n" & _ ws.Cells(i, 12).Value & " " & ws.Cells(i, 13).Value & " " & ws.Cells(i, 14).Value & "\n" & _ ws.Cells(i, 15).Value & vbCrLf End If
' Adresse Privat If ws.Cells(i, 16).Value <> "" Or ws.Cells(i, 17).Value <> "" Or ws.Cells(i, 18).Value <> "" Or ws.Cells(i, 19).Value <> "" Or ws.Cells(i, 20).Value <> "" Then vCardText = vCardText & "ADR;TYPE=home:;;" & ws.Cells(i, 16).Value & "\n" & _ ws.Cells(i, 17).Value & " " & ws.Cells(i, 18).Value & " " & ws.Cells(i, 19).Value & "\n" & _ ws.Cells(i, 20).Value & vbCrLf End If
' LinkedIn If ws.Cells(i, 21).Value <> "" Then vCardText = vCardText & "URL:" & ws.Cells(i, 21).Value & vbCrLf
vCardText = vCardText & "END:VCARD" & vbCrLf
' Opret filnavn og sti til vCard-fil FilePath = FolderPath & "\vCard_" & ws.Cells(i, 1).Value & "_" & ws.Cells(i, 3).Value & ".vcf" ' "_" & DateTimeStamp &
' Opret vCard-filen FileNum = FreeFile Open FilePath For Output As #FileNum Print #FileNum, vCardText Close #FileNum
NextContact: Next i
' Luk logfil Close #LogNum
' Bekræftelse til brugeren MsgBox "Alle kontakter er gemt som separate vCard-filer i samme mappe som Excel-filen." & vbCrLf & _ "Logfil med skippede kontakter: '" & LogPath & "'" & vbCrLf & _ "Kontakter sprunget over pga. manglende data: " & SkippedContacts, vbInformation, "Færdig"
Exit Sub
ErrorHandler: ' Luk filerne sikkert ved fejl If FileNum > 0 Then Close #FileNum If LogNum > 0 Then Close #LogNum MsgBox "Fejl: " & Err.Description & vbCrLf & "Kode: " & Err.Number, vbCritical, "Fejl under eksport" End Sub
Har du prøvet at bruge utf8 kodning, for at få danske tegn ? Jeg har prøvet at indsætte "Utf8Encode" til teksten, i koden, herunder, som burde korrigere for danske tegn, men kan ikke teste det her hos mig, da jeg ingen data har ;-)
Sub ExportEachToSeparateVCard_v4() Dim ws As Worksheet Dim LastRow As Long Dim i As Long Dim FileNum As Integer Dim LogNum As Integer Dim vCardText As String Dim FilePath As String Dim LogPath As String Dim SkippedContacts As Long Dim SkipReason As String Dim DateTimeStamp As String Dim FolderPath As String
' Fejlhåndtering On Error GoTo ErrorHandler
' Definer arbejdsarket Set ws = ThisWorkbook.Sheets("Ark1") ' Skift "Ark1" til dit ark-navn
' Find sidste række med data LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row If LastRow < 2 Then Err.Raise vbObjectError + 1000, , "Ingen kontakter fundet i regnearket."
' Opret tidsstempel til logfilnavn DateTimeStamp = Format(Now, "yyyy-mm-dd_HH-MM-SS")
' Find sti til mappen hvor Excel-filen er gemt FolderPath = ThisWorkbook.Path If FolderPath = "" Then Err.Raise vbObjectError + 1001, , "Excel-filen skal være gemt først."
' Sti til logfil LogPath = FolderPath & "\vCard_Log_" & DateTimeStamp & ".txt"
' Opret logfil LogNum = FreeFile Open LogPath For Output As #LogNum Print #LogNum, "===== VCard Eksport Log =====" Print #LogNum, "Dato: " & Now Print #LogNum, "--------------------------------------"
' Tæller for skippede kontakter SkippedContacts = 0
' Gennemgå hver række med kontaktinfo For i = 2 To LastRow ' Antager række 1 er overskrifter SkipReason = ""
' Tjek for manglende fornavn eller efternavn If ws.Cells(i, 1).Value = "" Then SkipReason = "Fornavn mangler." If ws.Cells(i, 3).Value = "" Then SkipReason = "Efternavn mangler."
' Hvis der er en fejl, skriv til log og spring over If SkipReason <> "" Then SkippedContacts = SkippedContacts + 1 Print #LogNum, "Række " & i & " - " & SkipReason GoTo NextContact End If
If ws.Cells(i, 4).Value <> "" Then vCardText = vCardText & "ORG:" & Utf8Encode(ws.Cells(i, 4).Value) & vbCrLf If ws.Cells(i, 5).Value <> "" Then vCardText = vCardText & "TITLE:" & Utf8Encode(ws.Cells(i, 5).Value) & vbCrLf If ws.Cells(i, 6).Value <> "" Then vCardText = vCardText & "TEL;TYPE=cell:" & Utf8Encode(ws.Cells(i, 6).Value) & vbCrLf If ws.Cells(i, 7).Value <> "" Then vCardText = vCardText & "TEL;TYPE=work,voice:" & Utf8Encode(ws.Cells(i, 7).Value) & vbCrLf If ws.Cells(i, 8).Value <> "" Then vCardText = vCardText & "TEL;TYPE=home,voice:" & Utf8Encode(ws.Cells(i, 8).Value) & vbCrLf If ws.Cells(i, 9).Value <> "" Then vCardText = vCardText & "EMAIL;TYPE=work:" & Utf8Encode(ws.Cells(i, 9).Value) & vbCrLf If ws.Cells(i, 10).Value <> "" Then vCardText = vCardText & "EMAIL;TYPE=home:" & Utf8Encode(ws.Cells(i, 10).Value) & vbCrLf
' Adresse Arbejde If ws.Cells(i, 11).Value <> "" Or ws.Cells(i, 12).Value <> "" Or ws.Cells(i, 13).Value <> "" Or ws.Cells(i, 14).Value <> "" Or ws.Cells(i, 15).Value <> "" Then vCardText = vCardText & "ADR;TYPE=work:;;" & Utf8Encode(ws.Cells(i, 11).Value) & "\n" & _ Utf8Encode(ws.Cells(i, 12).Value) & " " & Utf8Encode(ws.Cells(i, 13).Value) & " " & Utf8Encode(ws.Cells(i, 14).Value) & "\n" & _ Utf8Encode(ws.Cells(i, 15).Value) & vbCrLf End If
' Adresse Privat If ws.Cells(i, 16).Value <> "" Or ws.Cells(i, 17).Value <> "" Or ws.Cells(i, 18).Value <> "" Or ws.Cells(i, 19).Value <> "" Or ws.Cells(i, 20).Value <> "" Then vCardText = vCardText & "ADR;TYPE=home:;;" & Utf8Encode(ws.Cells(i, 16).Value) & "\n" & _ Utf8Encode(ws.Cells(i, 17).Value) & " " & Utf8Encode(ws.Cells(i, 18).Value) & " " & Utf8Encode(ws.Cells(i, 19).Value) & "\n" & _ Utf8Encode(ws.Cells(i, 20).Value) & vbCrLf End If
' LinkedIn If ws.Cells(i, 21).Value <> "" Then vCardText = vCardText & "URL:" & Utf8Encode(ws.Cells(i, 21).Value) & vbCrLf
vCardText = vCardText & "END:VCARD" & vbCrLf
' Opret filnavn og sti til vCard-fil FilePath = FolderPath & "\vCard_" & Utf8Encode(ws.Cells(i, 1).Value) & "_" & Utf8Encode(ws.Cells(i, 3).Value) & ".vcf" ' "_" & DateTimeStamp &
' Opret vCard-filen FileNum = FreeFile Open FilePath For Output As #FileNum Print #FileNum, vCardText Close #FileNum
NextContact: Next i
' Luk logfil Close #LogNum
' Bekræftelse til brugeren MsgBox "Alle kontakter er gemt som separate vCard-filer i samme mappe som Excel-filen." & vbCrLf & _ "Logfil med skippede kontakter: '" & LogPath & "'" & vbCrLf & _ "Kontakter sprunget over pga. manglende data: " & SkippedContacts, vbInformation, "Færdig"
Exit Sub
ErrorHandler: ' Luk filerne sikkert ved fejl If FileNum > 0 Then Close #FileNum If LogNum > 0 Then Close #LogNum MsgBox "Fejl: " & Err.Description & vbCrLf & "Kode: " & Err.Number, vbCritical, "Fejl under eksport" End Sub
Function Utf8Encode(value As String) As String Dim utf8Value As String utf8Value = value utf8Value = Replace(utf8Value, "æ", "æ") utf8Value = Replace(utf8Value, "ø", "ø") utf8Value = Replace(utf8Value, "å", "å") Utf8Encode = utf8Value End Function
Hvis jeg ligger den ind i et nyt modul som VBA, så ligger den nederste Function Utf8 sig lidt som en ny kode under. Bliver den så kørt når jeg kører den normale VBA?
Det ændrer i hvert fald ikke noget på min android telefon. Men som du kan se øverst, så laver den teksten rigtigt i vcard filen, æøå står der fint, når jeg så mailer den til mig selv og importerer den til kontakter i telefonen, så bliver æ,ø og å til ? i firkant som står på spidsen.
#2 - Det med nyt Modul, og så kode under, forstår jeg ikke rigtig hvad du mener med.
At det ikke "slår igennem" på din Android telefon, er nok mere et udtryk for, at den Android version du har på tlf. ikke kan læse karaktersættet fra den genererede fil.
Jeg lavede en søgning på Android, og der kan jeg se, at Android understøtter VCard version 4, som understøtter utf8 kodning. Så ?
Jeg har tidligere anvendt ADODB.Stream-objektet til at læse og skrive UTF-8-filer, når jeg oplevede problemer med karaktersættet. Ved ikke, om det kunne være løsningen her.
Nedenstående grund-kode er foreslået af Microsoft Copilot: (NB! Jeg har ikke afprøvet koden selv)
Sub SaveAsUTF8() Dim fsT As Object Dim filePath As String Dim textData As String
' Define the file path and text data filePath = "C:\path\to\yourfile.txt" textData = "This is a sample text with special characters: äöüß"
' Create and configure the ADODB.Stream object Set fsT = CreateObject("ADODB.Stream") fsT.Type = 2 ' Specify stream type - text fsT.Charset = "utf-8" ' Specify charset - UTF-8 fsT.Open ' Open the stream fsT.WriteText textData ' Write the text data to the stream
' Save the stream to a file fsT.SaveToFile filePath, 2 ' 2 means overwrite if the file exists fsT.Close ' Close the stream
#5 - Har du prøvet, som en test, at importere den genererede VCard fil i Outlook, og se om den viser korrekt tegnsæt ? Det kunne jo give en ide om, hvor problemet er. Om det er Android, eller andet.
#9, Den kan fint importeres til Outlook, med æøå. Der ser det hele rigtigt ud.
Jeg oploader lige den excel fil jeg arbejder med. Har lavet 2 moduler ekstra, med koder jeg tester. Knapperne i arket kører modul 1 og 2. Test koderne har jeg kørt direkte fra selve kode vinduet.
#11 - Uden at have testet di kode, tror jeg, at problemet skal findes i din tlf.
I dit åbnings spørgsmål, viser den Version 4, men når du eksporterer, viser den version 2.1
Kunne du prøve, at bruge en 3.die parts App, til at hente en VCard fil ind.
Synes godt om
1 synes godt om dette
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.