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

Wenn wert dann zusammenführen

Wenn wert dann zusammenführen
24.05.2017 09:04:49
Felix
Moin zusammen,
wiedermal eine Frage an Euch, da ich nicht weiter komme.
Problem:
Tab01 enthält in Spalte A Werte, die in Spalte B einer Gruppe zugeordnet werden.
Tab02 enthält eine Liste aller Gruppen und soll in Spalte B alle Werte aus Tab01 enthalten, die zu dieser Gruppe zugeordnet sind.
Bsp.
Tab01
KW01 G1
KW02 G2
KW03 G1
KW04 G1
Tab02
G1 KW01, KW03, KW04
G2 KW02
Frage:
Gibt es dafür eine Formel um die Verknüpfung aktiv zu behalten?
Ist eine VBA Makro besser das auf eine Change in TAB01 reagiert? Wenn ja, könnt Ihr mir hierzu bitte einen Tip geben, wie ich den Textstring in Tab02 erzeuge.
Eine Bsp Datei ist hier:
https://www.herber.de/bbs/user/113761.xlsx
Besten Dank,
Felix

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mit VBA...
24.05.2017 09:22:15
Michael
Hallo Felix,
...ist das eine fixe Geschichte, Formel bin ich nicht der Richtige:
Sub a()
Const SEP$ = ","
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Tab01")
Dim WsZ As Worksheet: Set WsZ = Wb.Worksheets("Tab02")
Dim tQ As ListObject: Set tQ = WsQ.ListObjects(1)
Dim tZ As ListObject: Set tZ = WsZ.ListObjects(1)
Dim c As Range, d As Range, t$
With tZ.DataBodyRange
For Each c In .Resize(.Rows.Count, 1)
With tQ.DataBodyRange
For Each d In .Offset(, 1).Resize(.Rows.Count, 1)
If d = c Then t = t & d.Offset(, -1) & SEP
Next d
End With
c.Offset(, 1) = t: t = vbNullString
Next c
End With
Set Wb = Nothing: Set WsQ = Nothing: Set WsZ = Nothing
Set tQ = Nothing: Set tZ = Nothing: Set c = Nothing
Set d = Nothing
End Sub
LG
Michael
Anzeige
AW: ...und ggf. noch schneller...
24.05.2017 09:41:40
Michael
Felix,
...ist evtl. diese Variante (über Arrays - da ich die Größe Deiner Original-Tabellen nicht kenne):
Sub a()
Const SEP$ = ","
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Tab01")
Dim WsZ As Worksheet: Set WsZ = Wb.Worksheets("Tab02")
Dim tQ As ListObject: Set tQ = WsQ.ListObjects(1)
Dim tZ As ListObject: Set tZ = WsZ.ListObjects(1)
Dim a, b, c(), t$, i&, j&
Application.ScreenUpdating = False
With tZ.DataBodyRange
a = .Resize(.Rows.Count, 1)
ReDim c(1 To UBound(a), 1 To UBound(a))
End With
With tQ.DataBodyRange
b = .Resize(.Rows.Count, 2)
End With
For i = LBound(a) To UBound(a)
For j = LBound(b) To UBound(b)
If a(i, 1) = b(j, 2) Then t = t & b(j, 1) & SEP
Next j
c(i, 1) = a(i, 1): c(i, 2) = t: t = vbNullString
Next i
With tZ.DataBodyRange
.Resize(.Rows.Count, 2) = c
End With
Set Wb = Nothing: Set WsQ = Nothing: Set WsZ = Nothing
Set tQ = Nothing: Set tZ = Nothing
Erase a: Erase b: Erase c
End Sub
LG
Michael
Anzeige
AW: ...und ggf. noch schneller...
24.05.2017 10:05:10
Felix
Michael,
ich habe gerade erst die zweite variante gesehen.
Kannst Du mir bitte den Unterschied zwischen beiden Varianten.
Lg Felix
AW: Der Unterschied...
24.05.2017 10:14:37
Michael
Felix,
...der beiden Varianten liegt darin, dass in der ersten Variante Schleifen über Zell-Bereiche laufen, in der zweiten Variante aber die Daten in Arrays eingelesen werden, und die Vergleiche dann direkt in diesen Arrays gemacht werden und zum Schluss der Inhalt eines Arrays direkt in den Ziel-Bereich zurückgeschrieben wird. Die zweite Variante kann bei einer großen Datenmenge wesentlich schneller sein, weil Excel nicht Zelle für Zelle abklappern muss, sondern nur auf große Bereich auf einmal zugreifen muss, und noch dazu für die Gruppen-Zuordnung nicht auf Zellen zugreifen muss.
LG
Michael
Anzeige
AW: Ergänzend...
24.05.2017 10:31:27
Daniel
Wenn du einen Wert in eine Zelle schreibst, muss Excel eine Vielzahl von Aufgaben erledigen (z.B. Bildschirm aktualisiern; Überprüfen, ob in einer geöffneten Datei Formeln enthalten sind, die auf diese Zelle referenzieren und diese neu berechnen usw)
Wenn du die Zellen einzeln in einer Schleife befüllt, läuft dieses Programm für jede Zelle wiederholt ab.
Wenn du die Werte jedoch erst ein einem Array sammelst und dann das Array als ganzes in die Zellen schreibst, dann kann Excel diese Aufgaben en Block für alle Zellen in einem Schritt ausführen.
Im Prinzip so, wie wenn du bei deinem Handwerker für dein Haus 10x je 1 neues Fenster bestellst und der Handwerker dann 10x anfahren muss und 10 Rechnungen erstellt, die du dann 10x überweisen musst
Bestellst du jedoch 1x 10 Fenster im Block, dann fährt er nur einmal an und schreibt dir auch nur eine Rechnung.
Gruß Daniel
Anzeige
For Each Window in Col.Invoice ;-), owT
24.05.2017 10:34:23
Michael
AW: Mit VBA...
24.05.2017 10:01:25
Felix
Besten Dank,
funktioniert sehr gut! :-)
Lg Felix
Gern, Danke für die Rückmeldung, owT
24.05.2017 10:03:13
Michael
Versuch zu verstehn und Erklärung...
26.05.2017 13:24:04
Felix
Moin Michael,
dies Forum ist schon super. Da stelle ich eine Frage und bekomme von Dir gleich zwei funktionierende Antworten und als VBA Anfänger versuche ich diese jetzt zu verstehen.
Bisher habe ich noch gar nicht mit Arrays im VBA gearbeitet und nach einigem Lesen und Code ausprobieren habe ich auch verstanden, was das Makro macht.
Zu der Zeile bleibe aber Fragen und ich würde mich freuen, wenn Du Sie mir erklärst.
Dim a, b, c(), t$, i&, j&
Klar, hier werden Variable definiert. Was machen die Zeichen hinter den Variablen (), $, &?
Warum wird für diese Variable kein Datentyp definiert?
Lg Felix
Anzeige
AW: Versuch zu verstehn und Erklärung...
26.05.2017 13:29:51
Hajo_Zi
Hallo Felix,
() ist ein Array, die Variablen sind alle als Variant definiert.

AW: Versuch zu verstehn und Erklärung...
26.05.2017 13:34:10
Hajo_Zi
fehler & bedeutet Long
Gruß Hajo
AW: Versuch zu verstehn und Erklärung...
30.05.2017 16:05:37
Felix
Moin Hajo,
vielen Dank für die Erklärung.
Ich hoffe Du kannst mir noch bei einer Frage helfen.
Michael hat hier ein Makro geschrieben, das schon fast alles macht was ich brauche. Ich versuche mich jetzt schon eine Weile daran, habe auch eine Lösung, bin aber auch sicher, dass es besser geht.
Frage:
Aus dem Array sollen die Daten der Spalte 2 in die 3. Spalte des loTarget kopiert werden.
Meine Lösung ist pragmatisch und gefällt mir nicht, da ich hier keinen flexiblen Zielbereich habe.
wsTarget.Range("c2:c8") = ExtractFromArray(arrQuelle:=c, arrColumns:=Array(2))
Wie immer bin ich für den Tip, wie es richtig geht sehr dankbar.
Hier nochmal das ganze Makro:
Sub Refresh_list()
Const SEP$ = ","
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim wsSource As Worksheet: Set wsSource = Wb.Worksheets("Tab01")
Dim wsTarget As Worksheet: Set wsTarget = Wb.Worksheets("Tab02")
Dim loSource As ListObject: Set loSource = wsSource.ListObjects(1)
Dim loTarget As ListObject: Set loTarget = wsTarget.ListObjects(1)
'Dim c As
Dim a, b, t$, i&, j&
Dim c()
Dim rgTarget As Range: Set retarget = Tabelle2.Range("C2")
Dim strColumnName As String
Dim lcSourceTmp As ListColumn
strColumnName = "Keyword"
Application.ScreenUpdating = False
With loTarget.DataBodyRange
a = .Resize(.Rows.Count, 1)
ReDim c(1 To UBound(a), 1 To UBound(a))
End With
With loSource.DataBodyRange
b = .Resize(.Rows.Count, 2)
End With
For i = LBound(a) To UBound(a)
For j = LBound(b) To UBound(b)
If a(i, 1) = b(j, 2) Then t = t & b(j, 1) & SEP
Next j
c(i, 1) = a(i, 1): c(i, 2) = t: t = vbNullString
Next i
'    Copy Data to target
wsTarget.Range("c2:c8") = ExtractFromArray(arrQuelle:=c, arrColumns:=Array(2))
'    With loTarget.DataBodyRange
'        .Resize(.Rows.Count, 3) = c
'    End With
Set Wb = Nothing: Set wsSource = Nothing: Set wsTarget = Nothing
Set loSource = Nothing: Set loTarget = Nothing
Erase a: Erase b: Erase c
End Sub

Lg Felix
Anzeige

333 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige