Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Umbau der Eingabe

Forumthread: Umbau der Eingabe

Umbau der Eingabe
06.10.2024 18:47:02
Simon
Hallo...
das ist meine VBA
einigen sicher bekannt...
da Nutzer dieser Tabelle wo dies genutzt wird noch alte Excel Versionen haben oder ein anderes Programm verwenden
habe ich folgende Idee gehabt...

VBA:
Sub AusZwischenablage_zwischen_Klammern01()

Dim DaOb As DataObject
Dim txt As String
Dim Pos1 As Long
Dim Pos2 As Long

'-----------------------------------------------------
' Vor erstellen des Codes
' aktiviere unter EXTRAS - VERWEISE den Verweis:
' Microsoft Forms 2.0 Object Library
'-----------------------------------------------------

'text aus zwischenablage holen
Set DaOb = New DataObject
DaOb.GetFromClipboard
txt = DaOb.GetText

'text zwischen eckigen Klammern ermitteln
Pos1 = InStr(txt, "Incoming")
Pos1 = InStr(Pos1, txt, "[")
Pos2 = InStr(Pos1, txt, "]")

If Pos1 > 0 And Pos2 > Pos1 Then
txt = Left(txt, Pos2 - 1)
txt = Mid(txt, Pos1 + 1)

'Text in feste Zelle einfügen
ActiveSheet.Range("B3") = Replace(txt, vbCrLf, "")
ActiveSheet.Range("B3") = Replace(Range("B3"), " 49,", "")
Else
Beep
End If

Die Daten in B3 könnten dann so aussehen...
1, 2, 4, 9, 5, 6, 7, 3, 14, 11, 10, 8, 12, 13, 15, 17, 16, 18, 20, 19, 25, 21, 22, 23
oder auch leer sein weil es "Incoming" zweimal gibt und das erste leer ist...
Zahlenlänge ist unterschiedlich je nach Level der Stadt.

Die Frage der Anwender ist folgende.

Könnte man per VBA immer die letzten 4 der Reihe in je eine Zelle schreiben...
Hier also so:

H3 = 25
I3 = 21
J3 = 22
K3 =23


Danke für Eure gute Hilfe.

Anzeige

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Umbau der Eingabe
06.10.2024 22:14:25
Kuwer
Hallo Simon,

  Dim vArray As Variant

vArray = Split(Range("B3").Value, ",")
Cells(3, 8).Resize(, 4) = ""
If UBound(vArray) > -1 Then
Pos1 = Application.Max(0, UBound(vArray) - 3)
For Pos2 = Pos1 To UBound(vArray)
Cells(3, 8 + Pos2 - Pos1).Value = vArray(Pos2)
Next Pos2
End If

Gruß, Uwe
Anzeige
AW: Umbau der Eingabe
07.10.2024 09:42:21
volti
Hallo,

hier noch eine Variante.....

Müsstest Du allerdings in jeder Lebenslage mal testen.
Highlights: Leere Incomming werden ignoriert, Originaltext wird um die Items, die in H3-K3 stehen, gekürzt. Das war mir nicht klar, wie das gehandelt werden sollte.

Code:


Option Explicit Sub AusZwischenablage_zwischen_Klammern01() Dim DaOb As DataObject Dim sArr1() As String, sArr2() As String Dim i As Long, j As Long, k As Long '----------------------------------------------------- ' Vor erstellen des Codes ' aktiviere unter EXTRAS - VERWEISE den Verweis: ' Microsoft Forms 2.0 Object Library '----------------------------------------------------- ' text aus zwischenablage holen Set DaOb = New DataObject DaOb.GetFromClipboard sArr1 = Split(DaOb.GetText, "Incoming:[") If UBound(sArr1) > 0 Then For i = 1 To UBound(sArr1) sArr2 = Split(sArr1(i), "]") If sArr2(0) <> "" Then sArr2(0) = Replace(Replace(sArr2(0), vbCrLf, ""), " 49,", "") & "," sArr1 = Split(sArr2(0), ",") ' Text in feste Zelle(n) einfügen j = UBound(sArr1) - 4: If j < 0 Then j = 0 For k = 8 To 11 If j <= UBound(sArr1) Then Cells(3, k).Value = sArr1(j) sArr2(0) = Replace(sArr2(0), "," & sArr1(j) & ",", ",") Else Cells(3, k).Value = "" End If j = j + 1 Next k If Right$(sArr2(0), 1) = "," Then sArr2(0) = Left$(sArr2(0), Len(sArr2(0)) - 1) Range("B3").Value = sArr2(0) Exit Sub End If Next i End If Beep End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: Umbau der Eingabe
07.10.2024 13:21:58
Simon
Danke für deine Hilfe.
Funktioniert so leider nicht wie gewünscht...
AW: Umbau der Eingabe
07.10.2024 14:10:59
volti
Hallo,

vielen Dank für die Rückmeldung.

Wenn ich als Testmuster "blabla Incoming:[] blabla Incoming:[ 1, 2, 3, 4, 5, 6, 7, 9, 49, 50] blabla" in die Zwischenablage kopiere wird mit Ablauf des Makros bei mir 1, 2, 3, 4, 5 in B3 kopiert und in die anderen vier Felder 6, 7, 9, 50.

Natürlich kann man das gesichert nur an realen Daten und in allen möglichen Vorkommnissen richtig testen, was mir hier ja fehlt.
Evtl. ist ja zwischen Incoming: und [ noch ein Leerzeichen?

Die alleinige unzureichende Aussage "funktioniert nicht" bringt einen hier nicht weiter und ist bei keinem Helfer hier im Forum beliebt.
Ich frage jetzt nicht nach, was, wie, warum nicht funktioniert...

Gruß
Karl-Heinz
Anzeige
AW: Umbau der Eingabe
07.10.2024 14:40:49
Simon
Hallo...

so sieht die Incoming Zeile aus.

Userbild



würde ja mit Json Funktion arbeiten wie es schon viele gesagt haben, gibt es aber bei Excel 2016 nicht unter Daten Abrufen und transformatieren.

Anzeige
AW: Umbau der Eingabe
07.10.2024 15:00:20
volti
Nun denn,

da passt man einfach den Splitter an und schon läuft es (wahrscheinlich).

PS: Programmierung reagiert auch auf kleinste Feinheiten. Ich gehe davon aus, dass es so in der eckigen Klammer endet: ..., 30] und nicht mit einem abschließenden Komma oder ...
Das mag für Dich nur eine mögliche Fortsetzungsreihe und klar sein. Der, der damit aber nix zu tun hat, kann das leicht falsch verstehen und schon geht nix mehr.

Code:


Option Explicit 'blabla Incoming: [] blabla" & vbcrlf & "Incoming: [ 1, 2, 3, 4, 5, 6, 7, 9, 49, 50] blabla Sub AusZwischenablage_zwischen_Klammern01() Dim DaOb As DataObject Dim sArr1() As String, sArr2() As String Dim i As Long, j As Long, k As Long '----------------------------------------------------- ' Vor erstellen des Codes ' aktiviere unter EXTRAS - VERWEISE den Verweis: ' Microsoft Forms 2.0 Object Library '----------------------------------------------------- ' text aus zwischenablage holen Set DaOb = New DataObject DaOb.GetFromClipboard sArr1 = Split(DaOb.GetText, "Incoming: [") If UBound(sArr1) > 0 Then For i = 1 To UBound(sArr1) sArr2 = Split(sArr1(i), "]") If sArr2(0) <> "" Then sArr2(0) = Replace(Replace(sArr2(0), vbCrLf, ""), " 49,", "") & "," sArr1 = Split(sArr2(0), ",") ' Text in feste Zelle(n) einfügen j = UBound(sArr1) - 4: If j < 0 Then j = 0 For k = 8 To 11 If j <= UBound(sArr1) Then Cells(3, k).Value = sArr1(j) sArr2(0) = Replace(sArr2(0), "," & sArr1(j) & ",", ",") Else Cells(3, k).Value = "" End If j = j + 1 Next k If Right$(sArr2(0), 1) = "," Then sArr2(0) = Left$(sArr2(0), Len(sArr2(0)) - 1) Range("B3").Value = sArr2(0) Exit Sub End If Next i End If Beep End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: Umbau der Eingabe
07.10.2024 15:48:46
Simon
Hab den Code so kopiert wie oben geht aber noch nicht...
Könnte die Zwischenablage mal als txt Datei hochladen wenn dies hilft...
AW: Umbau der Eingabe
07.10.2024 16:40:18
Volti
Wäre hilfreich
AW: Umbau der Eingabe
08.10.2024 15:44:38
Yal
Hallo Simon,

der json kommt in beiden Fälle mit genau dieselbe Struktur. Nur in Edge wird ein übergeordnete Objekt mitkopiert (warum auch immer).

Du musst zuerst das Objekt "Body" erfassen, dann das direkt unterliegende Objekt "StoragesInfo", dann das "Incoming"-Array.

Lade aus dem VBA-json Github die "jsonConverter.bas" runter
https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas
und importiere diese in deinem Excel-VBA-Projekt.

Dann kannst Du, wie schon vorab gezeigt, der json "konvertieren" und über den Pfad das richtige Objekt abgreifen.

Wir haben hier alle genug Material geliefert, um alles zusammenzubauen, und sogar sehr präzise Anleitungen. Nur die Fragen, die Du stellst, zeigen nicht, dass Du dich mit dem Material auseinandergesetzt hast, weil keine Fortschritt in der Fragestellung gibt. Es wird keine bessere Antwort als was schon geliefert wurde.

VG
Yal
Anzeige
AW: Umbau der Eingabe
08.10.2024 15:55:08
volti
Hallo Simon,

hier mal der angepasste Code zum Extrahieren der Incoming-Werte.
Ich hoffe es funktioniert jetzt bei Dir.

Es wird jetzt der Text aus der Zwischenablage so wie in den Textdateien ausgewiesen korrekt verarbeitet. Bisher konnte es nicht funktionieren, denn der Text in der Textdatei entspricht nicht dem, was Du hier im Form gezeigt hast. Und das war ja mein Reden....
So sind Zeilenumbrüche hinter den Werten, Items sind in Anführungsstrichen, die Werte haben mehrfache Leerzeichen vor sich usw..
Und auch jetzt finde ich in der Forefox-Version nur einmal Incoming.
Jetzt wird die letzte (oder einzige) Incoming ausgewertet, egal wieviel davor noch stehen.

Code:


Option Explicit '----------------------------------------------------- ' Vor erstellen des Codes ' aktiviere unter EXTRAS - VERWEISE den Verweis: ' Microsoft Forms 2.0 Object Library '----------------------------------------------------- Sub AusZwischenablage_zwischen_Klammern01() Dim DaOb As DataObject, WSh As Worksheet Dim sTxt As String, sArr() As String Dim i As Long, L As Long, iSp As Long, iZl As Long Set WSh = ThisWorkbook.Sheets("Tabelle1") ' Ausgabeblatt setzen iZl = 3 ' Ausgabezeile Set DaOb = New DataObject DaOb.GetFromClipboard ' Text aus Zwischenablage holen sTxt = Replace(Replace(Replace(DaOb.GetText, vbCr, ""), vbLf, ""), Chr(34), "") sArr = Split(sTxt, "Incoming: [") ' Text aufsplitten i = UBound(sArr) If i > 0 Then ' Richtiger Text in Zwischenablage? sTxt = Replace(Split(sArr(i), "]")(0), " ", "") ' Leerzeichen entfernen sTxt = Replace(sTxt, ",49,", ",") ' 49 entfernen sArr = Split(sTxt, ",") ' Text aufsplitten ' Text in feste Zelle(n) einfügen i = UBound(sArr) - 3: If i < 0 Then i = 0 ' Item-Beginn festlegen For iSp = 8 To 11 ' Extraausgaben If i <= UBound(sArr) Then WSh.Cells(iZl, iSp).Value = sArr(i) ' Item ausgeben L = L + Len(sArr(i)) + 1 ' Item-Längen aufaddieren Else WSh.Cells(iZl, iSp).Value = "" ' ggf. Feld löschen End If i = i + 1 ' Nächstes Item Next iSp WSh.Cells(iZl, "B").Value = "" ' Feld B3 erst mal leeren If L >= Len(sTxt) Then Exit Sub ' Keine Daten mehr =>raus sTxt = Left$(sTxt, Len(sTxt) - L) ' Text um die 4 Items kürzen WSh.Cells(iZl, "B").Value = Replace(sTxt, ",", ", ") ' Text formatiert ausgeben Else MsgBox "In der Zwischenablage befindet sich kein passender Text!", vbCritical End If End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: Umbau der Eingabe
07.10.2024 10:55:13
Yal
Hallo Simon,

es ist inzwischen deine 4te Anfrage für genau dieselbe Thema.

Ich habe eine ähnliche Frage gefunden, bei dem es darum geht, Information aus einem JSON zu extrahieren. Es arbeitet mit dem JSON-Parser (Link bereits mitgeteilt: https://github.com/VBA-tools/VBA-JSON )

https://www.herber.de/forum/archiv/1992to1996/1992157_Entfernungen_mittels_VBA_und_openrouteservice_ermitteln.html
siehe darin die Datei https://www.herber.de/bbs/user/172422.xlsm

Bei dir wird wohl den Pfad (json ist eine Baum, es gilt darin zu "navigieren", also den Pfad zum Zweig zu finden, wo die Information steht) so aussehen:
incoming = json("Body")("StoragesInfo")("Incoming")


Wie man daraus den ",49" durch Replace wegwerfen und die letzten 4 Werte extrahiert, ist bereits ausführlich diskutiert worden. Bring alles zusammen und wenn es doch noch nicht funktioniert, poste bitte dein zusammengefassten Code.

VG
Yal
Anzeige
AW: Umbau der Eingabe
07.10.2024 14:08:29
Simon
Hallo...

Könntest du mir den Anfang zeigen wie ich den Json definieren muss und aus der Zwischenablage bekomme und so formatiere das ich die Daten die ich brauche auslesen kann.

Danke
AW: Umbau der Eingabe
07.10.2024 14:56:35
Yal
Hallo Simon,

versuche den Code in der besagte Anlage 172422.xlsx zu lesen, laut und auf Deutsch. Du wirst merken, dass es nicht so kompliziert zu verstehen, wie es zuerst aussieht.
Mache Dir danach Gedanken, wie Du diesen Code anpassen müsste, um deine Daten aus deiner Web-Quelle zu lesen und einen Text-Variable zu übergeben.

Mache verschiedene Versuche, eventuell in Schritt-Modus (F8) und mit geöffnetem Lokalfenster, um den Stand der Variablen zu beobachten. Es hilft nicht viel, wenn wir das Problem komplett lösen, aber Du verstehst nichts davon.

Also Schritte 1: Diese Code verstehen, und schauen was angepasst werden muss
' API-Schlüssel hier eintragen

Const APIKey As String = "xxxxx" 'anpassen

Sub test()
GetIncoming "testwert1" 'anpassen
End Sub

Function GetIncoming(adresse As String) As String
Dim http As Object
Dim jsonResponse As String
Dim json As Object
Dim abgefragteURL As String
Dim coordinates As String

' Geocoding-URL erstellen
abgefragteURL = "https://api.openrouteservice.org/geocode/search?api_key=" & APIKey & "&text=" & adresse

' Debugging: URL anzeigen
Debug.Print "abgefragte URL: " & abgefragteURL

' HTTP-Anfrage senden
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", abgefragteURL, False
http.send
jsonResponse = http.responseText

' Debugging: Antwort anzeigen
Debug.Print "Response: " & jsonResponse

' Überprüfen, ob eine Antwort erhalten wurde
If jsonResponse > "" Then
' JSON analysieren
On Error GoTo JSONError
Set json = JsonConverter.ParseJson(jsonResponse)
'... HIER KOMMT NOCH WAS
GetIncoming = ...
Else
Debug.Print "Leere Antwort von der API."
End If
Exit Function

JSONError:
Debug.Print "Fehler beim Parsen der JSON-Antwort: " & Err.Description
End Function


Der json selbst sieht aus, wie von Dir gepostet: https://www.herber.de/forum/archiv/1992to1996/1992843_VBA_aendern_verbessern.html#1992893

VG
Yal
Anzeige
AW: Umbau der Eingabe
07.10.2024 15:13:43
Simon
Danke...

werde es versuchen...

Der Json kommt von RailNation leider kannst du nur mit Passwort rein..
müsste dir dann zur Nor mal meinen Login geben und dir sagen wo du was finden kannst...
AW: Umbau der Eingabe
07.10.2024 15:14:34
Simon
Danke...

werde es versuchen...

Der Json kommt von RailNation von versiedenen Welten, leider kannst du nur mit Passwort rein..
müsste dir dann zur Not mal meinen Login geben und dir sagen wo du was finden kannst...
Anzeige
AW: Umbau der Eingabe
07.10.2024 16:15:42
Simon
also müsste ich über der Tabelle Felder machen wo die Nutzer ihren Anmeldenamen, PW und die Welt eingeben müssten...
das müsste dann die VBA verarbeiten damit sie dann die richtige Seite im Internet hat.
oder sehe ich das jetzt falsch??
AW: Umbau der Eingabe
07.10.2024 15:26:06
Yal
Hallo Simon,

deine Credentials niemals in offenen Forum mitteilen!!
Ausserdem brauche ich diese nicht, weil ich nicht für sinnvoll achte, dass ich diese für dich wichtige Lernvorgang wegnehme.

VG
Yal
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige