Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Texte zum Übersetzen finden
#21
Hallo Phil.VBA

Zitat:Passt das, oder wid vieless übersehen?
Der Satz ist Satire, gell? Sleepy

Die Lösung ist geil, auch wenn sie mit VBA nix zu tun hat.
Es lohnt sich, sich damit auseinanderzusetzen, bzw.damit zu spielen.
So hab ich den .pattern verändert:

.Pattern = "[A-Za-zäöüÄÖÜ][a-zäöü][ a-zäöü.]{1,}"
anschließend muss man natürlich händisch aussortieren, das hätte man sowieso in jedem Fall machen müssen, auch um Namen herauszunehmen, und Worte, die nicht deutsch sind, aber nun werden Worte wie 
ab
im
in
zu
nicht unterschlagen.

Und ich bekomme Kombinationen. 
Da nach italienisch und französisch übersetzt wird, wo sich die Schreibweise der Adjektive nach dem Geschlecht der Substantive ändert, ist es gut die Kombi zu haben.
Dein .Count+1 liefert in der letzten Zeile der Spalte C ein #NV und ist daher vielleicht unnötig hochzuzählen

Noch ne Frage zum Schluss
dein ersetzen in Beitrag #19 ist Case-sensitiv?
Antworten Top
#22
@Wastl

eine haklige Tastatur und kein Korrekturlesen schafft DIE Realsatire!

Wenn ich diese Aufgabe hätte, würde ich vermutlich die "Sieb-Methode" anwenden:

Zuerst die Einheiten (z.B. mm, m2 aus den ersten 30 Zeilen) löschen, dann alles mit mehreren Großbuchstaben, alle Zahlen, Sonderzeichen usw.

Hier im Forum gilt eher "der will doch nur spielen", da sind (sehr schlecht geprüfte) RegEx Pattern angesagt.

Um auch die Präpositionen zu erfassen, könnte eine Variante sein:



Code:
.Pattern = "[a-z]{0,}\s[A-Za-zäöüÄÖÜ][a-zäöü][ a-zäöü.]{1,}"


Damit sollten (ungeprüft!) auch alle "um", "zu" usw erfasst werden.

Egal welchen Ansatz man wählt, es sind viele Anläufe notwendig.
[-] Folgende(r) 1 Nutzer sagt Danke an Phi.VBA für diesen Beitrag:
  • Wastl
Antworten Top
#23
Ja,

aber nun haben sehr viele Funde vorn und hinten noch ein Leerzeichen
Das bekomme ich zwar mit glätten() weg, aber schöner wärs ich täts gar nicht bekommen.
Antworten Top
#24
Hi

beim Ersetzen solltest du dann noch etwas beachten.   Siehe Anhang.
Klein/Groß wird berücksichtigt wenn MatchCase:=True.

.xlsm   Ersetzen 2.xlsm (Größe: 22,34 KB / Downloads: 1)
Antworten Top
#25
Hallo Elex, hallo zusammen,

Zitat:beim Ersetzen solltest du dann noch etwas beachten.   Siehe Anhang.
Klein/Groß wird berücksichtigt wenn MatchCase:=True.

davon bin ich nicht wirklich begeistert, außerdem geht das an der Sache vorbei.
Rückwärts wird gar nicht benötigt. (ich bin nun schlauer als beim Erstellen von #1)
Rückwärts ist Aufgabe des Übersetzers, der hat dafür Tools und will natürlich auch Geld dafür haben.
So sind die Preise unterschiedlich, ob ein Wort neu übersetzt werden muss oder ob es Wiederholungen sind.

Wir haben uns so beholfen:
1. Setze in Spalte B einen Index bis ganz unten.
2. Sortiere Spalte A Aufsteigend. Dadurch kann man mit dem Auge Blöcke erkennen, die nicht übersetzt werden müssen, und diese löschen.

Übrig bleiben die Zeilen mit zu übersetzenden Texten, Wenn man die Spalten A:B wieder nach B aufsteigend sortiert, sind die zu übersetzenden Zeilen wieder am richtigen Platz.
Der Zeitaufwand, die Blöcke zu löschen, ist aufwendig. Bei fast 90.000 Zeilen vergeht da ein Tag wie im Flug.
###
Darum habe ich überlegt, wie man das vereinfachen kann, und aus den Vorschlägen von den Forenbeantwortern mir was zusammengestrickt.
Das Tool macht folgendes:
Nachdem die nicht benötigten Zeichen in der Zelle entfernt wurden, bleiben Buchstabenkombis übrig, die Wörter sein können.
Wenn diese mehr als 2 Zeichen lang sind*), wird der User gefragt, ob das Wort zu übersetzen ist, oder nicht.
Sowohl die ja-Antworten als auch die nein-Antworten wandern in je eine Collection
Bei der nächsten Zeile wird zuerst geschaut, ob das gefundene Wort schon in den beiden Collections enthalten ist.
Wenn ja, ist bereits klar, was damit zu tun ist, wenn nein, User fragen.

Mit dieser Datei habe ich mal 336 Wörter zum Übersetzen gefunden und 216, die nicht übersetzt werden sollen.
In den Zeilen, in denen kein ja-Wort enthalten ist, wird in Spalte C ein x gesetzt.
Spalten A:C nach C sortiert, sind alle X oben und können auf einmal gelöscht werden.
Wörterliste 'Richtig' wird nach Spalte E, Wörterliste 'Falsch' wird nach Spalte F geschrieben.
So kann man nochmal kontrollieren, im Fall dass man sich verklickt hat bei der User-Entscheidung. 
Und ggf. Änderungen durchführen.

Die Laufzeit des Tools ist abhängig von der Schnelligkeit des Users-Klickens, aber bei knapp 600 Entscheidungen ist das deutlich kürzer, als ein Tag.

Und hier nun mein Code:
Code:
Option Explicit

Sub TradosVorb()
Dim Ar As Variant
Dim colWort As New Collection
Dim colFal As New Collection
Dim i As Long, Behalt As Boolean, Tx As Variant, k As Integer, N As Integer, M As Integer, Frage As Integer, j As Integer, Eintrag As Variant, Item As Variant
Dim jj As Integer
Ar = ActiveSheet.UsedRange.Columns(1)   ' Spalte A

For i = 2 To UBound(Ar)
   If Len(Cells(i, 1)) < 200 And Cells(i, 1) <> "" Then
   Behalt = False
       Tx = Cells(i, 1)
' Zeichen durch Leerzeichen ersetzen
               For jj = 1 To 17
                   Tx = Replace(Tx, Mid("0123456789+,='/-", jj, 1), " ")
                   If jj < 4 Then Tx = Replace(Tx, Chr(Choose(jj, 9, 10, 34)), " ")
               Next
               Tx = Split(Application.Trim(Tx))

      For k = 0 To UBound(Tx)
          If Len(Tx(k)) > 2 Then
' Texte in Großbuchstaben ignorieren
               If Tx(k) <> UCase(Tx(k)) Then
                   Cells(i, 1).Select
                   On Error Resume Next
                   N = 0
' in ColFal werden die Worte gesammelt, die nicht übersetzt werden müssen, Jeder Tx(k)-Wert wird abgefragt, ob er schon drinsteht
                    For Each Eintrag In colFal
                        If Eintrag = Tx(k) Then N = 100: Exit For
                    Next
                    M = 0
' in ColWort werden die Worte gesammelt, die übersetzt werden müssen, Jeder Tx(k)-Wert wird abgefragt, ob er schon drinsteht
' Wenn ja, wird Behalt auf true gesetzt
                    For Each Eintrag In colWort
                        If Eintrag = Tx(k) Then M = 100: Behalt = True: Exit For
                    Next
' ist Tx(k) schon in einer Liste enthalten, ist nichts zu tun
                    If Behalt = True Then Exit For
' ist tx(k) in keiner Liste enthalten, dann muss er jetzt rein, User entscheidet
                    If N <> 100 And M <> 100 Then
                        Frage = MsgBox(Tx(k), vbYesNo, "= gut ?  Zeile = " & i)
                            If Frage = 7 Then
                                colFal.Add Item:=Tx(k)
                            ElseIf Frage = 6 Then
                                colWort.Add Item:=Tx(k)
                                Behalt = 1
                            End If
                   On Error GoTo 0
                   End If
               End If
          End If
      Next k
' Wenn Behalt Wahr ist, muss das x aus Spalte C raus, wenn Falsch - rein
   If Behalt = True Then
       Cells(i, 3) = ""
   Else
       Cells(i, 3) = "x"
   End If
End If
Next i
' Richtig-Liste wird erstellt
ReDim arr(1 To colWort.Count)
For Each Item In colWort
   j = j + 1
   arr(j) = colWort(j)
Next
[E1].Select
Columns(5).Clear
Columns(6).Clear
Range("E1") = "Richtig"
Range("E2").Resize(colWort.Count, 1) = Application.Transpose(arr)
Columns("E:E").RemoveDuplicates Columns:=1, Header:=xlYes
Range("E2:E" & colWort.Count).Sort Key1:=Range("E1"), Order1:=xlAscending
' Falsch-Liste wird erstellt
j = 0
ReDim arr(1 To colFal.Count)
For Each Item In colFal
   j = j + 1
   arr(j) = colFal(j)
Next
Range("F1") = "Falsch"
Range("F2").Resize(colFal.Count, 1) = Application.Transpose(arr)
Columns("F:F").RemoveDuplicates Columns:=1, Header:=xlYes
' Schön machen und Autofilter setzen erste 3 Spalten
Range("F2:F" & colFal.Count).Sort Key1:=Range("F1"), Order1:=xlAscending
Range("c1") = "C"
Range("A1:C1").AutoFilter
' Sortieren nach C absteigend und A aufsteigend
   Columns("A:C").Select
   ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
   ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range( _
       "C2:C" & UBound(Ar)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
       xlSortNormal
   ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range( _
       "A2:A" & UBound(Ar)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
       xlSortNormal
   With ActiveWorkbook.ActiveSheet.Sort
       .SetRange Range("A1:C" & UBound(Ar))
       .Header = xlYes
       .MatchCase = False
       .Orientation = xlTopToBottom
       .SortMethod = xlPinYin
       .Apply
   End With


End Sub
*)
Dabei gehen nun die Wörter mit 2 Buchstaben unter.
zu
in
im
an

Nach diesen lässt sich aber mit Strg+F > alle Suchen mit davor bzw dahintergesetzten Leerzeichen einfach fanden, und bei Fund, das x in C entfernen.
Antworten Top
#26
@Wastl

nur aus Interesse:

Mein Code mit RegEx und Dictionara filtert ca. 450 Worte in 1 Sekunden. Der Code ist wesentlich kürzer und leicht vertändlich (wenn man RegEx kennt). Wieso war die Entscheidung dann für das komplizierte Tool?
Antworten Top
#27
Hi Phil,

Dein Vorschlag ist Klasse, ich hab mich nun 3 Tage mit regexp beschäftigt.
Ein unwahrscheinlich mächtiges Werkzeug, keine Frage.
Das zusammensetzen des Suchstrings ist zwar nicht trivial, aber ich kann in 'Notepad++' ausprobieren, was ich in Excel dann einbauen kann.

Aber, wie auch immer, es findet viel Müll, den ich dennoch immer noch von Hand entfernen bzw entscheiden muss.
Mein letzter Suchstring, der die besten Ergebnisse lieferte lautet:
\b[^0-9\-,\/\+]{0,}[A-Za-zäöüÄÖÜ.][A-Za-zäöüÄÖÜ. ]{1,}\b

Ich habe dann darüber geschlafen und mich für die Lösung in #25 entschieden, auch weil ich sie eventuell weitergebe an Kollegen, die nicht so fit in Excel sind.

Beispiel:
Der Datei, die ich bekommen habe, war beigefügt:
" Die Nummerierung in Spalte B muss noch fertig gestellt werden."
Die Nummerierung ging von 1…345. Bitte frage mich nicht, wie das angestellt wurde.

Und dieser Kollegin möchte ich ein Tool an die Hand geben, damit ihr, in einem ähnlich gelagerten Auftrag, eine Erleichterung möglich ist.
Und bevor ich sowas tue, wollte ich euch nochmal drüber schauen lassen.

Natürlich ist mir bewusst, dass ich, um ein Tool narrensicher zu machen, 3x so viel Zeit aufwenden muss, als für das Programm an sich. Und wenn nur ich es benutze, kann ich alle Sicherheitsmaßnahmen sein lassen.

Nur eines interessiert mich noch. Warum ein dictionary? eine collection hätte es doch auch getan?
Du änderst in deinem Code doch keine Werte, zumindest habe ich das nicht entdecken können.
Die Vorteile von dict gegenüber Col verwendest du doch gar nicht
https://excelicious.wordpress.com/2010/0...ollection/
oder gibts noch mehr Vorteile, die hier nicht genannt sind?
Antworten Top
#28
@Wastl

ich nutze "Dictionary", weil das einfach besser eingeübt ist. Bei wenigen Vergleichtests war Dictionary schneller als Collection.

Das Ziel war einfach nur eindeutige Werte zu erhalten, dafür ist Dictionary eine Gute, aber sicher nicht die einzige Wahl.

Ich habe das Tool nicht im Detail angesehen, aber alle diese VBA-Codes sind sehr spezifisch an die Daten angepasst und selten ohne Anpassungen für kommende Aufgaben nutzbar. Eine Kollegin ohne solide VBA-Kenntnisse dürfte da schnell an Grenzen stoßen.

(Die Vorstellung, jemand geht einen Tag die 80.000 Zeilen von Hand durch, ist mir unangehm. Deshalb besser nach einem effizienten VBA-Code suchen (auch wenn das Code schreiben UND prüfen genausolange dauert))
Antworten Top
#29
Hi Wastl,
 
ich bin bisher davon ausgegangen das du die Übersetzung in die Zellen zurück schreiben musst. Zu der Annahme kam ich durch deine Aussage in #15 „Aus der Überlegung heraus, wie die übersetzten Wörter am Ende wieder in die richtige Zelle kommen, wurde eine andere Vorgehensweise beschlossen.“
 
Was mit dem Ersetzen unter Beachtung von #24 auch recht flott funktionieren sollte.
 
Da du das Problem nun cleverer Weise einen anderen überlässt, begeistere ich dich eben ein anderes Mal. :21:

Gruß Elex
Antworten Top
#30
Moin Elex,

Zitat:Da du das Problem nun cleverer Weise einen anderen überlässt, begeistere ich dich eben ein anderes Mal.

Dein Vorschlag begeistert mich, passt aber nicht zu meinen aktuellen Anforderungen.
Ich muss nicht unbedingt einen Hammer benutzen, nur weil ich einen Hammer habe, wenn es besser ist, eine Zange zu benutzen.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste