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

IDs in Zelle kopieren m Bedingungen

IDs in Zelle kopieren m Bedingungen
03.09.2021 10:13:48
Jakob
Hallo zusammen,
Ich benötige wieder einmal euren Input:
Es geht um eine Tabelle (Blatt Datenbasis), in der pro Zeile ein Fall steht (mit einer ID in Spalte A). Nun habe ich diese Fälle in den Spalten F bis H bzw. I bis P mit Dummyvariablen klassifiziert. Jeder Fall ist einmal einer Kategorie in den Spalten F,G oder H zugeordnet (1 bzw. leer wenn nicht zutreffend) und einmal der Sub-kategorisierung in den Spalten I bis P (1 bzw. leer wenn nicht zutreffend) . Ich hoffe das ist halbwegs verständlich erklärt
Nun möchte ich in einer Übersichtstabelle die IDs auf die die Kategorisierung zutrifft in eine Zelle schreiben (Blatt Uebersicht).
Anbei eine Beispieldatei. https://www.herber.de/bbs/user/147891.xlsm
Da so eine Arbeit meine VBA Kenntnisse übersteigen (vor allem da ich keinen ähnlichen Code gefunden hab, den ich an mein Beispiel anpassen könnte, was sonst meist gut funktioniert), bitte um eure Unterstützung. Gerne auch mit Erklärung zum Code, ich möchte was lernen und es das nächste Mal selbst lösen können ;-)
Vielen, vielen Dank!
Liebe Grüße,
Jakob

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: IDs in Zelle kopieren m Bedingungen
03.09.2021 10:59:45
migre
Hallo Jakob!
Zugegebenermaßen hab ich ein paar Minuten gebraucht, um die Logik Deiner beiden Blatt-Strukturen, und vor allem der Sammlung in Übersicht, zu begreifen. Hier einmal eine erste Möglichkeit, die Deine Bsp-Übersicht per Makro ausfüllt (sofern Dich ein anhängender ";" in den Zellen nicht stört, kann man aber auch lösen).
Das ist nur sehr quick-and-dirty über Bereichsdefinitionen gelöst; ich weiß nicht um wieviele IDs, Kategorien und Subkategorien es in Wirklichkeit geht, ggf. müsste man dann hinsichtlich Performance auf eine Lösung mit Arrays umsteigen - das hab ich jetzt in einem ersten Versuch noch nicht getan.
Außerdem ist mir noch nicht klar, was Du Dir in der Übersicht in Spalte J als Ziel vorstellst...
Hier der Code, teste das mal in Deiner Bsp-Mappe (die Übersichtstabelle sollte dafür natürlich noch keine Einträge enthalten):

Sub a()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Datenbasis")
Dim WsZ As Worksheet: Set WsZ = Wb.Worksheets("Uebersicht")
Dim rIDList As Range, cID As Range
Dim rQcol As Range, rQrow As Range, rZ As Range, tRow&, tCol&
Set rZ = WsZ.Range("B2:I4")
With WsQ
Set rIDList = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
For Each cID In rIDList
Set rQrow = .Range(.Cells(cID.Row, 6), .Cells(cID.Row, 8))
Set rQcol = .Range(.Cells(cID.Row, 9), .Cells(cID.Row, 16))
tRow = Application.Match(1, rQrow, 0)
tCol = Application.Match(1, rQcol, 0)
rZ.Cells(tRow, tCol).Value = rZ.Cells(tRow, tCol).Value & cID.Value & ";"
Next cID
End With
End Sub
Schauen wir mal, dass Du die Lösung bekommst, die Du brauchst - dann sehen wir bzgl. Erklärungen weiter ;-)
LG Michael
Anzeige
AW: IDs in Zelle kopieren m Bedingungen
03.09.2021 11:16:44
Jakob
Lieber Michael, vielen Dank dafür, das funktioniert sehr gut!
Es geht um eine Datei mit ca. 200 Zeilen, sollte also machbar sein. Ich habs gerade an einem größeren Sample ausprobiert, funktioniert.
In der letzten Spalte J sollen alle Fälle der "Haupt"kategorien 1 bis 3 stehen (also ohne Berücksichtigung der Sub-Kategorien). Aber eben sortiert wie in der Datenbasus (d.h. keine einfache Aggregierung der Zelleninhalte zb B2:I2).
Darf ich noch um einen sehr großen Gefallen bitten? Leider ist mir nicht ganz klar, was die einzelnen Code-Zeilen genau machen, bzw. wüsste ich nicht wie ich die Code-Zeilen für eigene Projekte in Zukunft nutzen/anpassen könnte. Wäre es dir möglich diese kurz zu kommentieren?
Herzlichen Dank!
Anzeige
AW: IDs in Zelle kopieren m Bedingungen
03.09.2021 11:26:51
migre
Hallo!
Na fein. Bevor ich Dir den Code kommentiere bleiben wir noch bei Spalte J der Übersicht (dann kann ich den Code dahingehend anpassen, und dann kommentieren ;-)):
Was soll wunschgemäß in Zelle J2 stehen? Ich bin von

1;6;8;
ausgegangen, aber das willst Du offenbar NICHT; ich brauch da ein Bsp.
Gib Bescheid,
LG Michael
AW: IDs in Zelle kopieren m Bedingungen
03.09.2021 11:34:42
Jakob
Ahso, doch, genau das.
Vielleicht hat mein Kommentar für Verwirrung gesorgt. Wenn zB in Zelle B2 1; 5 steht, und in Zelle D2 3 steht, dann soll ich Zelle J2 1; 3; 5 stehen, und nicht 1; 5; 3.
AW: IDs in Zelle kopieren m Bedingungen
03.09.2021 12:46:24
migre
So, schau mal, hier nochmal der Code etwas ergänzt und auch auf die Anforderung für Spalte J erweitert - sollte das sein, was Du benötigst.

Sub a()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Datenbasis")
Dim WsZ As Worksheet: Set WsZ = Wb.Worksheets("Uebersicht")
Dim rIDList As Range, cID As Range
Dim rQcol As Range, rQrow As Range, rZ As Range, tRow&, tCol&
Dim rAllColID As Range, cAllColID As Range, aL As Object, aLItem, i&
Dim Clc, ScrUpd
With Application
Clc = .Calculation: .Calculation = xlCalculationManual
ScrUpd = .ScreenUpdating: .ScreenUpdating = False
End With
Set rZ = WsZ.Range("B2:I4")
With WsQ
Set rIDList = .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)
For Each cID In rIDList
Set rQrow = .Range(.Cells(cID.Row, 6), .Cells(cID.Row, 8))
Set rQcol = .Range(.Cells(cID.Row, 9), .Cells(cID.Row, 16))
tRow = Application.Match(1, rQrow, 0)
tCol = Application.Match(1, rQcol, 0)
rZ.Cells(tRow, tCol).Value = rZ.Cells(tRow, tCol).Value & cID.Value & ";"
rZ.Offset(tRow - 1, rZ.Columns.Count).Resize(1, 1) = rZ.Offset(tRow - 1, rZ.Columns.Count).Resize(1, 1) & cID.Value & ";"
Next cID
End With
Set rAllColID = rZ.Offset(, rZ.Columns.Count)
Set aL = CreateObject("System.Collections.ArrayList")
For Each cAllColID In rAllColID
For i = 1 To Len(cAllColID)
If Mid(cAllColID.Text, i, 1)  ";" Then aL.Add Mid(cAllColID.Text, i, 1)
Next i
aL.Sort
cAllColID = vbNullString
For Each aLItem In aL
cAllColID = cAllColID & aLItem & ";"
Next aLItem
aL.Clear
Next cAllColID
With Application
.Calculation = Clc: .ScreenUpdating = ScrUpd
End With
Set Wb = Nothing: Set WsQ = Nothing: Set WsZ = Nothing
Set rIDList = Nothing: Set cID = Nothing: Set rQcol = Nothing
Set rQrow = Nothing: Set rZ = Nothing: Set rAllColID = Nothing
Set cAllColID = Nothing: Set aL = Nothing
End Sub
Zum Code:
Das vollständig auszukommentieren ist etwas langwierig ("VBA bescheiden"); ich versuche Dir die Logik zu erklären, nach der ich den Code geschrieben habe bzw. nach der er arbeitet.
Ziel ist eine Kreuztabelle, d.h. jeweils der (Überschneidungs-) Punkt aus Kategorie und Subkategorie. In der Ziel-Kreuztabelle sind die Kategorien gekippt, die Kategorien sind demnach die Zeilen, die Subkategorien die Spalten. D.h. je ID wird der Punkt in der Ziel-Kreuztabelle von der jeweiligen Position der "1" bestimmt.
D.h. der Code geht alle IDs in der Liste durch, und definiert je ID (je Zeile) 2 Bereiche - der erste Bereich sind die 3 Zellen der Kategorien (Fx:Hx), der 2 Bereich jene 8 Zellen der Subkategorie (Ix:Px). Dann wird je Bereich geprüft wo die "1" steht - der Rückgabewert gibt dann die Zeilen- und Spaltenziele für die Kreuztabelle wieder. Bsp. ID2 - Kategorien-Bereich (=Zeilen-Bereich) reicht von F3:H3, die "1" steht in G3, d.h. der Rückgabewert ist "2" (die 2. Position in diesem Zellbereich); damit wissen wir, dass ID2 in der Zieltabelle auf jeden Fall in die 2. Zeile gesetzt werden muss (Kategorie 2). Analog läuft der Subkategorien-Bereich (=Spalten-Bereich) von I3:P3, die "1" steht in L3, d.h. der Rückgabewert ist "4" (die 4. Position in diesem Zellbereich); damit wissen wir, dass ID2 in der Zieltabelle auf jeden Fall in die 4. Spalte gesetzt werden muss (Subkategorie 4). Damit ergibt sich, dass im Zielbereich (B2:I4) ID2 in die Zelle E3 (2. Zeile, 4. Spalte) gesetzt werden muss.
Gleichzeitig wird in Spalte J die jeweilige ID nochmals eingetragen. Nach Durchlauf aller IDs durchläuft der Code dann nochmal alle Zellen in Spalte J der Zieltabelle und sortiert die dortigen Einträge aufsteigend.
Kommst Du damit hin?
LG Michael
Anzeige
DANKE!
03.09.2021 13:31:30
Jakob
Wunderbar! Vielen, vielen Dank für deine Zeit und dein Wissen!
Gerne! Schönes Wochenende owT
03.09.2021 13:51:46
migre

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige