Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
984to988
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
984to988
984to988
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Überprüfung von Zellwörtern zwischen Spalten

Überprüfung von Zellwörtern zwischen Spalten
21.06.2008 01:05:00
Zellwörtern
Ausgangspunkt meiner Frage für meine Masterarbeit bildet folgende Beispieltabelle (1. Zeile Titel):
ID Geschäftsname ID Firma ID externer Datenbank
B1 SMITH & BROWN,INC L1 SMITH & BROWN,INC H1 Advantage Advisers
Die ID ist eine Identifikationsnummer für die Einträge.
Geschäftsname und Firma (zusammen Datenbank A) stammen aus der selben Datenbank, d.h. die Spalten gehören zum selben Eintrag. Die Einträge für diese Spalten können identisch sein, müssen es aber nicht, z.B. können die Rechtsformkürzel bei Geschäftsname fehlen oder die Firma verweist auf eine Holding und hat einen ganz anderen Namen.
Die Einträge in der Spalte externe Datenbank (Datenbank B) sollen überprüft werden, ob sie entweder mit Geschäftsname oder Firma eines Eintrages folgendermaßen identisch sind:
Ich möchte für jeden Eintrag aus B überprüfen wieviele Wörter mit jeder Spalte in A identisch sind. Die Spalte mit den größeren Übereinstimmungen dient als Vergleichswert.
Folgenden Output möchte ich erzeugen:
Für jeden Eintrag in B, die Identifikationsnummer oder Zeile in A, bei der
- alle Wörter übereinstimmungen
- alle Wörter - 1 Wort übereinstimmen
-....
- 2 Wörter übereinstimmen
Ich würde mich freuen wenn mir jemand zumindest teilweise helfen kann. Bin gerade erst dabei mir VBA anzueignen und daher ist diese Aufgabe für mich zu anspruchsvoll im Moment um sie alleine zu lösen.
VG,
Dennis

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Überprüfung von Zellwörtern zwischen Spalten
21.06.2008 01:44:57
Zellwörtern
Hi Dennis,
ich las das von dir:
"Ausgangspunkt meiner Frage für meine Masterarbeit bildet folgende Beispieltabelle (1. Zeile Titel):
ID Geschäftsname ID Firma ID externer Datenbank
B1 SMITH & BROWN,INC L1 SMITH & BROWN,INC H1 Advantage Advisers"
Danach sprachst du von Spalte A und Spalte B. Ich sehe da leider keinerlei Zusammenhang. Lese bitte mal das Nachfolgende, stammt von Peter.
Gruß
Reinhard
Eine Frage gut zu stellen, ist die halbe Miete der Antwort.
Zuerst löst du deine Frage aus deinem Projekt heraus und reduzierst diese auf dein eigentliches Problem.
Bsp.:
Du hast eine Lagerverwaltung, in denen du Tierfutter verwaltest. In dieser werden Berechnungen durchgeführt, wieviel wo was vorhanden ist.
In einem Tabellenblatt Artikelliste hast du in Spalte G die Artikelnummern stehen und in Spalte H die Futtermittelnamen.
Nun möchtest du in einer Tabelle Futterkontrolle bei Eingabe in der Zelle C114 einer Artikelnummer in Zelle D114 den Futternamen haben.
95 % sind überflüssig
Fast alles davon interessiert für das eigentliche Problem überhaupt nicht.
Keinen Menschen interessiert es, wie die Tabellenblätter heißen, wofür du das brauchst und überhaupt.
Dein losgelöstes Problem lautet: Wie finde ich zu der Nummer den Artikel und zwar in einem anderen Tabellenblatt.
Du machst nun ein allgemeinverständliches Beispiel und zwar mit Standardzellpositionen und Standardtabellennamen.
Alles andere läßt du weg, also:
Die Frage:
In Tabelle1 habe ich in Spalte A Nummern und in B daneben Bezeichnungen.
Nun möchte ich gerne in Tabelle2 in Zelle A1 die Nummer eingeben können und in Zelle B1 soll dann die Bezeichnung erscheinen.
Du siehst, ganz einfach und für jeden verständlich.
Noch besser ist natürlich ein kleines optisches Beispiel, z.B. mit der Excel Jeanie Html aufbereitet (oder anderen Tools)
A B
1 1 Hund
2 2 Katze
3 3 Maus
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen Excel Jeanie HTML 3.0 Download
Und dann die Frage dazu:
Welche Formel muss ich in Zelle B1 von Tabelle2 eintragen,
damit, wenn ich in A1 z.B. die Nummer 2 schreibe, Katze herauskommt.
Schlussbemerkung:
Die Antwort, die du dann erhälst, musst du dann an dein Projekt anpassen.
Dies wird dir am Anfang etwas Mühe bereiten aber du lernst dabei auch die Lösung zu verstehen.
Und ganz nebenbei: Viele Lösungen wirst du schon selbst dir erarbeiten können, wenn du das Problem mal isoliert hast!

Anzeige
AW: Überprüfung von Zellwörtern zwischen Spalten
21.06.2008 10:59:24
Zellwörtern
Hallo Reinhard,
danke für die Rückmeldung. Meine Bezeichnungen sind teilweise unpräzise. Ich versuche es nun etwas besser zu machen. Das Problem ist, dass der Tab für Forumseinträge nicht aktiviert ist und mehrere Leerzeichen immer als eines interpretiert werden. Ich habe daher noch einen upload einer Beispielsdatei unter https://www.herber.de/bbs/user/53231.xls gemacht. Trotzdem versuche ich sie nochmal darzustellen.
Das Trennungssymbol für Spalten in der folgenden Tabelle ist |. Die erste Zeile ist der Titel der Spalten, die Zweite ein Beispiel für einen Antrag.
ID G.| Geschäftsname | ID F.| Firmenname | ID E.| Externe Datenbank
B1 | SMITH & BROWN,INC |L1 | SMITH & BROWN,INC| H1 | Advantage Advisers|
Datenbank A (11000 Einträge) beinhaltet die Spalten: | ID G.| Geschäftsname | ID F.| Firmenname
Datenbank B (1000 Einträge) beinhaltet die Spalten: | ID E.| Externe Datenbank
Die Wörter einer Zelle in der Spalte "Externe Datenbank" von B sollen mit allen Zeilen von Datenbank A verglichen werden. Es sollen die Zeilen (oder ID Nummern) von A angegeben, die am meisten Wortübereinstimmungen im Feld Geschäftsname oder Firmenname besitzen.
Die Prozedur soll für alle Zellen von "Externe Datenbank" einzeln durchgeführt werden.
Ich bitte zu entschuldigen, dass ich so viel schreibe, aber ich versuche möglichst exakt zu sein.

Anzeige
Frage noch offen o.w.T.
21.06.2008 11:52:23
Reinhard


AW: Frage noch offen o.w.T.
22.06.2008 01:27:05
Dennis
Ich nehme an meine Ausführungen waren nicht komprimiert genug.
Kurzfassung meiner Frage:
Mit welchem Code kann man feststellen wieviele Wörter zwischen zwei Zellen identisch sind und wie gibt man die Anzahl identischer Wörter an?
Ich hoffe, dass das ausreichend formuliert ist.

AW: Frage noch offen o.w.T.
22.06.2008 10:45:00
fcs
Hallo Dennis,
deine Aufgabenstellung ist nicht so einfach zu lösen, wie sich das auf den ersten Blick anhört.
Grundsätzlich kann man die Wörter in einer Zelle mit der Split-Methode (Trennzeichen = Leerzeichen) in ein Array schreiben oder wie bei mir in einer älteren Excelversion in einer Schleife in Wörter trennen. Da Satzzeichen wie , ; . ? ! den Wortvergleich stören, müssen diese zusätzlich entfernt werden
Diese Auftrennung in Wörter muss man für beide Zellen machen, die man vergleichen will.
Dann kann man in zwei geschachtelten For-Next-Schleifen die Wörter in den beiden Arrays vergleichen und die Übereinstimmungen zählen. ggf. gibt eas auch effektivere Vergleichsmethoden zwischen zwei Arrays.
In deinem Fall wird das Ganze dadurch extrem aufwendig, dass du jede Zelle in Spalte F mit allen ausgefüllten Zellen in den Spalten B und D vergleichen möchtest . Damit nicht alle Inhalte in diesen Zellen (ca. 20000) bei jedem Durchlauf zeitaufwendig neu berechnet werden müssen, müssen als erstes die Worte in jeder Zelle in ein Datenfeld (Array) geschrieben werden.
Danach kann man die Zellen der Spalte F Arbeiten. Dabei muss dann nach jedem Zellvergleich überprüft werden, ob einbesserer Treffer gefunden wurde und diese Information entsprechend gespeichert werden.
Ich hab dir hier mal Prozeduren zusammengestellt, die deine Spalten analysieren.
Im Moment werden nur 4 Zeilen in Spalte F ausgewertet. Wenn alles funktioniert kannst du diese Zeile entfernen. Je nach Anzahl der Zeilen in Spalte F und Leistung deines Rechners kann die Berechnung etliche Minuten dauern. Der Fortschrtitt wird in der Statuszeile angezeigt. Auf meinem Notebook Pentium III, 600 MHz, 128 MB Arbeitsspeicher, schaffte der Rechner bei 5000 Zeilen in Spalte A ca. 1 bis 2 Zeilen pro Sekunde in Zeile F.
Gruß
Franz

'# Modul:        Allgemein                                                        #
'# Funktion:     Wortvergleich zwischen Spalteneinträgen                         #
'# Ersteller:    fcs                                                              #
'# Erstellt:     2009-06-22                                                       #
'# geändert:                                                                      #
'# Excelversion: 97 SR-2                                                          #
Option Explicit
Sub Compare()
'Hauptprozedur
Dim wks As Worksheet
'Zeilenzähler
Dim lngZeile As Long, lngZeile2 As Long, lngZeileL As Long
'Variablen in Verbindung mit den Primary Business Namen
Dim intIDB_Anzahl As Integer, intIDB_Max As Integer
Dim strIDB_Max As String, strBName_Max As String
Dim arrB_Name() As String
'Variablen in Verbindung mit den Legal Namen
Dim intIDL_Anzahl As Integer, intIDL_Max As Integer
Dim strIDL_Max As String, strLName_Max As String
Dim arrL_Name() As String
Dim lngGleicheTreffer As Long
Dim strAlleMaxIDs As String
Dim intI As Integer, intJ As Integer 'Laufvariablen in Schleifen
Dim varTemp As Variant
Const intMaxWorte As Integer = 10 'Max. Anzahl Worte in den Namen (für Array-Größe)
On Error GoTo Fehler:
Set wks = Worksheets("listing")
With wks
'Titel Spalten G bis M
.Cells(1, 7).Value = "ID B Best"
.Cells(1, 8).Value = "ID B_Matches"
.Cells(1, 9).Value = "ID L_Best"
.Cells(1, 10).Value = "ID L_Matches"
.Cells(1, 11).Value = "ID Best match"
.Cells(1, 12).Value = "Name Best match"
.Cells(1, 13).Value = "Anzahl Best match"
.Cells(1, 14).Value = "Alle Best match"
Call SpeedUp(False)
'Letzte Daten-Zeile in Spalte 1 (A)
lngZeileL = .Cells(.Rows.Count, 1).End(xlUp).Row
'Einlesen der Worte (in Kleinbuchstaben) in den Primary Business und Legal Names _
in Arrays
ReDim arrB_Name(2 To lngZeileL, 1 To intMaxWorte)
ReDim arrL_Name(2 To lngZeileL, 1 To intMaxWorte)
For lngZeile = 2 To lngZeileL
Application.StatusBar = "Arrays Einlesen Zeile " & lngZeile & " von " & lngZeileL
'Worte in Primary Business Name aus Zeile einlesen
varTemp = fncTextSplit(strText:=.Cells(lngZeile, 2).Value, strTrenn:=" ")
If varTemp(LBound(varTemp))  "" Then
intI = 0
For intJ = LBound(varTemp) To UBound(varTemp)
intI = intI + 1
If intI > intMaxWorte Then Exit For
arrB_Name(lngZeile, intI) = LCase(varTemp(intJ))
Next
End If
'Worte in Legal Name aus Zeile einlesen
varTemp = fncTextSplit(strText:=.Cells(lngZeile, 4).Value, strTrenn:=" ")
If varTemp(LBound(varTemp))  "" Then
intI = 0
For intJ = LBound(varTemp) To UBound(varTemp)
intI = intI + 1
If intI > intMaxWorte Then Exit For
arrL_Name(lngZeile, intI) = LCase(varTemp(intJ))
Next
End If
Next
'Abarbeiten der Hedge-Fund-Namen in Spalte 6 (F)
For lngZeile = 2 To .Cells(.Rows.Count, 6).End(xlUp).Row
Application.StatusBar = "Vergleichen Zeile " & lngZeile & " von " & lngZeileL
'Hedge Fund Name in Worte splitten
varTemp = fncTextSplit(strText:=.Cells(lngZeile, 6).Value, strTrenn:=" ")
If varTemp(LBound(varTemp))  "" Then
'Worte in Hedge Fund Name mit Worten in allen Legal und Business Namen vergleichen
'und Namen mit größter Trefferzahl ermittel
For lngZeile2 = 2 To lngZeileL
For intI = LBound(varTemp) To UBound(varTemp)
'Vergleich Wort in HF Name mit Worten in Business Name
For intJ = 1 To intMaxWorte
If arrB_Name(lngZeile2, intJ) = "" Then Exit For
If arrB_Name(lngZeile2, intJ) = LCase(varTemp(intI)) Then
intIDB_Anzahl = intIDB_Anzahl + 1
End If
Next
'Vergleich Wort in HF Name mit Worten in Legal Name
For intJ = 1 To intMaxWorte
If arrL_Name(lngZeile2, intJ) = "" Then Exit For
If arrL_Name(lngZeile2, intJ) = LCase(varTemp(intI)) Then
intIDL_Anzahl = intIDL_Anzahl + 1
End If
Next
Next
'Vergleich der Anzahl Treffer mit den bisher ermittelten Max-Werten umd _
ggf. merken der neuen Max-Werte
If intIDB_Anzahl > Application.WorksheetFunction.Max(intIDB_Max, intIDL_Max) Or _
intIDL_Anzahl > Application.WorksheetFunction.Max(intIDB_Max, intIDL_Max) Then
'Neuer Best Match Name gefunden
lngGleicheTreffer = 0
strAlleMaxIDs = ""
End If
'Business Name
If intIDB_Anzahl > intIDB_Max Then
intIDB_Max = intIDB_Anzahl
strIDB_Max = .Cells(lngZeile2, 1).Value
strBName_Max = .Cells(lngZeile2, 2).Value
End If
'Legal Name
If intIDL_Anzahl > intIDL_Max Then
intIDL_Max = intIDL_Anzahl
strIDL_Max = .Cells(lngZeile2, 3).Value
strLName_Max = .Cells(lngZeile2, 4).Value
End If
'IDs gleichwertiger Namen erfassen
If intIDB_Anzahl = _
Application.WorksheetFunction.Max(1, intIDB_Max, intIDL_Max) Then
lngGleicheTreffer = lngGleicheTreffer + 1
If strAlleMaxIDs = "" Then
strAlleMaxIDs = .Cells(lngZeile2, 1).Value
Else
strAlleMaxIDs = strAlleMaxIDs & "; " & .Cells(lngZeile2, 1).Value
End If
ElseIf intIDL_Anzahl = _
Application.WorksheetFunction.Max(1, intIDB_Max, intIDL_Max) Then
lngGleicheTreffer = lngGleicheTreffer + 1
If strAlleMaxIDs = "" Then
strAlleMaxIDs = .Cells(lngZeile2, 3).Value
Else
strAlleMaxIDs = strAlleMaxIDs & "; " & .Cells(lngZeile2, 3).Value
End If
End If
'zurücksetzen der Treffer-Zähler
intIDB_Anzahl = 0
intIDL_Anzahl = 0
Next
End If
'Ergebnisse für ID H in Spalten G bis M der Zeile eintragen
.Cells(lngZeile, 7).Value = strIDB_Max
.Cells(lngZeile, 8).Value = intIDB_Max
.Cells(lngZeile, 9).Value = strIDL_Max
.Cells(lngZeile, 10).Value = intIDL_Max
'Vergleich der Max-Treffer in Business- und Legal-Name und eintragen des "Siegers"
'Bei gleicher Anzahl wird der Legal Name eingetragen
If intIDB_Max = 0 And intIDL_Max = 0 Then
.Cells(lngZeile, 11).Value = "No Match"
ElseIf intIDB_Max > intIDL_Max Then
.Cells(lngZeile, 11).Value = strIDB_Max
.Cells(lngZeile, 12).Value = strBName_Max
ElseIf intIDB_Max  0 Then
MsgBox "Fehler Mr.: " & Err.Number & vbLf & Err.Description
End If
'Variablen aufräumen
ReDim arrB_Name(0, 0)
ReDim arrL_Name(0, 0)
Set wks = Nothing
varTemp = Null
Application.StatusBar = False
Call SpeedUp(True, True, True) 'Speed-Optionen zurücksetzen
End Sub
Function fncTextSplit(strText As String, strTrenn As String) As Variant
Dim strWort As String, intWorte As Integer, arrWorte() As String, intI As Integer
'Splitten des Textstrings am Trennzeichen
For intI = 1 To Len(strText)
strWort = ""
Do Until Mid(strText, intI, 1) = strTrenn Or intI > Len(strText)
strWort = strWort & Mid(strText, intI, 1)
intI = intI + 1
Loop
strWort = Trim(strWort)
'Punkte, Komma, Semicolon oder Bindestrich am Anfang und Ende des Worts entfernen
Do Until Not (Right(strWort, 1) = "." Or Right(strWort, 1) = "," _
Or Right(strWort, 1) = "-" Or Right(strWort, 1) = ";" _
Or Right(strWort, 1) = "!" Or Right(strWort, 1) = "?")
strWort = Left(strWort, Len(strWort) - 1)
Loop
Do Until Not (Left(strWort, 1) = "." Or Left(strWort, 1) = "," _
Or Left(strWort, 1) = "-" Or Left(strWort, 1) = ";")
strWort = Mid(strWort, 2)
Loop
'Wörter, die beim Vergleichen nicht mit berücksichtigt werden sollen
'In den Case-Fällen ggf. Einträge ergänzen oder löschen, um Treffer zu optimieren
Select Case LCase(strWort)
Case "&", "+"
'Do nothing
Case "inc", "ltd", "co"
'Do nothing
Case "company", "corporation"
'Do nothing
Case Else
'Wort in Array übernehmen
If Trim(strWort)  "" Then
intWorte = intWorte + 1
ReDim Preserve arrWorte(1 To intWorte)
arrWorte(intWorte) = strWort
End If
End Select
Next
If intWorte > 0 Then
fncTextSplit = arrWorte()
Else
fncTextSplit = Array("")
End If
End Function
Sub SpeedUp(bolScreenUpdate As Boolean, _
Optional bolCalculation As Boolean = False, _
Optional bolEvents As Boolean = False)
'Setzen von Optionen zur Beschlenigung von Prozeduren
'Bildschirmaktualisierung
Application.ScreenUpdating = bolScreenUpdate
'Berechnungsmodus
If bolCalculation = True Then
Application.Calculation = xlCalculationManual
Else
Application.Calculation = xlCalculationAutomatic
End If
'Ereignisprozeduren
Application.EnableEvents = bolEvents
End Sub


Anzeige
AW: Frage noch offen o.w.T.
25.06.2008 00:24:00
Dennis
Hallo Franz,
vielen Dank für Deine Mühe und die ausführliche Antwort. Dies hat mich wirklich sehr gefreut. Ich werde versuchen so schnell wie möglich Deinen Code umzusetzen und werde über das Resultat berichten.
VG,
Dennis

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige