ich habe eine komplizierte Aufgabe bekommen und brauche dazu dringend Hilfe von einem Excel-Spezialisten.
In Sheet1 der beigefügten Exceltabelle (File1 = Office2007, das andere File habe ich konvertiert um es in älteren Excel Versionen öffnen zu können( befinden sich in Spalte A Berichte mit einer Vorgangsnummer. Diese Vorgangsnummer möchte ich in Sheet2 Spalte A suchen. Der dazugehörige Name (Sheet2 Spalte B) soll kopiert werden und in Sheet1 Spalte B bei der dazugehörigen Vorgangsnummer eingefügt werden.
Ich hoffe ich habe es verständlich erklärt. Da ich über 50000 Einträge in der Exceltabelle habe brauche ich dafür unbedingt ein Makro.
danke für deinen Hinweis. Ich versuche es nochmal genauer zu erklären. Meine Excelliste hat ungefähr 50000 Zeilen die ungefähr so aussehen wie sie in der beigefügten Excel-Tabelle zu sehen sind. In Sheet 1 -Spalte A sind nur die Zahlen wichtig, d.h. nur die Zahlen, die immer 9-stellig sind (manchmal auch einen Buchstaben enthalten können) sollen aus Spalte A ausgelesen werden. Dieser ausgelesene Inhalt von Spalte A in Sheet1 soll dann in Sheet2 -Spalte A gesucht werden. Bei Übereinstimmung soll der Text der in Sheet2 Spalte B steht in Sheet1 -Spalte B angezeigt werden. Der Text soll aber nur da angezeigt werden, wo auch die Vorgangsnummern übereinstimmen. Im Moment steht in dem Excelfile in Sheet1 Spalte A ja noch Marketing, Vertrieb usw. . Das steht ja noch nicht drin. Das soll das Makro erledigen.
Ich habe jetzt 2 files hochgeladen. Das erste file ist mit Excel2007 erstellt. Das andere file habe ich für alle anderen Excelversionen konvertiert.
Hoffentlich konnte ich es hjetzt etwas verständlicher erklären.
Sub Erklaeren()
Dim lwSheet1 As Worksheet
Dim lwSheet2 As Worksheet
Dim lsErklaerung As String
Dim lsSuchString As String
Dim liLineCount1 As Double
Dim liLineCount2 As Double
Dim liStringCount As Integer
Dim liStringLenght As Integer
Set lwSheet1 = ActiveWorkbook.Worksheets("Sheet1")
Set lwSheet2 = ActiveWorkbook.Worksheets("Sheet2")
For liLineCount1 = 5 To lwSheet1.UsedRange.Rows.Count
lsSuchString = lwSheet1.Range("A" & liLineCount1).Value
liStringLenght = Len(lsSuchString)
For liStringCount = 1 To liStringLenght
If Left(lsSuchString, 1) = "-" Or lsSuchString = "" Then
Exit For
Else
lsSuchString = Right(lsSuchString, Len(lsSuchString) - 1)
End If
Next liStringCount
If lsSuchString = "" Then
GoTo naechster 'String genügt nicht den Anforderungen (enthält kein "-")
End If
lsSuchString = Right(lsSuchString, Len(lsSuchString) - 2) 'die führenden zwei "-" wegschneiden
lsSuchString = Left(lsSuchString, 9) 'jetzt haben wir den Suchbegriff
For liLineCount2 = 1 To lwSheet2.UsedRange.Rows.Count 'suchen
If lsSuchString = lwSheet2.Range("A" & liLineCount2).Value Then 'gefunden
lwSheet1.Range("B" & liLineCount1).Value = lwSheet2.Range("B" & liLineCount2).Value 'eintragen
Exit For 'nächste Zeile aus Sheet1
End If
Next liLineCount2
naechster:
Next liLineCount1
End Sub
erstmal herzlichen Dank für deine Mühe die du dir gemacht hast. Ich habe das Skript mal an 250 Beispieldaten getestet. Das Skript funktioniert bei all den Nummern, die ein buchstabe enthalten. Die Nummern, die nur aus Buchstaben bestehen, erfasst das Skript nicht.
Im Klartest:
Alle Vorgangsnummern die ungefähr so aussehen 1234B5678 erfasst das Skript (ein Buchstabe in der Nummer)
ALle Vorgangsnummern, die nur aus Zahlen bestehen z. B. 123456789, erfasst das Skript nicht.
Die Vorgangsnummern, die mit einem Buchstaben beginnen erfasst das Skript auch nicht.
Hast du dafür noch eine Lösung?
Du hast mir aber jetzt schon sehr geholfen. Herzlichen Dank schonmal dafür.
das liegt vermutlich daran, dass 1324R4567 ein STRING ist,
123456789 aber eine Zahl.
Das Ganze hängt jetzt davon ab, ob Du in Deinem Sheet 2 die "Suchbegriffe" als Strings oder als Zahlenwerte vorliegen hast.
Auf Grund Deines Beispiels gehe ich davon aus, dass es Strings (also Texte) sind.
Das Makro habe ich angepasst ... bitte nochmal testen.
Code:
Sub Erklaeren()
Dim lwSheet1 As Worksheet
Dim lwSheet2 As Worksheet
Dim lsErklaerung As String
Dim lsSuchString As String
Dim liLineCount1 As Double
Dim liLineCount2 As Double
Dim liStringCount As Integer
Dim liStringLenght As Integer
Set lwSheet1 = ActiveWorkbook.Worksheets("Sheet1")
Set lwSheet2 = ActiveWorkbook.Worksheets("Sheet2")
For liLineCount1 = 5 To lwSheet1.UsedRange.Rows.Count
lsSuchString = lwSheet1.Range("A" & liLineCount1).Value
liStringLenght = Len(lsSuchString)
For liStringCount = 1 To liStringLenght
If Left(lsSuchString, 1) = "-" Or lsSuchString = "" Then
Exit For
Else
lsSuchString = Right(lsSuchString, Len(lsSuchString) - 1)
End If
Next liStringCount
If lsSuchString = "" Then
GoTo naechster 'String genügt nicht den Anforderungen (enthält kein "-")
End If
lsSuchString = Right(lsSuchString, Len(lsSuchString) - 2) 'die führenden zwei "-" wegschneiden
lsSuchString = CStr(Left(lsSuchString, 9)) 'jetzt haben wir den Suchbegriff auf jeden Fall als String vorliegen
For liLineCount2 = 1 To lwSheet2.UsedRange.Rows.Count 'suchen
If lsSuchString = lwSheet2.Range("A" & liLineCount2).Value Then 'gefunden
lwSheet1.Range("B" & liLineCount1).Value = lwSheet2.Range("B" & liLineCount2).Value 'eintragen
Exit For 'nächste Zeile aus Sheet1
End If
Next liLineCount2
naechster:
Next liLineCount1
End Sub
vielen Dank für deine großartige Hilfe. Ich habe noch ein paar Änderungen vorgenommen und jetzt ist das Skript durchgelaufen und hat alle 50000 Zeilen bearbeitet.
Jetzt habe ich nur noch ein kleines Problem. Ich muß die Zeilen ohne brauchbare Werte löschen. In der beigefügten Exceltabelle habe ich die Zellen markiert, die ich meine.
Es kann z.B. vorkommen, daß ich in Spalte A unbrauchbare Daten drinstehen habe, wie z. B. | | | .
Wenn nur diese Striche vorkommen ohne Text, d. h. | | |, dann soll die komplette Zeile gelöscht werden. Wenn | | |ABCDEFG in der Zelle steht, darf die Zeile nicht gelöscht werden.
Den Filter von Excel kann ich hier nicht verwenden, da es vorkommen kann, daß es auch mal fünf Striche (| | | | |) sein können oder 7 Striche und ein Text dahinter.
Es dürfen also nur die Zeilen gelöscht werden, die nur Striche enthalten ohne irgendeinen Text.