Anzeige
Archiv - Navigation
1952to1956
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Export in JSON Umlaute

VBA Export in JSON Umlaute
06.11.2023 17:42:09
Mobby
Hallo,
ich habe dieses VBA gefunden, um ein Tabellenblatt in JSON zu speichern:
Public Sub tojson()

savename = "exportedxls.json"
Dim wkb As Workbook
Dim wks As Worksheet
Set wkb = ThisWorkbook
Set wks = wkb.Sheets(1)
lcolumn = wks.Cells(1, Columns.Count).End(xlToLeft).Column
lrow = wks.Cells(Rows.Count, "A").End(xlUp).Row
Dim titles() As String
ReDim titles(lcolumn)
For i = 1 To lcolumn
titles(i) = wks.Cells(1, i)
Next i
json = "["
dq = """"
For j = 2 To lrow
For i = 1 To lcolumn
If i = 1 Then
json = json & "{"
End If
cellvalue = wks.Cells(j, i)
json = json & dq & titles(i) & dq & ":" & dq & cellvalue & dq
If i > lcolumn Then
json = json & ","
End If
Next i
json = json & "}"
If j > lrow Then
json = json & ","
End If
Next j
json = json & "]"
myFile = Application.DefaultFilePath & "\" & savename
Open myFile For Output As #1
Print #1, json
Close #1
a = MsgBox("Saved as " & savename, vbOKOnly)
End Sub

Quelle: https://techietown.info/de/excel-tabelle-als-json-datei-speichern

Leider werden Umlaute nicht richtig dargestellt in der .json. Wie kann das Beispiel dahingehend angepasst werden?

Danke für eure Hilfe.

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Export in JSON Umlaute
06.11.2023 19:23:38
Yal
Hallo Mobby,

es könnte daran liegen, dass die Datei als Unicode gespeichert werden soll. Dafür verwende am Besten die Methode "CreateTextFile" vom Objekt "FileSystemObject". Diese ist in der Bibliothek Microsoft Scripting Runtime abgelegt: in VB-Editor, unter "Extras", "Verweise...", Haken bei "Micorsoft Scripting Runtime".

Für ein leichtere Behandlung würde ich die "Liste" temporäre in einer Tabelle packen, dann das kombinieren der Überschrift und Zeile in einer abgelegten Function, um ein besseren Übersicht zu haben.
Das Gesamt würde so aussehen:

Public Sub tojson()

'Unter Anbindung ("Extras", "Verweise..") von
'Microsoft Scripting Runtime
Dim LR As ListRow
Dim FSO As New FileSystemObject 'Bib: Scripting
Dim Json As String
Const savename = "exportedxls.json"

With ThisWorkbook.Sheets(1)
With .ListObjects.Add(xlSrcRange, .Range("A1").CurrentRegion, , xlYes)
'json Zeilen herstellen
For Each LR In .ListRows
Json = Json & ",{" & Join(Kombiniere(.HeaderRowRange.Value, LR.Range.Value), ",") & "}"
Next
.Unlist
End With
End With
'Json vervollständigen
Json = "[" & Mid(Json, 2) & "]" 'führende Komma weg
'in die Datei schreiben
With FSO.CreateTextFile(Application.DefaultFilePath & "\" & savename, OverWrite:=True, Unicode:=True)
.Write Json
.Close
End With
MsgBox "Saved as " & savename, vbOKOnly
End Sub

Private Function Kombiniere(ArrHead, ArrLR)
Dim i
Dim Erg
Const cDQ = """"
ReDim Erg(LBound(ArrHead, 2) To UBound(ArrHead, 2))
For i = LBound(ArrHead, 2) To UBound(ArrHead, 2)
Erg(i) = cDQ & ArrHead(1, i) & cDQ & ":" & cDQ & ArrLR(1, i) & cDQ
Next
Kombiniere = Erg
End Function

Nicht gestestet, da ich keine passende Daten/Datei dafür habe.
Ich gehe davon aus, dass im normalen Zustand keine Tabelle (aka "intelligente Tabelle", Menü "Einfügen", "Tabelle") vorhanden ist. Sollte schon eine geben, müsste man darauf bauen.

VG
Yal
Anzeige
Einfacher
06.11.2023 19:44:33
Yal
Hmm... der Weg über der ListObject ist over-engineered.
Back to the root. Mit diesem Code kommst Du eher zurecht:

Public Sub AlsJson_speichern()

Const savename = "exportedxls.json"

With CreateObject("Scripting.Runtime").CreateTextFile(Application.DefaultFilePath & "\" & savename, True, True)
.Write Daten_Lesen
.Close
End With
MsgBox "Saved as " & savename
End Sub

Private Function Daten_Lesen()
Dim temp As String
Dim Json As String
Dim R, C

With ThisWorkbook.Sheets(1)
For R = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
temp = ""
For C = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
temp = temp & ",""" & .Cells(1, C).Value & """:""" & .Cells(R, C).Value & """"
Next C
Json = Json & ",{" & Mid(temp, 2) & "}" 'ohne das führende Komma in temp, also ab der 2te Stelle.
Next R
End With
Daten_Lesen = "[" & Mid(Json, 2) & "]" 'ohne das führende Komma in json
End Function

Anstatt das Bibliothek im Voraus zu binden ("early binding"), verwende ich den "CreateObject" direkt auf das Objekt in der Bibliothek ("late binding"). Weniger schön (kein Debugging, kein Objektkatalog, kein Intellisense), aber ausreichend.

VG
Yal


Anzeige
Wenn man nicht testet, postet man Fehler
06.11.2023 19:55:55
Yal
beim Late Binding ist es nicht "Scripting.Runtime" sondern "Scripting.FileSystemObject"

Public Sub AlsJson_speichern()

Const savename = "exportedxls.json"

With CreateObject("Scripting.FileSystemObject").CreateTextFile(Application.DefaultFilePath & "\" & savename, True, True)
.Write Daten_Lesen
.Close
End With
MsgBox "Saved as " & savename
End Sub

Private Function Daten_Lesen()
Dim temp As String
Dim Json As String
Dim R, C

With ThisWorkbook.Sheets(1)
For R = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
temp = ""
For C = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
temp = temp & ",""" & .Cells(1, C).Value & """:""" & .Cells(R, C).Value & """"
Next C
Json = Json & ",{" & Mid(temp, 2) & "}" 'ohne das führende Komma in temp, also ab der 2te Stelle.
Next R
End With
Daten_Lesen = "[" & Mid(Json, 2) & "]" 'ohne das führende Komma in json
End Function


VG
Yal
Anzeige
AW: Wenn man nicht testet, postet man Fehler
06.11.2023 20:06:00
Mobby
Vielen Dank für die Arbeit und Hilfe. Die "Scripting.FileSystemObject" kann ich unter Verweise nicht finden.
Ich habe vergessen zu sagen, dass ich MacOS, Excel for Mac 16.78 verwende.
AW: Wenn man nicht testet, postet man Fehler
06.11.2023 22:52:42
Yal
Hallo Mobby,

sorry, ich habe bei meiner Erklärung 2 Sachen vermischt, die "entweder oder" anzunehmen sind:

Entweder sogenannte Frühbindung: man hakt die passende Bibliothek in den "Verweise" und verwendet den FileSystemObject in den Variablendeklaration:
Dim FSO As FileSystemObject

Oder late binding: die Variable wird generisch als "Objekt" deklariert und mit CreateObject als FileSystemObject richtig instanziert. Da braucht man den Verweis nicht.

Du musst den late binding Test machen:
Sub Test

Dim FSO As Object

Set FSO = CreateObject("Scripting.FileSystemObject")
End Sub

Lasse den Code im Schrittmodus laufen (F8) beim offenen Lokalfenster (Ansicht, Lokalfenster) und siehe, wie die Variable FSO instanziert wird.
Das sollte unter Mac auch funktionieren. Wenn nicht, müssen wir eine andere Lösung suchen.

Ich mache es ein bisschen kompliziert, weil ich mit dem "with" eine direkte Verwendung des Objekts ohne Zuweisung an einer Variable.

VG
Yal
Anzeige
FileSystemObject ...
06.11.2023 23:35:28
Uduuh
Hallo,
... gibt's imho auf'm Mac nicht.

Gruß aus'm Pott
Udo
ver-Apple-t
07.11.2023 09:57:08
Yal
Dann ist es, glaube ich, am einfachste, wenn man eine neue Blatt einführt, der Json darin ablegt und diese in Mac-Format speichert.
Also eins von beiden folgenden (csv utf8 hört sich iwi besser. Habe aber kein mac und kann nicht testen):

Sub Makro1()

Const cPfad = "C:\HerberForum\"
With Workbooks.Add
.Worksheets(1).Range("A1").Value = json
'Vers 1, csv
.SaveAs Filename:=cPfad & "test.csv", FileFormat:=xlCSVUTF8, CreateBackup:=False
'Vers 2, txt
.SaveAs Filename:=cPfad & "test.csv", FileFormat:=xlTextMac, CreateBackup:=False
.Close SaveChanges:=False
End With
End Sub


VG
Yal
Anzeige
AW: ver-Apple-t
07.11.2023 15:52:06
Mobby
Hallo,
ersteinmal vielen vielen Dank für deine Hilfe. Leider will alles nicht so.
Ich habe noch weiter im Netz geschaut und es scheint an der fehlenen Runtime zu liegen.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige