Microsoft Excel

Herbers Excel/VBA-Archiv

Tabellenmerge mit mehreren Einträgen zu einem Key

Betrifft: Tabellenmerge mit mehreren Einträgen zu einem Key von: Monika
Geschrieben am: 08.10.2014 12:16:25

Hallo zusammen,

der Betreff beschreibt mein Problem leider nicht wirklich gut, ich wusste allerdings nicht genau, wie ich das sonst kurz formulieren soll...
Ich hoffe, ich beschreibe es hier etwas verständlicher:

Ich habe zwei Sheets, in denen teilweise redundante Informationen zu finden sind, aber eben nicht nur.
Diese beiden Sheets sollen zu einem zusammengefasst werden. Problem dabei ist, dass ich nach den Auftragsnummern sortieren und mergen würde. Allerdings ist auf dem einen Sheet der Auftrag nach erbrachtem Service gesplittet, das bedeutet, die Auftragsnummer ist mehrfach gelistet. In dem anderen Sheet sind die Services in einem Feld zusammengefasst, jede Auftragsnummer kommt also nur einmal vor.

Ist es möglich, trotzdem effizient zu mergen? Ich suche schon seit zwei Tagen im Netz, bisher habe ich aber leider nichts brauchbares finden können :(
Es wäre wirklich super, wenn ihr mir hierbei helfen könntet und einen Tipp für mich hättet :)

Viele Liebe Grüße und Danke schon mal!
Monika

  

Betrifft: Rückfrage von: Daniel
Geschrieben am: 08.10.2014 12:35:21

Hi
da kann man sicherlich was machen, aber ohne zu wissen wie die Daten genau aussehen, lässt sich da nur schwer ein Tip geben.
Es wäre gut, wenn du die Datei mit den Daten, sowie sie vorliegen hier hochladen würdest und von Hand auf einem weitern Blatt darstellst, wie du dir das Ergebnis vorstellst.
Gruß Daniel


  

Betrifft: AW: Rückfrage von: Monika
Geschrieben am: 08.10.2014 13:53:08

Hi,

danke für die schnelle Reaktion!
Ich habe jetzt mal alle sensiblen Daten raus genommen, das heißt, es fehlen die Kundennamen und Lieferadressen. Für das Prinzip sollte es reichen...
https://www.herber.de/bbs/user/93029.xls

In dem Sheet "Wie es aussehen soll" sind die Spalten übernommen, die relevant sind. Allerdings soll - wenn sie in beiden anderen Sheets vorkommen - immer der Wert aus dem Sheet "OrderStatus" übernommen werden.

Viele Grüße


  

Betrifft: AW: Rückfrage von: Michael
Geschrieben am: 08.10.2014 15:12:37

Hallo Monika,

ich habe mir Deine Datei angesehen und bin etwas verwirrt. Welche Tabelle soll zu welcher sortiert werden? Oder so: ist eine von beiden so etwas wie eine "Master-Tabelle"?

Isses nicht sinnvoll, in der Ergebnistabelle zu vermerken, aus welcher der beiden anderen Tabellen die Ergebnisse übernommen wurden?

Die Status-Tabelle enthält viel mehr Auftragsnummern als die Tracker-Tabelle. Wie soll es im Ergebnis dargestellt werden, daß kein Eintrag in letzterer existiert?

Was ist mit den nicht existenten Auftragsnummern in Tracker (z.B. Zeile 23)? Sollen die mit gemerged werden, und wenn ja, wohin?

Wo befindet sich das Land WAHR?

Fragen über Fragen.

Der Punkt ist ein grundlegend durchdachtes "Datenbank-Design", wenn man denn schon Excel DB-mäßig einsetzen möchte.

Grundlage 1: eindeutiger Primärschlüssel: nicht vorhanden, da nicht existente Nummern in Tracker

Grundlage 2: Aufteilung in mehrere Tabellen: Ein Auftrag hat Daten, die zum "Auftrag selbst gehören" und pro Auftrag nur einmal vorhanden sind: Nr., Land, Währung, Kunde usw. Dazu gibt es Auftrags-Posten, die von der Logik her in eine zweite, mit der ersten über einen eindeutigen Schlüssel verknüpften Tabelle gehören.

Das ist leicht einzusehen, wenn Du Dir eine Rechnung o.ä. ansiehst: es gibt einen Rechnungskopf mit den "Überdaten" und einen Bereich für einzelne Rechnungsposten.

Das Ergebnis ist dann "theoretisch richtig konzipiert", braucht aber mehr Papier, z.B. so:

Auftrag Nr. Sonstige_Daten
12345       Bla
  Posten 1: Stück, Ware
12346       Blabla
  Posten 1: Stück, Ware
  ...
  Posten n: Stück, Ware

usw.

Das Problem, wenn man es nicht so macht, ist eine ungünstige Vermischung von Daten und Struktur.

...

Ich habe mir nochmal die ursprüngliche Fragestellung angesehen. Es ist einfach unklar, was mit Posten passieren soll, bei denen die Auftragsnummer nicht in beiden Tabellen vorkommt: man könnte sie weglassen, aber dann könnten wichtige Informationen am Anwender vorbeigehen.

Mach Dir doch bitte ein paar Gedanken über die nachgefragten Details, dann sehen wir weiter.

Schöne Grüße,

Michael


  

Betrifft: AW: Rückfrage von: Daniel
Geschrieben am: 08.10.2014 15:24:38

könntest du das Blatt "Wie es aussehen soll" noch mit Daten füllen, so wie sie sich aus den Beispieldaten ergeben sollen?
Gruß Daniel


  

Betrifft: AW: Rückfrage von: Monika
Geschrieben am: 08.10.2014 16:52:20

Hi,

ich habe jetzt einen Bsp.-Datensatz eingefügt, der bei "OrderStatus" mit der Auftragsnummer drei mal gelistet ist...
https://www.herber.de/bbs/user/93033.xls

Auftragsnummern, welche nur im OrderStatus vorkommen, sollen trotzdem in die neue Tabelle übernommen werden, eben mit den Daten, die vorhanden sind...
Ich weiß, dass die Grundlage etwas seltsam ist :( Aber das ist, was ich übergeben bekommen habe...

Vielen Dank noch mal :)


  

Betrifft: AW: Rückfrage von: Michael
Geschrieben am: 08.10.2014 17:03:22

Hallo Monika,

ich bitte meine Faulheit zu entschuldigen...

Ich hab's mir einfach gemacht und ein neues Tabellenblatt in Deiner ALTEN Datei angelegt, das ist dann die Tabelle4, in die das Makro alle Daten schreibt.

Es sind zwei Teile:

a) einzeilig_Kopieren kopiert alles aus OrderStatus

b) mischt alles aus OrderTracker rein UND schreibt ein x in Spalte K, wenn was kopiert wurde: das dient dazu, diese Daten evtl. noch zusätzlich reinzukopieren, wenn gewünscht.

Option Explicit

Sub einzeilig_Kopieren()
Dim zeile, zeile_erg As Long
Dim orderNr, ProdNr As String
  zeile = 2
  zeile_erg = 3
   While Tabelle1.Range("A" & zeile) <> ""
    Tabelle1.Rows(zeile).Copy Destination:=Tabelle4.Rows(zeile_erg)
    orderNr = Tabelle1.Range("A" & zeile).Value
    zeile = zeile + 1
    While Tabelle1.Range("A" & zeile).Value = orderNr
      Tabelle4.Range("D" & zeile_erg).Value = _
      Tabelle4.Range("D" & zeile_erg).Value & " " & _
      Tabelle1.Range("D" & zeile).Value
      zeile = zeile + 1
    Wend
    zeile_erg = zeile_erg + 1
   Wend
End Sub
Sub Tracker_reinmischen()
Dim zeile As Long
Dim orderNr As String
Dim gefunden As Range
  
  zeile = 3
  While Tabelle4.Range("A" & zeile) <> ""
   orderNr = Tabelle4.Range("A" & zeile).Value
   Set gefunden = Tabelle2.Cells.Find(What:=orderNr, After:=ActiveCell, LookIn:=xlFormulas, _
      LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
      MatchCase:=False, SearchFormat:=False)
   If Not gefunden Is Nothing Then
       Tabelle2.Range("A" & gefunden.Row & ":H" & gefunden.Row).Copy _
       Destination:=Tabelle4.Cells(zeile, 11)
       Tabelle2.Range("I" & gefunden.Row).Value = "x"
   End If
   zeile = zeile + 1
  Wend
End Sub
Sub alles_machen() ' das hier aufrufen
  einzeilig_Kopieren
  Tracker_reinmischen
End Sub
Die Faulheit besteht darin, daß ich nicht Zelle für Zelle dahin kopiere, wo Du sie haben willst, sondern jeweils die komplette Zeile nach Ax bzw. Kx: es ist kein großer Aufwand, die Spalten hinterher untereinander zu verschieben bzw. doppelte zu löschen.

File anbei: https://www.herber.de/bbs/user/93035.xls

Schöne Grüße,

Michael


  

Betrifft: Nachtrag von: Michael
Geschrieben am: 08.10.2014 17:08:59

Spalten verschieben siehe z.B. hier:
https://www.herber.de/forum/archiv/556to560/558513_Spalten_verschieben.html

Gruß,
M.


  

Betrifft: AW: Rückfrage von: Monika
Geschrieben am: 09.10.2014 11:39:48

Vielen Dank!


  

Betrifft: Gerne und Korrektur von: Michael
Geschrieben am: 09.10.2014 14:17:35

Hi Monika,

ich meinte natürlich anstatt:
b) mischt alles aus OrderTracker rein UND schreibt ein x in Spalte K, wenn was kopiert wurde: das dient dazu, diese Daten evtl. noch zusätzlich reinzukopieren, wenn gewünscht.

richtig: ... die Daten OHNE x noch irgendwie zu bearbeiten.

Schönen Tag (hier isses so sonnig, ich muß aus dem Haus),

Michael


 

Beiträge aus den Excel-Beispielen zum Thema "Tabellenmerge mit mehreren Einträgen zu einem Key"