Excel Vokabelliste bereinigen

Hi, google weiss zwar viele Antworten auf meine Frage, aber irgendwie komm ich damit nicht recht klar…
Ich exportiere meine dict.cc Vokabelliste in eine txt-Datei, die oeffne ich dann in Excel - soweit so gut. Die Datei enthaelt in Spalte A das Deutsche Wort, in Spalte B das Englische.
Nun kann es sein, dass ein Englisches Wort mit mehreren Deutschen Bedeutungen enthalten ist. Das saehe in der Liste so aus:

A / B

Hund / dog
strafend / punitive
Straf- / punitive

ich will die liste nun so bereinigen, dass es dann so aussieht:

A / B

Hund / dog
strafend, Straf- / punitive

also dass mehrfache Bedeutungen in nur einer Zeile mit Komma gereiht werden.
Hat da irgendjemand ne Idee???

A / B

Hund / dog
strafend / punitive
Straf- / punitive

ich will die liste nun so bereinigen, dass es dann so
aussieht:

A / B

Hund / dog
strafend, Straf- / punitive

Hallo Biz,

teste das an einer Kopie deiner Mappe. Alt+F11, Einfügen—Modul.
Dortrein kopierst du nachstehenden Code, schließt den VB-Editor.
In Excel dann Alt+F8, lass das Makro „Zusammen“ ausführen.
Berichte was geschieht oder eben nicht.

Wenn der Code nicht perfekt funktioniert so lade mal mit dem obersten
Hochladlink in FAQ:2606 eine Beispieltabelle hoch mit so
100 Datenzeilen. Ich habe mit deinen daten in A1:B3 getestet,
sind sehr wenig Testdaten.

Gruß
Reinhard

Option Explicit

Sub Zusammen()
Dim wksH As Worksheet, Zei As Long
With Worksheets("Tabelle1")
 Worksheets.Add
 Set wksH = ActiveSheet
 .Range("A:B").Copy wksH.Range("A1")
 Zei = wksH.Cells(Rows.Count, 2).End(xlUp).Row
 wksH.Range("A1:B" & Zei).Sort Key1:=wksH.Range("B1"), Order1:=xlAscending, Header:=xlNo, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
 wksH.Range("D1:smiley:" & Zei).Formula = "=IF(B1=B2,"""",1)"
 wksH.Range("C1").Formula = "=A1"
 wksH.Range("C2:C" & Zei).Formula = "=IF(B1=B2,C1&"", ""&A2,A2)"
 wksH.Range("C1:smiley:" & Zei).Value = wksH.Range("C1:smiley:" & Zei).Value
 Application.DisplayAlerts = False
 On Error Resume Next
 wksH.Range("D1:smiley:" & Zei).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
 wksH.Range("C:C").Copy .Range("A1")
 wksH.Range("B:B").Copy .Range("B1")
 wksH.Delete
 .Range("A:B").Columns.AutoFit
 Application.DisplayAlerts = True
End With
End Sub

Hey, danke fuer die Antwort + Programmierung!
Allerdings meldet VB beim Ausfuehren:

Laufzeitfehler ‚9‘:
Index außerhalb des gültigen Bereichs

Hm…

Laufzeitfehler ‚9‘:
Index außerhalb des gültigen Bereichs

Hallo blz,

zu welcher Codezeile?
Vllt. anderer Blattname…

Wie gesagt, lade mal Mappe hoch…

Gruß
Reinhard

Hi,
ich hab das Dokument mal hier hochgeladen:

DE-EN-88320.xlsm:

Link auf User-Wunsch entfernt - Thomas Ramel 

Hm, daemlich, ich hab den Dateinamen im Skript nicht ersetzt, glaub das war das Problem…
Scheint jetzt zu funktionieren :smile:
Das ist doch jetzt sicherlich nicht schwer das noch so zu modifizieren, dass es auch noch zusaetzlich in die andere Richtung funktioniert, also, wenn ein Deutsches Wort in zwei Zeilen auftaucht, dann dazu die englischen Bedeutungen mit Komma zu reihen, oder?

ich hab das Dokument mal hier hochgeladen:

Link auf User-Wunsch entfernt - Thomas Ramel 

Hallo blz,

„Vllt. anderer Blattname…“ bedeutete überprüfe im Code den Blattnamen.
Ändere die With-Codezeile so ab:
With Worksheets(„DE-EN-88320“)

Gruß
Reinhard

Hallo blz,

Hm, daemlich, ich hab den Dateinamen im Skript nicht ersetzt,
glaub das war das Problem…
Scheint jetzt zu funktionieren :smile:

überprüfe das bitte genauestens. Sind ja nich so viel Daten,
wenn du da eine Spalte sortierst kannst du ja manuell sehen
wo was „doppelt oder mehrfach“ ist.

In der Ausgangstabelle sind 57 Datensätze. Acht mal werden
Daten Kommagetrennt zusammengefasst, also müßten dann 57 - 8
= 49 Datensätze übrig bleiben, sind aber nur 48?
Das irritiert mich. Vllt mache ich da einen Denkfehler so wie man
einen macht wenn man denkt daß im Zellbereich A10:A20 10 Zellen sind
was falsch ist da es 11 sind. Verifiziere das bitte.

Das ist doch jetzt sicherlich nicht schwer das noch so zu
modifizieren, dass es auch noch zusaetzlich in die andere
Richtung funktioniert, also, wenn ein Deutsches Wort in zwei
Zeilen auftaucht, dann dazu die englischen Bedeutungen mit
Komma zu reihen, oder?

Das ist richtig. Man muß nur an den richtigen Stellen im Code die
Spalten vertauschen.

Vorher Fragen dazu.
Wieviele Datensätze sollen es denn mal werden?
500, 1000, 5000, 10.000, …?

Soll der Code je nachdem gleich nach der engl. bzw. dt. Spalte
sortieren?

Gruß
Reinhard

Hallo Reinhard,
vielen Dank fuer Deine Bemuehungen!

Ich habe ueberprueft, wieviele Datensaetze zusammengefasst werden. Es sind 9. Dabei kommt ein Englisches Wort dreimal vor. Vllt hast du Dich deshalb verzaehlt. Auf jeden Fall muesste es also so stimmen, denn 57 - 9 ergibt ja dann 48!

Zu der Frage wieviel Datensaetze es dann werden sollen:
Ich denke, dass es keinesfalls mehr als 500 werden!
(Aber spielt das eine Rolle fuer den Code? funktioniert das nicht mit einer beliebigen Menge?)

Zur Frage, ob der Code je nachdem nach der Englischen oder Deutschen Spalte sortieren soll:
Ich habe das so gemeint, dass man die Datei wie gehabt bekommt, aber das moeglicherweise in einer Datei (wie auch in der Beispieldatei, die du hast) einige Woerter mehrfach in Deutsch und einige Woerter mehrfach in Englisch enthalten sind.
Ideal waere es, wenn das Programm die Datei parst und also in der selben Datei einerseits die Englischen Bedeutungen eines in Deutsch mehrfach vorkommenden Wortes mit Kommata aneinanderreiht und andererseits, wenn ein Englisches Wort in mehreren Zeilen vorkommt, dessen Deutsche Bedeutungen mit Kommata aneinanderreiht.

Hallo blz,

Ich denke, dass es keinesfalls mehr als 500 werden!
(Aber spielt das eine Rolle fuer den Code? funktioniert das
nicht mit einer beliebigen Menge?)

die Menge spielt eine Rolle bei der Wahl des Codes aus
Schnelligkeitsgründen.

Ideal waere es, wenn das Programm die Datei parst und also in
der selben Datei einerseits die Englischen Bedeutungen eines
in Deutsch mehrfach vorkommenden Wortes mit Kommata
aneinanderreiht und andererseits, wenn ein Englisches Wort in
mehreren Zeilen vorkommt, dessen Deutsche Bedeutungen mit
Kommata aneinanderreiht.

Nachstehender Code erwartet ein Blatt mit Namen „Original“.
Heißt dein Blatt anders so ändere das im Code an dieser Stelle ab:
Set wksO = Worksheets(" Original")
Die deutschen Worte sollen in Spalte A sein, die engl. in B

Du startest den Code indem du im VB-Editor den Cursor irgendwo in den
Code von „Sub Start()“ stellst und F5 drückst.
Alternativ in Excel Alt+F8 drücken, dann das Makro Start ausführen
lassen.

Durh die Codezeilen
Call Zusammen(„DE“)
Call Zusammen(„EN“)
werden zwei Blätter erzeugt mit Namen „DE“ und „EN“.
Existierende Blätter mit diesen Namen werden im Verlauf des Codes
gelöscht.

Blatt „DE“ hat in A die dt. Wörter, in B die durch Komma getrennten
engl. Wörter.
Blatt „EN“ hat in A die engl. Wörter, in B die durch Komma getrennten
dt. Wörter.

Willst du den erzeugten Blättern andere Namen geben so mußt du diese
drei Codezeilen abändern:
Call Zusammen(" DE")
Call Zusammen(" EN")
If DE_EN = " DE" Then

Gruß
Reinhard

Option Explicit

Sub Start()
Call Zusammen("DE")
Call Zusammen("EN")
End Sub

Sub Zusammen(ByVal DE\_EN As String)
Dim wksO As Worksheet, Zei As Long, wks As Worksheet
Set wksO = Worksheets("Original")
For Each wks In Worksheets
 If wks.Name = DE\_EN Then
 Application.DisplayAlerts = False
 wks.Delete
 Application.DisplayAlerts = True
 Exit For
 End If
Next wks
Worksheets.Add after:=Worksheets(Worksheets.Count)
With ActiveSheet
 .Name = DE\_EN
 If DE\_EN = "DE" Then
 wksO.Range("A:B").Copy .Range("A1")
 Else
 wksO.Range("A:A").Copy .Range("B1")
 wksO.Range("B:B").Copy .Range("A1")
 End If
 Zei = .Cells(Rows.Count, 1).End(xlUp).Row
 .Range("A1:B" & Zei).Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlNo, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
 .Range("D1:smiley:" & Zei).Formula = "=IF(A1=A2,"""",1)"
 .Range("C1").Formula = "=B1"
 .Range("C2:C" & Zei).Formula = "=IF(A1=A2,C1&"", ""&B2,B2)"
 .Range("C1:smiley:" & Zei).Value = .Range("C1:smiley:" & Zei).Value
 On Error Resume Next
 .Range("D1:smiley:" & Zei).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
 .Range("B:B,D:smiley:").Delete
' .Range("C:C").Copy .Range("A1")
' .Range("B:B").Copy .Range("B1")
 .Range("A:B").Columns.AutoFit
End With
End Sub

Hm… ich bekomm wieder nen Laufzeitfehler, obwohl die Mappe definitv Original.xlsm heisst…