Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1524to1528
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

Langer String mit Abkürzungen übersetzen

Langer String mit Abkürzungen übersetzen
18.11.2016 20:23:04
matthias
Hallo an Alle,
ich komme mal wieder nicht weiter und benötige Hilfe:
Ich habe einen String in einer Zelle mit Abkürzungen der so aussieht: *aaa/bbb*fff*hhh*sss/eee
Ein * trennt die Bezeichnungen, ein / ist als "oder" zu lesen.
Ich würde gerne diese Abkürzungen übersetzen und dann als Kommentar der Zelle hinzufügen.
Das sollte irgendwie nachher im Kommentar stehen:
aaa:Banane/bbb:Apfel fff:Orange hhh:Kirsche sss:Kiwi/eee:Traube
Problem dabei: die Abkürzungen stehen auf einem anderen Blatt irgendwo unsortiert, die Übersetzung, also die Frucht, immer rechts davon. Ich muss also nach der Abkürzung auf dem Blatt suchen wo diese steht.
Wie bekomme ich eine Variable hin die diese Übersetzung beinhaltet?
Jeder Ratschlag hilft, ich erwarte keine fertige Musterlösung.
Danke!

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Langer String mit Abkürzungen übersetzen
19.11.2016 00:36:23
Mullit
Hallo,
hier mal ein Ansatz...
Option Explicit

Public Sub test()
   Dim wksSearchSheet As Worksheet
   Dim objCell As Range
   Dim astrArray() As String
   Dim strNewText As String, strSlashText As String
   Dim ialngIndex As Long, ialngSlash As Long
   Set wksSearchSheet = Tabelle3 '// hier Dein Suchblatt anpassen... 
   With ActiveCell '// hier Deine String-Zelle anpassen... 
        If .Value <> vbNullString Then
            astrArray() = Split(Expression:=.Value, Delimiter:="*", Compare:=vbTextCompare)
            For ialngIndex = 0 To Ubound(astrArray)
                If astrArray(ialngIndex) <> vbNullString Then
                  If InStr(1, astrArray(ialngIndex), "/", vbTextCompare) <> 0 Then
                     For ialngSlash = 0 To 1
                         strSlashText = Split(Expression:=astrArray(ialngIndex), Delimiter:="/", Compare:=vbTextCompare)(ialngSlash)
                         Set objCell = wksSearchSheet.Cells.Find(What:= _
                           strSlashText, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
                         If objCell Is Nothing Then
                           Call MsgBox("Wert nicht gefunden...", vbExclamation)
                         Else
                           strNewText = strNewText & strSlashText & ":" & objCell.Offset(0, 1).Value & IIf(ialngSlash = 0, "/", " ")
                           Set objCell = Nothing
                         End If
                     Next
                  Else
                     Set objCell = wksSearchSheet.Cells.Find(What:= _
                        astrArray(ialngIndex), LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
                     If objCell Is Nothing Then
                        Call MsgBox("Wert nicht gefunden...", vbExclamation)
                     Else
                        strNewText = strNewText & astrArray(ialngIndex) & ":" & objCell.Offset(0, 1).Value & " "
                        Set objCell = Nothing
                     End If
                  End If
                End If
            Next
            If strNewText <> vbNullString Then
                If Not .Comment Is Nothing Then Call .Comment.Delete
                Call .AddComment(Text:=strNewText)
            End If
        Else
            Call MsgBox("Die Zelle ist leer...", vbExclamation)
        End If
   End With
   Set wksSearchSheet = Nothing
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß, Mullit
Anzeige
AW: Langer String mit Abkürzungen übersetzen
19.11.2016 08:15:01
matthias
Wow! Das ist ja der Hammer! Vielen herzlichen Dank!
Ich werde es gleich mal am Montag testen und dann Rückmeldung geben.
Beste Grüße Matthias
AW: Langer String mit Abkürzungen übersetzen
21.11.2016 21:09:19
Matthias
Hallo zusammen,
ich habe versucht den Vorschlag von Mullit anzupassen, es klappt aber noch nicht so ganz bei 2 Dingen:
1. Wie bekomme ich die Schleife zum laufen, so dass mir für jede neue Zelle die ich durchlaufe die Variablen zurückgesetzt werden!?
Ansonsten wird mein String immer länger da alles von davor noch mit hineingewurschtelt wird.
2. Problem macht mir noch "For ialngSlash = 0 To 1" - Wenn ich einen Slash habe klappt es, bei mehreren nicht, dann muss ich das 0 To x anpassen. Wie mache ich das Variabel egal wieviele Slashs ich habe?
Vielen Dank!!!
Dim wksSearchSheet As Worksheet
Dim objCell As Range
Dim astrArray() As String
Dim strNewText As Variant, strSlashText As String
Dim ialngIndex As Long, ialngSlash As Long
Dim letzteZeile_VGL As Long
Dim Spalte As Long, Zeile As Long
Set wksSearchSheet = Tabelle1 '// hier Dein Suchblatt anpassen...
letzteZeile_VGL = Cells(Rows.Count, 2).End(xlUp).Row 'letzte Zeile
For Spalte = 4 To 5
For Zeile = 1 To letzteZeile_VGL
'Variablen zurücksetzen
With Cells(Zeile, Spalte) '// hier Deine String-Zelle anpassen...
.Select
If .Value  vbNullString Then
astrArray() = Split(Expression:=.Value, Delimiter:="+", Compare:=vbTextCompare)
For ialngIndex = 0 To UBound(astrArray)
If astrArray(ialngIndex)  vbNullString Then
If InStr(1, astrArray(ialngIndex), "/", vbTextCompare)  0 Then
For ialngSlash = 0 To 5
strSlashText = Split(Expression:=astrArray(ialngIndex), Delimiter:="/", _
Compare:=vbTextCompare)(ialngSlash)
Set objCell = wksSearchSheet.Cells.Find(What:=strSlashText, LookIn:= _
xlValues, LookAt:=xlWhole, MatchCase:=False)
If objCell Is Nothing Then
strNewText = strNewText & strSlashText & ": " & "*NICHT VORHANDEN*" & _
IIf(ialngSlash = 0, " ODER ", " ODER ") & Chr(10)
Else
strNewText = strNewText & strSlashText & ": " & objCell.Offset(0, 1). _
Value & IIf(ialngSlash = 0, " ODER ", " ODER ") & Chr(10)
Set objCell = Nothing
End If
Next
Else
Set objCell = wksSearchSheet.Cells.Find(What:=astrArray(ialngIndex),  _
LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If objCell Is Nothing Then
strNewText = strNewText & astrArray(ialngIndex) & ": " & "*NICHT  _
VORHANDEN*" & " UND " & Chr(10)
Else
strNewText = strNewText & astrArray(ialngIndex) & ": " & objCell.Offset( _
0, 1).Value & " UND " & Chr(10)
Set objCell = Nothing
End If
End If
End If
Next
If strNewText  vbNullString Then
If Not .Comment Is Nothing Then Call .Comment.Delete
Call .AddComment(Text:=strNewText)
End If
Else
GoTo Ende
End If
End With
Set wksSearchSheet = Nothing
Ende:
Next Zeile
Next Spalte 

Anzeige
AW: Langer String mit Abkürzungen übersetzen
21.11.2016 23:38:43
Mullit
Hallo,
na ganz einfach, setz in Deiner neuen ZellenDurchlauf-Schleife bei jedem Durchlauf die StrText-Variable auf LeerString, die Slashes werden bereits variabel abgefragt über Ubound(astrArray), den SlashIndex darfst Du nicht anfassen, der sucht immer nur ein Wort-Paar mit Slash und schmeiß Deine Gotos und Selects aus meiner schönen Vorlage, sonst müssen wir uns mal über Dein VBA-Gut-Attribut unterhalten...
Gruß, Mullit
AW: Langer String mit Abkürzungen übersetzen
22.11.2016 20:45:55
matthias
Ich nehme alles zurück! Funktioniert perfekt, ohne Select und Goto :)
Danke!!!
AW: Langer String mit Abkürzungen übersetzen
27.11.2016 15:27:57
Matthias
Hallo Mullit,
leider klappt der Code doch noch nicht so ganz.
Ab einem zweiten Slash funktioniert er leider nicht mehr, es wird nicht alles übersetzt...
Hier mal eine Beispieldatei:
https://www.herber.de/bbs/user/109749.xlsm
Könntest du mal bitte nachschauen wo es hakt?
Danke!!
Anzeige
AW: Langer String mit Abkürzungen übersetzen
27.11.2016 15:30:07
Matthias
Hallo Mullit,
leider klappt der Code doch noch nicht so ganz.
Ab einem zweiten Slash funktioniert er leider nicht mehr, es wird nicht alles übersetzt...
Hier mal eine Beispieldatei:
https://www.herber.de/bbs/user/109749.xlsm
Könntest du mal bitte nachschauen wo es hakt?
Danke!!
AW: Langer String mit Abkürzungen übersetzen
19.11.2016 00:39:47
Martin
Hallo Matthias,
eigentlich ist das alles recht einfach:
1. Die "Übersetzungen" überführst du einmal in ein Dictionary Object, welches für denen Zweck ideal geeignet ist. Dabei nimmst du die Abkürzung als Schlüssel und den vollen Namen der Frucht als Wert.
2. Den String überführst du per Split-Funktion in ein Array:
arrFruits = Split(strAbkuerzungen, "*")
3. Jedes einzelne Datenfeld des Array gehst du wieder per Split durch, nur halt mit dem "/" als Trennzeichen
4. Nun kannst du ganz bequem jede Abkürzung im Dictionary Object "übersetzen lassen"
Viele Grüße
Martin
Anzeige
Muss denn der Kommentar so aussehen, ...
19.11.2016 03:04:12
Luc:-?
…Matthias,
wie von dir gezeigt? Als Text in einem Zell-Kommentarfeld wäre doch eine einfache Auflistung der verwendeten Abkk + ihr voller Name, ggf durch Zeilen­Umbruch, ZEICHEN(10) bzw vbLf, verbunden, sinnvoller. In diesem Fall könnte dieser Text auch per ZellFml in einer Zelle erzeugt wdn, wobei die Arbeit mit UDFs bequemer wäre:
aaa:Banane bbb:Apfel fff:Orange hhh:Kirsche sss:Kiwi eee:Traube
{=WAHL(ZEILE(A1:A2);VJoin(SplitVx(A1;{"*";"/"}) &":"&SVERWEIS(SplitVx(A1;{"*";"/"});Tabelle2!A1:B6;2;0));"") }
Diese Fml ist allerdings eine duale MatrixFml, d.h., Xl berechnet nur dann das richtige Ergebnis, wenn zusätzlich zum MatrixFmlAbschluss der FmlEingabe auch noch 2 Zellen ausgewählt wurden. Die nicht benötigte 1. bzw 2. Ergebnis­Darstellung kann per WAHL durch LeerText ersetzt wdn.
Muss es aber unbedingt die von dir angegebene Form sein, wird die duale MatrixFml° länger und, um die Fml einiger­maßen kurz zu halten, eine andere UDF benötigt, die aber nicht im Archiv vorliegt:
aaa:Banane/bbb:Apfel fff:Orange hhh:Kirsche sss:Kiwi/eee:Traube
{=WAHL(ZEILE(A1:A2);RepOpt("substitute"; ANZAHL2(SplitVx(A1;{"*";"/"}));1;{2.3};GLÄTTEN(WECHSELN(A1;"*";" ")); SplitVx(A1;{"*";"/"});SplitVx(A1;{"*";"/"}) &":"&SVERWEIS(SplitVx(A1;{"*";"/"});Tabelle2!A1:B6;2;0));"") }
Nur mit im Archiv vorliegenden UDFs würden die gezeigten Ergebnisse eine andere Basis bekommen müssen, deren duale MatrixFml° im einfachen 1.Fall so lautet:
{=WAHL(ZEILE(A1:A2); GLÄTTEN(VJoin(WENN(VSplit(WENN(LÄNGE(VSplit(A1; "*";;1))<4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1) );
"/")="";"";VSplit(WENN(LÄNGE(VSplit(A1;"*";;1))<4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/")&":"&
SVERWEIS(VSplit(WENN(LÄNGE(VSplit(A1;"*";;1))<4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/");Tabelle2!A1:B6;2;0));" ";-2));"")}
Dabei müssen die Abkk aber immer 3 Zeichen lang und maximal 2 per Oder-/ verbunden sein. Wenn garantiert wdn kann, dass die Texte entweder immer oder niemals mit * beginnen, würde diese Fml kürzer ausfallen können.
Für den 2.Fall würde die(se) Fml ungleich länger wdn und so aussehen:
{=WAHL(ZEILE(A1:A2); VJoin(INDEX(WENN(VSplit(WENN(LÄNGE(VSplit(A1; "*";;1))<4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1) );"/")="";"";VSplit(WENN(LÄNGE(VSplit(A1;"*";;1))< 4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/") &":"&SVERWEIS(VSplit(WENN(LÄNGE(VSplit(A1;"*";;1)) <4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/"); Tabelle2!A1:B6;2;0));ZEILE(A1:A5);1) &WENN(INDEX(WENN(VSplit(WENN(LÄNGE(VSplit(A1;"*";;1)) <4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/") ="";"";VSplit(WENN(LÄNGE(VSplit(A1;"*";;1))<4; VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/") &":"&SVERWEIS(VSplit(WENN(LÄNGE(VSplit(A1;"*";;1)) <4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/"); Tabelle2!A1:B6;2;0));ZEILE(A1:A5);2)="";""; "/"&INDEX(WENN(VSplit(WENN(LÄNGE(VSplit(A1;"*";;1)) <4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/") ="";"";VSplit(WENN(LÄNGE(VSplit(A1;"*";;1))<4; VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/") &":"&SVERWEIS(VSplit(WENN(LÄNGE(VSplit(A1;"*";;1)) <4;VSplit(A1;"*";;1)&"/";VSplit(A1;"*";;1));"/"); Tabelle2!A1:B6;2;0));ZEILE(A1:A5);2)));"") }
° Alle dualen MatrixFmln umfassen hier stets 2 vertikal aufeinander folgende Zellen.
Diese Aufgabe habe ich als ein Bsp dafür verwendet, was an TextVerarbeitung standardmäßig in Xl fehlt, aber per intelligent gemachten mehr oder weniger universellen UDFs möglich wäre. Außerdem habe ich hiermit einen weiteren Bleg für die Existenz dualer MatrixFmln geliefert, die auch im Zusammenhang mit alleiniger Anwendung von XlStandardFktt, besonders bei bestimmten INDEX-Anwendungs­Varianten, auftreten können.
ArchivLinks zu den letztgeposteten Versionen folgd UDFs (einige in hochgeladenen BspMappen):
SplitVx: https://www.herber.de/cgi-bin/callthread.pl?index=1301785#1301987
VJoin:    https://www.herber.de/bbs/user/99024.xlsm
VSplit:    https://www.herber.de/bbs/user/99024.xlsm
Wenn allerdings nur ein KommentarFeld angelegt wdn soll, dürfte eine Lösung anhand der Vorgaben bzw Vorschläge von Mullit u/o Martin rationeller sein.
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige