Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1552to1556
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

Matrizen in Spalte und identische aus M1 weglassen

Matrizen in Spalte und identische aus M1 weglassen
24.04.2017 13:40:03
Jens
Hallo zusammen,
ich habe mehrere Bereiche (Z.B. H12:L251 & N12:W264 & Y12:AH264) diese sollen Matrix für Matrix und innerhalb der Matrix Zeile für Zeile untereinander geschrieben werden in den Zielbereich D12 bis Dxxx. Wobei nur die Zellen die nicht leer sind kopiert werden sollen. So dass hinterher alle Werte direkt nacheinander in Spalte D stehen.
Danach soll als letztes noch aus einer Spalte G12:G359 alle diejenigen Zellen unten dran ergänzt werden, wo das erste Zeichen der bestehenden Texte von Spalte D (die durch die Operation oben schon zusammen getragen wurden) nicht IDENTISCH ist mit dem ersten Zeichen der Texte aus Spalte G12:G359 (Die Werte in Spalte G12:G359 haben übrigens keine Leerzellen). Mit anderen Worten die Texte aus den Matrizen H12:L251 & N12:W264 & Y12:AH264 tauchen allen ohne wenn und aber in Spalte D auf. Jedoch die Texte aus Spalte G12:G359 nur dann, wenn das erste Zeichen der jeweiligen Zelle nicht auch schon das erste Zeichen eines Textes aus den Matrizen H12:L251 & N12:W264 & Y12:AH264 ist.
Ich hoffe das lässt sich verstehen? Sonsten bitte nachfragen.
Vielen Dank für die Hilfe!

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mit VBA so...
24.04.2017 14:53:03
Michael
Hallo,
teste mal folgenden Code (in einem allgemeinen Modul):
Sub a()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim Ws As Worksheet: Set Ws = Wb.Worksheets("Tabelle1")
Dim Matrizen As Range, EinzelSpalte, Dic As Object
Dim a, b, i&, j&, k&, l&, z&, s&
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
With Ws
Set Matrizen = Union(.Range("H12:L251"), .Range("N12:W264"), .Range("Y12:AH264"))
ReDim b(1 To Matrizen.Cells.Count)
For i = 1 To Matrizen.Areas.Count
a = Matrizen.Areas(i)
For z = LBound(a, 1) To UBound(a, 1)
For s = LBound(a, 2) To UBound(a, 2)
If a(z, s)  vbNullString Then
j = j + 1: b(j) = a(z, s)
If Not Dic.exists(Left(a(z, s), 1)) Then Dic.Add Left(a(z, s), 1), ""
End If
Next
Next z
Erase a
Next i
ReDim Preserve b(1 To j)
For k = 1 To j
.Cells(11 + k, 4) = b(k)
Next k
EinzelSpalte = .Range("G12:G359")
For l = LBound(EinzelSpalte) To UBound(EinzelSpalte)
If Not Dic.exists(Left(EinzelSpalte(l, 1), 1)) Then
.Cells(.Rows.Count, 4).End(xlUp).Offset(1, 0) = EinzelSpalte(l, 1)
End If
Next l
End With
Set Wb = Nothing
Set Ws = Nothing
Set Matrizen = Nothing
Set Dic = Nothing
Erase b
Erase EinzelSpalte
End Sub

Anpassen müsstest Du ggf. den Blattnamen (bei mir Tabelle1), die Bereichsangaben sollten passen, hab ich von Dir übernommen.
Passt?
LG
Michael
Anzeige
AW: Mit VBA so...
24.04.2017 18:28:34
Jens
Hallo Michael,
vielen Dank für die Antwort. Ich bekomme leider bei der Zeile:
.Cells(11 + k, 4) = b(k)
für k = 3 einen Fehler:
Laufzeitfehler '1004': Anwendungs- oder objektdefinierter Fehler
Ich bin gerade dabei den Fehler zu Googlen aber habe noch keinen passenden Ansatzpunkt. Passwortschutz oder Blattschutz oder Dergleichen hat die Datei auf jedenfall nicht.
Hast du eine Idee?
Ich habe mal ein Muster hochgeladen:
https://www.herber.de/bbs/user/113081.xlsx
Wenn es damit funktioniert sollte es bei mir auch funktionieren.
Anzeige
= & + Zeichen im Text stören den Code ...
24.04.2017 19:40:27
Jens
Hallo Michael,
jetzt bin ich mit der Fehleranalyse einen Schritt weiter gekommen aber kenne keine Lösung dazu. Es muss irgend etwas mit dem Zelleninhalt selbst zu tun haben. Der Text in der Zelle - und der kann gerne als Text behandelt werden - lautet in diesem Fall:
==P16,P48,R48,R16
Der Text soll genau so bleiben. Keine Veränderung erfahren. Und das es hier zufällig sich um Gleichheitszeichen handelt soll auch nicht stören. Prinzipiell kommen als erstes Zeichen der Texte in den Zellen ALLE nur erdenklichen Zeichen vor. Und dabei ist auch Groß- und Kleinschreibung ein wichtiges Unterscheidungskriterium!
Wie können wir das sicherstellen?
So jetzt habe ich das Ganze mal ohne diese eine Zelle durchlaufen lassen. Der Nächste Fehler kommt bei Zeile:
.Cells(.Rows.Count, 4).End(xlUp).Offset(1, 0) = EinzelSpalte(l, 1)
Soweit ich das auf die Schnelle erkennen kann stört sich der Code hier am + Zeichen das irgend wann mal auch an erster Stelle steht. Wie gesagt alle erdenklichen Zeichen stehen mal an erster Stelle bei den Zellen die verarbeitet werden. Ich werde jetzt mal etwas rum experimentieren was man da machen könnte.
Vielleicht hat aber auch jemand eine Idee?
Vielen Dank für die Hilfe!
Anzeige
AW: Versuch mal...
24.04.2017 19:52:42
Michael
Hallo Jens,
...konnte mir Deine Datei noch nicht ansehen, aber das mach ich morgen, falls es nicht klappt (bin heute nicht mehr vor der Maschine)...
...aber versuch doch mal statt
.Cells(11 + k, 4) = b(k)
...das hier...
.Cells(11 + k, 4) = "'" & b(k)
Klappt's?
LG
Michael
AW: Versuch mal...
25.04.2017 09:56:08
Jens
Hallo Michael,
Vielen Dank. Der Tip hat geholfen. Jetzt habe ich nur gemerkt, dass ich noch einen Fehler in meinem Denken drin hatte. Besser wäre es die Matrizen Spalte für Spalte durch zu gehen anstatt Zeile für Zeile.
Zudem habe ich gemekrt, dass in den Matritzen auch noch Doppelungen drin sind (bezogen auf jeweils immer nur das erste Zeichen der Texte), die es nicht geben darf. Wenn zwei erste Zeichen eines Zellentextes gleich sind, soll immer die Zellen genommen werden, bei denen jeweils die höchste Zahl niedriger ist als beim anderen die höchste Zahl.
Z.B.
==P16,P48,R48,R16 (Zelle 1)
==P109,R109 (Zelle 2)
Bei diesen zwei Zellen, deren erstes Zeichen identisch ist, soll Zelle 1 genommen werden da 48 höher ist als 109. Wahrscheinlich muss man die Daten im Array dann erst sortieren? Oder wie kann man das am elegantesten lösen?
Freue mich wenn du mir hier noch mal helfen könntest.
Vielen Dank.
Anzeige
AW: Echt jetzt?!?!?!
25.04.2017 10:40:15
Michael
Hallo Jens!
Das ist jetzt nicht Dein Ernst, oder? Dir ist schon klar, dass Du somit a) die Anforderungen an den Code komplett änderst, damit b) ich meinen ersten Code für die Mülltonne geschrieben habe und c) ich daher stinksauer bin?!
Ich schau mir das an, aber nur mit einer adäquaten Beispiel-Mappe von Dir. Mir reicht ein Tabellenblatt mit drei kleinen (!) Bereichen (Deinen Matrizen), jeweils irgendwo zwischen 2 und vier Spalten und eben ein paar Zeilen, und der einen kurzen zusätzlichen Spalte (auch 20 Zellwerte). Die Einträge in den Zellen bitte so, wie es in der Form Deinem Original entspricht (also wie Dein letztes Beispiel, nur eben mehr davon). Ohne Bsp-Mappe mache ich hier nicht weiter!
LG
Michael
Anzeige
AW: Echt jetzt?!?!?!
25.04.2017 13:45:27
Jens
Hallo Michael,
Es tut mir wirklich sehr leid dass ich A so unfähig bin, und B diese Unfähigkeit auch noch offen gelegt habe. Damit habe ich deine Gefühle anscheinend sehr verletzt was mir sehr leid tut.
Ich möchte mich hiermit, mit aller Deutlichkeit, für meine Fehler entschuldigen. Dass ich diese Fehler nicht vorausgesehen habe, tut mir sehr leid. Ich werde versuchen in Zukunft besser zu sein.
Da ich mir bei deinen Ausführungen jetzt nicht hundertprozentig sicher war, ob du lieber ein vollständiges Beispiel haben möchtest, oder ein abgespecktes kleines Beispiel, habe ich die Datei um einen Reiter ergänzt welches ein kleines übersichtliches Beispiel zeigt. Gleichzeitig habe ich versucht, das Thema auch noch mal schriftlich in der Datei zusammenzufassen.
Solltest du irgendwelche weiteren Fragen haben, oder ich noch irgendetwas zum Gelingen beitragen können, dann schreib mir das bitte.
Hier der Link zur neuen Datei:
https://www.herber.de/bbs/user/113103.xlsx
Vielen Dank für deine Geduld und Hilfe!
Anzeige
AW: Okay, dann teste mal...
25.04.2017 16:36:30
Michael
Hallo Jens!
Zunächst: So eine Entschuldigung hätte es nicht gebraucht ;-), es hat mich einfach nur geärgert, Danke dafür! Aber, ich war nicht untätig, obwohl mich Deine neuen Anforderungen schon vor eine Herausforderung gestellt haben - das war jetzt doch knifflig (zumindest für mich)...
Zuerst ein paar Anmerkungen zum Code:
- Ich hab ihn auf Basis Deines "Beispiel in klein" getestet; das klappt aus meiner Sicht, aber Du musst trotzdem einen vollen Test mit Deinen Originaldaten machen
- Der Code läuft jetzt neu auf dem aktiven Blatt, nicht mehr auf einem bestimmten (zB "Tabelle1"), d.h. Du musst zunächst sicherstellen, dass das betroffene Blatt auch aktiv ist, bevor Du den Code ausführst.
- Deine Bereichsangaben ("Matrizen") musst Du noch einpflegen, es sind aktuell nur die vom kleinen Bsp. drinnen
- Anders als bei Deinem kleinen Bsp hab ich jetzt für die Zielspalte wieder Spalte D, ab D12 angenommen (wie in Deinem Ursprungsbeitrag)
- Es braucht in diesem (neuen) Fall einen wesentlich erweiterten Code (insgesamt 2 Subs) - bitte beide einfach in ein allgemeines Modul einfügen; starten musst Du nur "Sub c"
Teste mal, die Anforderungen waren schon eine Wucht ;-):
Sub c()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim Ws As Worksheet: Set Ws = Wb.ActiveSheet
Dim Matrizen As Range
Dim Dic As Object, RegEx As Object
Dim Zahlen, a, b, c, d, Sp
Dim i&, j&, k&, l&, m&, n&, o&, z&, s&, nZ&
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set RegEx = CreateObject("vbscript.regexp")
With Ws
Set Matrizen = Union(.Range("D2:G10"), .Range("I2:M10"))
For i = 1 To Matrizen.Areas.Count
a = Matrizen.Areas(i)
ReDim b(1 To Matrizen.Areas(i).Cells.Count)
For s = LBound(a, 2) To UBound(a, 2)
For z = LBound(a, 1) To UBound(a, 1)
If a(z, s)  vbNullString Then
j = j + 1: b(j) = a(z, s)
If Not Dic.exists(Left(a(z, s), 1)) Then Dic.Add Left(a(z, s), 1), ""
End If
Next z
Next s
ReDim Preserve b(1 To j)
For k = 1 To j - 1
For l = k + 1 To j
If b(k)  vbNullString And b(l)  vbNullString Then
If Left(b(k), 1) = Left(b(l), 1) Then
With RegEx
.Pattern = "[0-9]{2,}"
.Global = True
End With
Set Zahlen = RegEx.Execute(b(k))
ReDim c(0 To Zahlen.Count - 1)
For m = 0 To Zahlen.Count - 1
c(m) = CInt(Zahlen(i))
Next m
Call QuickSort(c, LBound(c), UBound(c))
Set Zahlen = RegEx.Execute(b(l))
ReDim d(0 To Zahlen.Count - 1)
For m = 0 To Zahlen.Count - 1
d(m) = CInt(Zahlen(i))
Next m
Call QuickSort(d, LBound(d), UBound(d))
If c(UBound(c)) > d(UBound(d)) Then
b(k) = vbNullString
ElseIf d(UBound(d)) > c(UBound(c)) Then
b(l) = vbNullString
End If
Erase c: Erase d
End If
End If
Next l
Next k
For n = LBound(b) To UBound(b)
If b(n)  vbNullString Then
If .Cells(.Rows.Count, 4).End(xlUp).Row  High Then Exit Sub
vPartition = ArrayToSort((Low + High) \ 2)
i = Low: j = High
Do
Do While ArrayToSort(i)  vPartition
j = j - 1
Loop
If i  j
If (j - Low) 
Gib Bescheid ob das zufriedenstellend läuft!
Michael
Anzeige
AW: Achja, und...
25.04.2017 16:38:55
Michael
...natürlich auch noch die Bereichsangabe für die Einzelspalte anpassen, ich hab hier noch Spalte C aus dem kleinen Beispiel im Code!
Gib Bescheid!
Michael
AW: Achja, und...
26.04.2017 09:56:06
Jens
Hallo Michael,
allerdings!!! Was für eine Wucht. Vielen herzlichen Dank.
Ich habe nur eine Klitze-Kleinigkeit ändern müssen. Aus
.Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0) = "'" & Sp(o, 1)
habe ich
.Cells(.Rows.Count, 4).End(xlUp).Offset(1, 0) = "'" & Sp(o, 1)
gemacht, damit die Ergebnisse alle in Spalte D ankommen. Aber das war gar nicht schlimm. Jetzt funktioniert der Code SUPER und ich kann endlich durchstarten.
Vielen herzlichen Dank für deine Hilfe.
Leider kann ich dir im Excel nicht viel helfen. Hier bist du viel besser als ich. Aber kann ich dir bei irgendetwas anderem mit Rat oder Tat helfen? (Schwierig sich zu revangieren!)
Anzeige
AW: Super, freut mich! Viel Erfolg noch! owT
26.04.2017 10:59:07
Michael

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige