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

Suchen und Werte übertragen von Quelle nach Ziel

Suchen und Werte übertragen von Quelle nach Ziel
09.03.2013 10:17:07
Quelle
Hallo,
ich möchte Daten von einer Quelldatei, Tabelle1 im Pfad Q in eine Zieldatei1, Tabelle1 im Pfad Z übertragen, wenn bestimmte Suchkriterien erfüllt werden.
In meiner geöffneten Zieldatei, (mit ca. 1000 Zeilen) sind u. a. folgende Spalten enthalten:
ZSp2 = Identnummer, ZSp3=Bereich, ZSp4=Name, ZSp5=Vorname, ZSp8=Status („gelöscht“ oder blank), ZSp10=Info, ZSp11=Wert1, ZSpl12=Wert2.
Es sind nun zwei unterschiedliche Suchvorgänge (immer nur wenn ZSp8=blank, d.h. die Zeile gültig ist): Wenn eine Identnummer vorhanden ist, dann suche mit dieser in der Quelldatei; wenn gefunden, dann übertrage den Inhalt von Spalte QSp22 nach ZSp11, QSp23 nach ZSp12 und schreibe in ZSp10 „gefunden“. Falls nicht erfolgreich, schreibe nur in ZSp10 „nicht gefunden“. Durchlaufe die ganze Tabelle1 von Zeile 2 bis zur letzten Zeile (Spalte 1 eignet sich als Kriterium für die letzte Zeile). Die Quelldatei soll für diesen Suchlauf – falls sie noch nicht geöffnet ist – im ReadModus geöffnet werden.
Wenn keine Identnummer vorhanden ist, soll ersatzweise mit Bereich, Name und Vorname in der Quelldatei gesucht werden, ob diese übereinstimmen. Dafür besteht das Suchkriterium aus ZSp3 & ZSp4 & ZSp5. In gleicher Reihenfolge gibt es diese in der Quelldatei QSp5 & QSp6 & QSp7. Alles andere bleibt gleich. Wenn gefunden, übertrage Werte und „Erfolgsmeldung“, sonst nur „nicht gefunden“ in ZSp10. Am Ende kann die Quelldatei wieder geschlossen werden.
Für beide Suchläufe gilt – in der Quelldatei werden nur Zeilen berücksichtigt, die in QSp15 kein „F“ als als Spalteneintrag haben.
Ich weiss nicht, wie ich so eine Suche in zwei Varianten am besten angehen könnte/sollte. Der Durchlauf ist nicht zeitkritisch, Hauptsache nicht manuell (und wenn möglich mit VBA gelöst).
Vielen Dank für Tipps und Unterstützung im Voraus.
Grüße, Constantin

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
ich bin nur Tippgeber; die Anderen sind...
09.03.2013 14:54:24
Oberschlumpf
...weiter "eingeladen", Lösungen zu finden
Hi Constantin
Schön wäre eine Bsp-Datei mit Bsp-Daten.
Denn zumindest ich komme durcheinander, wenn ich z Bsp "ZSp2" lese, da ich nicht weiß, was soll es bedeuten.
Und wenn im weiteren Verlauf dann auch noch von vielen mehr ZSp's zu lesen ist, macht das das Verstehen auch nicht einfacher.
Deswegen eine Bsp-Datei. Du weißt ja schon, wie alles aussieht/aussehen soll - wir wissen das noch nicht.
Ciao
Thorsten

OT@TOSch: Na, ausgetestet? Gruß owT
09.03.2013 15:09:32
Luc:-?
:-?

OTdito: Nebenbei, war nicht f.'diametral' vAWlich!
09.03.2013 17:42:42
Luc:-?
:-?

AW: OTdito: Nebenbei, war nicht f.'diametral' vAWlich!
09.03.2013 18:29:16
Oberschlumpf
sry, beide deiner Antworten verstehe ich - aufgrund der zu vielen Abkürzungen - nicht.
Für diese kurzen Bemerkungen bist du leider zu schreibfaul, sry

Anzeige
AW: Soso, was machen die Bücher? :-| owT
09.03.2013 22:36:24
Luc:-?
:-?

Das kenn' ich doch, ...
10.03.2013 00:12:45
Luc:-?
…Thorsten!
Hatte nach deiner dortigen AW nur den Eindruck, dass du dich mehr an HÜs (auf mich fast arrogant wirkender) AW aufhängst als meine Lösung zu bemerken!
Luc :-?

AW: Das kenn' ich doch, (auch für Constantin)
10.03.2013 07:41:29
Oberschlumpf
Hi Luc
Ja, du hast Recht.
Der Hauptgrund, dass ich meine Lösungssuche erst mal auf Eis gelegt habe, war wirklich HÜs auch für mich arrogante Antwort.
Nun hab ich mir auch deine Datei angesehen.
Und sorry, dass ich erst jetzt darauf reagiere.
Ich versteh zwar von der Funktion nicht wirklich jedes Wort, aber das ist kein Problem.
Du musst es mir nicht erklären.
Und eigentlich funktioniert deine Idee auch größtenteils.
Wenn du aber in E1 z Bsp "TB von Jo Nesbo Nimmerland" eingibst (so könnte es ja auch in eBay vorkommen), dann erscheint in den zugehörigen Ergebniszellen "#Bezug".
Herausgefunden habe ich, dass der Teil " - " im Suchtext vorhanden sein muss, da er von deinen Formeln wohl als Trenner benötigt wird.
Vielleicht hast du je genau DAS oder Ähnliches schon in deinen Antworten erwähnt.
Aber, sorry, du verwendest ZU VIELE Abkürzungen. Ich verstehe oft den Sinn nicht.
Nun denn, trotzdem aber an dich sehr großen Dank!
Wenn ich deine Lösungen sehe (auch oft bei anderen Fragen), dann wird mein "VBA = gut" sehr oft zu einem "VBA = ähh, nun ja, irgdwie klappts ja doch meistens".
Aber auch das is kein Problem. Zu 99% kann ich meine Probleme selbst lösen. Für den Rest findet sich meist eine andere Lösung.
Ciao
Thorsten
Hallo Constantin!
Ein großes SORRY an dich, dass Luc + ich deinen Thread so sehr für eine andere Frage "missbrauchen".
Zumindest ich bin nun fertig, hier "rumzuwildern".
Ciao
Thorsten

Anzeige
OT@TOsch: Neuer Thread --> neue Formel!
10.03.2013 15:18:58
Luc:-?
Gruß Luc :-?

AW: Suchen und Werte übertragen von Quelle nach Ziel
09.03.2013 15:08:01
Quelle
Hallo,
hier ein Beispiel wie ich es verstanden habe, sonst lade mal ein Beispiel hoch.
https://www.herber.de/bbs/user/84266.zip
Gruß Tino

AW: Suchen und Werte übertragen von Quelle nach Ziel
09.03.2013 16:07:47
Quelle
Hallo,
vielen Dank für den Hinweis und Ausarbeitungen. Jetzt muss ich erstmal tief Luft holen, insbesondere bei Tino's Programm. Ich werde mich mal versuchen jeweils reinzudenken und zu testen.
Etwas unverständlich von meiner Seite war die Angabe ZSp3 etc.. Hier ist z.B. die Spalte 3 (der Zieltabelle) gemeint. QSp5 wäre somit die Spalte 5 aus der Quelldatei.
Die Spalte für die Identnummer in der Quelldatei ist die Spalte 4 (QSp4). Die habe ich vergessen zu benennen.
Es folgt ein weiteres feedback. Und danke erstmal.
Grüße, Constantin

Anzeige
AW: Suchen und Werte übertragen von Quelle nach Ziel
09.03.2013 15:46:36
Quelle
Hallo Constantin,
hier mein Makrovorschlag.
In deiner Frage fehlt die Info, in welcher Spalte in den Quelldaten die Id-Nummer steht. Das musst du ggf. anpassen.
Auch wenn man das Grundgerüst hat (hier die Suche nur über eine ID-Nummer), so ist eine Anpassung doch immer wieder mühselig (hier die Suche über 3 Spalten + Randbedingung für Spalte 12).
Gruß
Franz
Sub DatenAbgleichen_mit_Extern()
Dim strDatei As String
Dim wbZiel As Workbook, wbQuelle As Workbook
Dim wksZiel As Worksheet, wksQuelle As Worksheet
Dim bolQuelleOpen As Boolean
Dim strBerNameVorname As String, varIdNr As Variant, strAdresse1 As String
Dim ZeileZ As Long, ZeileQ As Long, Zeile As Long
Dim Zelle As Range, rngIdNrQuelle As Range
Dim arrData As Variant
Const lngSpalteLeer = 25 'Nummer der 1. leeren Spalte nach den Daten in _
der Quelltabelle,                             ggf. anpassen
Const lngSpaIDNrQ = 1 '1 = Spalte A, Nummer der Spalte mit den Id-Nummern in der _
Quelltabelle,                                          ggf. anpassen
Set wbZiel = ActiveWorkbook
Set wksZiel = wbZiel.Worksheets(1)
On Error GoTo Fehler
'Quelldatei auswahlen
With Application.FileDialog(msoFileDialogOpen)
.Title = "Bitte Datei mit Quelldaten wählen"
.ButtonName = "Öffnen"
If .Show  -1 Then GoTo Beenden
strDatei = .SelectedItems(1)
End With
'Prüfen, ob Quelle schon geöffnet
For Each wbQuelle In Application.Workbooks
If LCase(wbQuelle.Name) = LCase(Mid(strDatei, InStrRev(strDatei, "\") + 1)) Then
bolQuelleOpen = True
Exit For
End If
Next
If wbQuelle Is Nothing Then 'Quelle noch nicht geöffnet
'Quelldatei schreibgeschützt öffnen
bolQuelleOpen = False
Set wbQuelle = Workbooks.Open(Filename:=strDatei, ReadOnly:=True)
End If
'Tabelle1 Objektvariable zuweisen
Set wksQuelle = wbQuelle.Worksheets(1)
Application.StatusBar = "Quelldaten werden eingelesen."
With wksQuelle
'letzte Zeile mit Daten in Quelltabelle
ZeileQ = .UsedRange.Rows.Count + .UsedRange.Row - 1
'Daten ab A1 inklusive einer Leerspalte in ein Datenarray einlesen
arrData = .Range(.Cells(1, 1), .Cells(ZeileQ, lngSpalteLeer))
'Bereich, Name und Vorname in die Leerspalte des Arrays einlesen
For Zeile = 1 To ZeileQ
arrData(Zeile, lngSpalteLeer) = arrData(Zeile, 5) & "|" & arrData(Zeile, 6) _
& "|" & arrData(Zeile, 7)
Next
'Bereich mit den Id-Nummern in  der Quelltabelle
Set rngIdNrQuelle = .Range(.Cells(2, lngSpaIDNrQ), .Cells(ZeileQ, lngSpaIDNrQ))
End With 'wksQuelle
Application.ScreenUpdating = False
With wksZiel
For ZeileZ = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
ZeileQ = 0 'Ergebniszeile zurücksetzen
Application.StatusBar = "Zeile Nr. " & ZeileZ & " wird bearbeitet."
'Status prüfen
If .Cells(ZeileZ, 8) = "" Then
'Id-Nummer einlesen
varIdNr = .Cells(ZeileZ, 2).Value
'Bereich,Name,Vorname einlesen
strBerNameVorname = .Cells(ZeileZ, 3) & "|" & .Cells(ZeileZ, 4) _
& "|" & .Cells(ZeileZ, 5)
If varIdNr  "" Then
'Id-Nummer in Quelle suchen
Set Zelle = rngIdNrQuelle.Find(what:=varIdNr, LookIn:=xlValues, lookat:=xlWhole)
If Not Zelle Is Nothing Then
strAdresse1 = Zelle.Address '1. Fundstelle merken
Do
'Prüfen, ob Spalte 15  "F"
If arrData(Zelle.Row, 15)  "F" Then
ZeileQ = Zelle.Row
Exit Do
End If
'nächsten Eintrag der Id-Nummer suchen
Set Zelle = rngIdNrQuelle.FindNext(After:=Zelle)
Loop Until Zelle.Address = strAdresse1
End If
End If 'varIdNr prüfen
If ZeileQ = 0 Then
'in Quelle nach Bereich,Name,Vorname suchen
For Zeile = LBound(arrData, 1) To UBound(arrData, 1)
If arrData(Zeile, lngSpalteLeer) = strBerNameVorname _
And arrData(Zeile, 15)  "F" Then
ZeileQ = Zeile
Exit For
End If
Next Zeile
End If
'Ergebnis in Zieltabelle eintragen
If ZeileQ = 0 Then
.Cells(ZeileZ, 10) = "nicht gefunden"
Else
.Cells(ZeileZ, 10).Value = "gefunden"
.Cells(ZeileZ, 11).Value = arrData(ZeileQ, 22)
.Cells(ZeileZ, 12).Value = arrData(ZeileQ, 23)
End If
End If 'Status prüfen
Next ZeileZ
End With 'wksZiel
If bolQuelleOpen = False Then wbQuelle.Close savechanges:=False
Set wksQuelle = Nothing
Set wbQuelle = Nothing
Erase arrData
Application.ScreenUpdating = True
MsgBox "Alle Dateien eingelesen"
Err.Clear
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case Else
Application.ScreenUpdating = True
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
If Not wbQuelle Is Nothing And bolQuelleOpen = False Then
wbQuelle.Close savechanges:=False
End If
End Select
End With
Beenden:
Set wbZiel = Nothing
Set wbQuelle = Nothing
If IsArray(arrData) Then Erase arrData
Application.StatusBar = False
End Sub

Anzeige
AW: bin sprachlos!
09.03.2013 21:37:00
Constantin
Hallo Tino, hallo Franz,
bei Tino's Programm musste ich erstmal eine Auszeit nehmen (und muss mir noch etwas mehr Zeit gönnen). Dennoch uneingeschränkten Dank für die große Unterstützung! Das Programm von Franz konnte ich schon weitgehendst erschließen und testen: "mega-stark"!
An zwei Stellen würde ich gern für mich etwas "justieren" wollen. Den Quelldateinamen (mit Pfad) möchte ich im Programm fest hinterlegen (keine Auswahl des Anwenders). Da probier ich einfach mal - vielleicht krieg' ich das hin.
Etwas verzwickter scheint mir zu sein, dass in meiner Quelldatei am Ende Zeilen enthalten sind, die "leer" sind. Ich müsste jetzt die "lastrow" ermitteln, bezogen auf "gefüllte" Zellen (sonst Indexfehler (9)). Gibt es dafür eine einfache Möglichkeit?
Nochmals großen Dank für dieses super funktionierende Makro!
Grüße, Constantin

Anzeige
AW: Dateiname vorgeben, letzte Zeile mit Daten
10.03.2013 18:47:44
fcs
Hallo Constantantin,
für die feste Vorgabe des Quelldateinamens ersetzt du den folgenden Codeabschnitt mit dem Dateiauswahldialog
  'Quelldatei auswahlen
With Application.FileDialog(msoFileDialogOpen)
.Title = "Bitte Datei mit Quelldaten wählen"
.ButtonName = "Öffnen"
If .Show  -1 Then GoTo Beenden
strDatei = .SelectedItems(1)
End With

durch
  'Quelldatei auswahlen
strDatei = "C:\Users\Public\Test\Quelldaten.xls" 'Dateiname anpassen!
Für die Ermittlung der letzten benutzten Zelle oder auch Zeile mit Inhalt gibt es verschiedene Lösungsmöglichkeiten.
  With wksQuelle
'letzte verwendete Zeile in Quelltabelle
'(Kann auch eine Zeile mit Formatierungen ohne Daten sein!)
ZeileQ = .UsedRange.Rows.Count + .UsedRange.Row - 1
'oder
'letzte Zeile mit Inhalt in einer bestimmten Spalte (hier Spalte A (1) der Quelltabelle
ZeileQ = .Cells(.Rows.Count, 1).End(xlUp).Row
'oder
'letzte Zeile mit Inhalt (Wert oder Formel) in der Quelltabelle
Set Zelle = .Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlFormulas, _
lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
If Zelle Is Nothing Then
MsgBox "Keine Daten in Datenquelle"
GoTo Beenden
Else
ZeileQ = Zelle.Row
End If
Gruß
Franz

Anzeige
AW: Vielen Dank!
11.03.2013 21:44:23
Constantin
Hallo Franz,
jetzt kann ich das Programm optimal einsetzen; vielen Dank für die verständliche und hilfreiche Ergänzung zu meiner Nachfrage.
Grüße, Constantin

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige