Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1588to1592
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 Indent, dann Nummemrnerweiterung

Wenn Indent, dann Nummemrnerweiterung
12.11.2017 17:27:38
cH_rI_sI
Guten Abend!
Ich habe mal einen Masterplan entwickelt und da nutze ich kombiniert mit Indent eine "Nummernerweiterung" sowie automatische Nummerierung wie im u.a. Scrennshot ersichtlich:
Userbild
Nun möchte ich aber immer 3 Zeilen verbinden und die Zahl soll trotzdem fortlaufend sein, was es aber nicht ist:
Userbild
Was muss ich am u.a. Code ändern, damit die verbundenen Zeilen nur einmal gezählt werden? Ich blicke bei u.a. Code nicht durch:
Sub Nummerierung_erweitern()
Dim a(), i&, k&, maxZ&, ll&, aus$()
Const maxArr = 4
'maxZ = (Range("B" & Rows.Count).End(xlUp).Row)
maxZ = Cells(Rows.Count, Range("Activities").Column).End(xlUp).Row
ReDim a(1 To maxZ, maxArr)
ReDim aus(2 To maxZ, 0)
For k = 0 To maxArr: For i = 1 To maxZ: a(i, k) = 0: Next: Next
ll = 1
For i = 2 To maxZ
'a(i, 0) = Range("B" & i + 20).IndentLevel + 1
a(i, 0) = Cells(i + 20, Range("Activities").Column).IndentLevel + 1
If a(i, 0) > maxArr Then _
MsgBox "Indent level > 3": a(i, 0) = maxArr
If a(i, 0) = ll Then
For k = 1 To maxArr: a(i, k) = a(i - 1, k): Next
a(i, ll) = a(i - 1, ll) + 1
Else
If a(i, 0)  ll Then
For k = 1 To a(i, 0) - 1: a(i, k) = a(i - 1, k): Next
a(i, a(i, 0)) = a(i - 1, a(i, 0)) + 1
ll = a(i, 0)
End If
End If
End If
For k = 1 To ll: aus(i, 0) = aus(i, 0) & a(i, k) & ".": Next
aus(i, 0) = Left(aus(i, 0), Len(aus(i, 0)) - 1)
Next
'Range("A22:A" & maxZ) = aus
Range(Range("StartID"), Cells(maxZ, Range("SpalteID").Column)) = aus
End Sub
Anbei auch die Beispieldatei:
https://www.herber.de/bbs/user/117623.xlsm
Ich hoffe jemand kann mir helfen - besten Dank schonmal!
Schönen Abend noch!
Lg,
Chrisi

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wenn Indent, dann Nummemrnerweiterung
12.11.2017 21:42:01
Gerd
Moin Chrisi!
Sub messerscherefeuerlichtverbindedeinezellennicht()
Dim r As Long
For r = 22 To 100
Cells(r, 1) = r - 21
Next
End Sub

Gruß Gerd
Das ist ja wohl nicht dein Ernst, Gerd! :-| owT
13.11.2017 00:41:41
Luc:-?
:-?
Doch ...
18.11.2017 08:21:44
lupo1
... verbundene Zellen sind nun mal meistens ungesund. Vor allem, wenn die sich dann auch noch makrogesteuert anpassen müssen.
Der einzige sinnvolle Anwendungsbereich sind Formulare oder gestylte Ausgaben.
Wenn meine Annahme richtig ist, ...
13.11.2017 02:24:22
Luc:-?
…Chrisi,
und das von dir gezeigte Pgm im Prinzip die von dir gezeigte Struktur erteugt, musst du daran gar nichts ändern, sofern es denn auch zufriedenstellend fktioniert. Da ich desweiteren annehme, dass diese Struktur bereits existiert und du sie eigentlich nur ändern willst (ggf auch nur eine Kopie davon), sehe ich keine Notwendigkeit, aus den Zellen der Spalten A:B senkrechte Verbund­Zellen zu machen, es sei denn, ihnen folgen weitere Zellen mit unterschiedlichen Angaben in den einzelnen Zeilen, was aus deinem BildBsp aber nicht ersichtlich ist. Dann müsste darunter aber auch eine Spalte sein, die diese unterschiedlichen Zeilen erklärt!
Davon, was du wirklich bezweckst, hängt nämlich ab, wie du das im Folgd beschriebene und gezeigte universale VBA-Tool ein­set­zen musst. Wären die Inhalte evtller FolgeSpalten nämlich zeilenweise unterschiedlich, wäre es möglicherweise zweckmäßig, alle Inhalte von Spalte A entweder zu erhalten oder auf die jeweils 1.Stelle zu beschränken, damit ggf auch nach dieser Spalte gefil­tert wdn kann, es sei denn, eine andere, nichtgezeigte Spalte kann das übernehmen. Für Spalte B gilt Ähnliches. Hier wäre dann eben­falls zu entscheiden, ob alle Texte beim Verbund in ihrer Zelle verbleiben (dann wäre nur der jeweils 1. sichtbar), oder aber in der jeweils 1.Zelle vereinigt wdn sollen. All das kann das Tool leisten und auch, was nach dem von dir Gezeig­ten nahe­liegend ist, die Umwand­lung in nur eine Zeile pro Item inkl Leer­Zeilen-Ent­fer­nung. Letz­teres wird nach­folgend erläutert. Du hast dabei wg der Menü­Führung aber die Wahl, Einzel­Schritte nach deinem Bedarf zu gestal­ten oder auch weg­zu­lassen.
Ausgehend vom Gezeigten unter der Maßgabe, dass eine derart strukturierte Datei fertig vorliegt (inkl voll­stän­diger Numme­rierung in Spalte A) und eine Tabelle mit ein­facher Numme­rierung daraus erzeugt wdn soll, die im End­Ergebnis keine Verbund­Zellen ent­hält, aber alle Texte aus Spalte B in der jeweils mit A kor­respon­die­ren­den B-Zelle ver­bindet (evtlles Trenn­zeichen kann frei gewählt wdn), wäre folgd Ablauf erfor­derlich:
1. Ermittlung der Struktur der Spalte A mit UDF VertStruct aus dem PgmPaket des unten verlinkten Tools mit folgd, am Bsp orien­tier­ter Fml: =VertStruct(A22:A29;"?.1*";;;1;1)
Hiermit wdn alle zusammengehörigen Zeilen gezählt und als MatrixKonstante in TextForm ausgegeben. Dabei wdn alle Unter-Glie­de­rungs­Nrn der HptNr hinzugezählt, was hier {4;2;1;1} ergäbe. Dieses Ergebnis sollte dann sinn­voller­weise als Ergebnis­Text gespei­chert wdn, um Ver­änderungen während des ArbeitsProzesses zu vermeiden!
Anmerkung: Falls tatsächlich dauerhafte VbZellen erzeugt wdn sollen/müssen und auch Filterung nach Spalte A mit einheitlicher Nummerierg mög­lich sein soll, sollten in den Zeilen nur die 1.Ziffern der Gliederung stehen bleiben, was zuvor gemacht wdn muss.
2. Auswahl des relevanten Bereichs der 1.Spalte und Aufruf der SubProzedur VZSpFestZ (ist direkt nur ohne Parameter möglich) → in der dann erscheinenden InputBox den Input-VorgabeText durch die Adresse der Zelle mit der ermittelten MatrixKonstante erset­zen (und ggf weitere geforderte Parameter lt VorgabeText hinzufügen). Die Proz ruft dann intern die SubProz VZellenSp mit entsprd Parametern auf, die dann ggf noch Fehlendes per MsgBox von dir entscheiden lässt. Das Gleiche muss anschld für Spalte B wie­der­holt wdn, wobei deine Entscheidung ggf anders ausfallen kann bzw wird.
Je nachdem wie deine Entscheidung ausgefallen ist, könntest du anschld die VbZellen (ebenfalls spalten­weise!) wieder auflösen und entstandene Leerzeilen entfernen. Dann ggf also …
3. VerbundZellen aufheben durch Auswahl des jeweils relevanten SpaltenBereichs und Aufruf der Proz VZSpTrenn, die ebenfalls intern die Proz VZellenSp mit speziellem 2.Parameter aufruft.
4. Auswahl des relevanten Bereichs und Aufruf der SubProz LeerZeilEntffertig!
Externer Link zum Tool-PgmPaket: VbZellen bilden & ggf wieder trennen (Nur vertikal!)
Dieses PgmPaket ist zwar auch im Herber-Archiv enthalten, aber ohne zusätzlichen BegleitText, der ja auch noch Erläuterungen enthält.
Noch ein Tipp: Es ist zweckmäßig, dieses Paket in der Personal.xlsm oder besser noch in einem AddIn zu speichern, damit es ggf stets zV steht und die damit bearbeitete Datei nicht allein deshalb als .xlsm/b gespeichert wdn muss.
Feedback nicht unerwünscht! Gruß und viel Erfolg, Luc :-?
„Die Intelligenz ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
Noch ein (vergessener) Hinweis
13.11.2017 02:28:21
Luc:-?
Die VerbundZellen-Bildung benötigt auf dem jeweiligen Blatt temporär eine freie Spalte außerhalb des UsedRange!
Luc :-?
AW: Noch ein (vergessener) Hinweis
13.11.2017 12:47:49
cH_rI_sI
Hi Luc,
erstmals recht herzlichen Dank, dass Du Dir soviel Mühe gemacht hast - aber selbst da blicke ich ehrlich gesagt nicht ganz durch...
Vielleicht nochmals zur Erklärung warum ich auf einmal je 3 Zeilen verbinden möchte:
Es handelt sich hier ursprünglich um einen Projektplan, wo die Plan- und Ist-Zeiträume überlagert in einer Zeile dargestellt werden. Ich möchte nun aber die Plan- und Ist-Zeiträume getrennt darstellen und zusätzlich auch noch die prozentuelle Erfüllung darstellen, da teilweise mit der Überlagerung gewisse Informationen verloren gehen. Das ist der Grund warum ich 3 Zeilen verbinden muss...
Gibt es keinen einfacheren Weg um eine fortlaufende Nummer zu garantieren? Ich dacht eigentlich, man braucht nur das bestehende Coding minimal abändern, aber dass sich das Ganze so komplex gestaltet hätte ich nicht gedacht...
Lg,
Chrisi
Anzeige
AW: Noch ein (vergessener) Hinweis
13.11.2017 12:47:49
cH_rI_sI
Hi Luc,
erstmals recht herzlichen Dank, dass Du Dir soviel Mühe gemacht hast - aber selbst da blicke ich ehrlich gesagt nicht ganz durch...
Vielleicht nochmals zur Erklärung warum ich auf einmal je 3 Zeilen verbinden möchte:
Es handelt sich hier ursprünglich um einen Projektplan, wo die Plan- und Ist-Zeiträume überlagert in einer Zeile dargestellt werden. Ich möchte nun aber die Plan- und Ist-Zeiträume getrennt darstellen und zusätzlich auch noch die prozentuelle Erfüllung darstellen, da teilweise mit der Überlagerung gewisse Informationen verloren gehen. Das ist der Grund warum ich 3 Zeilen verbinden muss...
Gibt es keinen einfacheren Weg um eine fortlaufende Nummer zu garantieren? Ich dacht eigentlich, man braucht nur das bestehende Coding minimal abändern, aber dass sich das Ganze so komplex gestaltet hätte ich nicht gedacht...
Lg,
Chrisi
Anzeige
AW: Noch ein (vergessener) Hinweis
13.11.2017 13:41:18
cH_rI_sI
Noch was - kann man die fortlaufende Nummerierung nicht einfach mit Autofill machen (funktioniert auch bei verbundenen Zellen wie gewollt) und mit dem restlichen Code nur die Nummernerweiterung bei Indent machen? Wenn ja, was muss ich beim bestehenden Code ändern / weglassen?
Wäre ech nett, wenn Du Dir das nochmal ansehen könntest - natürlich ist auch jeder andere eingeladen ;-)
AW: Noch ein (vergessener) Hinweis
13.11.2017 13:41:20
cH_rI_sI
Noch was - kann man die fortlaufende Nummerierung nicht einfach mit Autofill machen (funktioniert auch bei verbundenen Zellen wie gewollt) und mit dem restlichen Code nur die Nummernerweiterung bei Indent machen? Wenn ja, was muss ich beim bestehenden Code ändern / weglassen?
Wäre ech nett, wenn Du Dir das nochmal ansehen könntest - natürlich ist auch jeder andere eingeladen ;-)
Anzeige
Kann man sicher auch so machen, ...
13.11.2017 14:38:46
Luc:-?
…Chrisi,
wie du es dir vorstellst, aber das gibt dein Bsp ebensowenig her wie deine jetzige Begründung für den ZellVerbund. Und was da bei Autofill „auch bei verbundenen Zellen wie gewollt“ fktioniert*, ist mir schleierhaft und lässt mich befürchten, dass wir anein­an­der vorbei reden…
* 1. AutoFill nummeriert nicht, sondern überträgt einen vorhandenen Wert in angrenzende Zellen, aber 2. in VerbundZellen nur, wenn alle die gleiche Größe haben, was lt deinem Bsp bei dir aber nicht der Fall ist. Übrigens hast du bei deinem Wunschergebnis auch noch einen Fehler gemacht, der zusätzlich verwirren könnte, besonders dann, wenn's keiner wäre!
Mein Tool hatte ich bereits vor längerer Zeit als universelles Arbeitsmittel für senkrechten ZellVerbund geschrieben. Dabei mussten natürlich möglichst viele Gegebenheiten berücksichtigt wdn (u.a. bereits existente VerbundZellen), die ggf bei dir gar nicht auf­tre­ten. Deshalb ist es so komplex.
Wenn du ein spezielles Pgm allein für dein Problem wünschst, solltest du auch genau deine Ausgangs­Daten­Basis (Datei) darstellen und nicht irgendeinen Zwischenschritt; ebenso dann auch alles, was für dein WunschErgebnis relevant und folglich zu beachten wäre. Es ist nämlich aus deinem Bsp im Ggsatz zu deinem Nummerierungswunsch nicht zu erkennen, dass noch keine irgendwie geartete Nummerierung vorliegen würde.
Ich hatte ja die Voraussetzungen für eine sinnvolle VerbundZellen-Bildung genannt. Da du offensichtlich noch irgendwas berechnen willst, mögen die ggf auch zutreffen, aber ganz klar ist das nicht. Ansonsten kann man die Texte in B auch so in einer Zelle ver­bin­den, dass sie mehrzeilig darin stehen.
Fazit: Deine Blattstruktur (Quelle:Ziel) ist nicht klar und sollte mit entsprd aussagekräftigen Bspp dargestellt wdn (BspDatei-Upload!). Anderenfalls wird sich wohl keiner dafür interessieren.
Luc :-?
Anzeige
AW: wahrscheinlich ganz einfach:
13.11.2017 14:41:08
Daniel
In einem Zellverbund enthält immer die linke obere Zelle den angezeigten Wert.
Die anderen Zellen werden nicht angezeigt und sind in der Regel auch leer (je nach dem , mit welcher Methode du den Zellverbund erzeugst.
Wenn du immer die gleiche Anzahl von Zeilen mit einander verbindest, dann reicht es vielleicht aus, wenn du die Schleife mit der entsprechenden Schrittweite durch die Tabelle laufen lässt:
For i = 2 To maxZ Step 3
wenn du dich irgendwo auf den Vorgänger- oder Nachfolgerindex beziehen willst, müsstest du dann statt i-1 oder i+1 dann eben i-3 bzw i+3 rechnen.
Gruß Daniel
Anzeige
Sein Bsp deutet nicht auf 'ganz einfach' hin! owT
13.11.2017 16:22:34
Luc:-?
:-?
wenn man es genauer anschaut, dann ist es einfach
13.11.2017 17:05:53
Daniel
das man in den code da noch weiter eingreifen muss mag sein, aber im Prinzip geht's ja nur darum, nicht jede Zeile nacheinander anzuschauen, sondern nur jede 3.
Mehr dürfte es nicht sein.
Spannend wird's erst, wenn die Anzahl der verbundenen Zellen nicht mehr konstant 3 ist, sondern variabel.
auf jeden falls funktionierts mit STEP 3.
ich habe die Indizierung nochmal an die Zeilennummern angepasst, das macht die Logik bzw den Abgleich zwischen Tabelle und Array etwas einfacher, da dann Index- und Zeilennummern gleich sind.
Sub Nummerierung_erweitern()
'angepasst auf Zeilen im 3er-Verbund
Dim a(), i&, k&, maxZ&, ll&, aus$()
Const maxArr = 4
'maxZ = (Range("B" & Rows.Count).End(xlUp).Row)
maxZ = Cells(Rows.Count, Range("Activities").Column).End(xlUp).Row
ReDim a(19 To maxZ, maxArr)
ReDim aus(22 To maxZ, 0)
For k = 0 To maxArr: For i = 19 To maxZ Step 3: a(i, k) = 0: Next: Next
ll = 1
For i = 22 To maxZ Step 3
'a(i, 0) = Range("B" & i + 20).IndentLevel + 1
a(i, 0) = Cells(i, Range("Activities").Column).IndentLevel + 1
If a(i, 0) > maxArr Then _
MsgBox "Indent level > 3": a(i, 0) = maxArr
If a(i, 0) = ll Then
For k = 1 To maxArr: a(i, k) = a(i - 3, k): Next
a(i, ll) = a(i - 3, ll) + 1
Else
If a(i, 0)  ll Then
For k = 1 To a(i, 0) - 1: a(i, k) = a(i - 3, k): Next
a(i, a(i, 0)) = a(i - 3, a(i, 0)) + 1
ll = a(i, 0)
End If
End If
End If
For k = 1 To ll: aus(i, 0) = aus(i, 0) & a(i, k) & ".": Next
aus(i, 0) = Left(aus(i, 0), Len(aus(i, 0)) - 1)
Next
'Range("A22:A" & maxZ) = aus
Range(Range("StartID"), Cells(maxZ, Range("SpalteID").Column)) = aus
End Sub
Gruß Daniel
Anzeige
AW: wahrscheinlich ganz einfach:
13.11.2017 16:55:33
cH_rI_sI
Hi Daniel,
besten Dank für deinen doch sehr einfachen Lösungsvorschlag - wenn ich den Code um Step 3 erweitere, steht in jedem Zeilenverbund nur noch 1:
Userbild
Hast Du eine Idee warum?
Lg,
Chrisi
AW: wahrscheinlich ganz einfach:
13.11.2017 17:10:27
Daniel
Hi
naja, du musst deine ganze Logik noch mal durchgehen und den Code entsprechen anpassen.
Es darf halt nur jede 3. Zeile verwendet werden, sowohl in der Tabelle, als auch im Array.
dann läuft es (schau dir mal meinen Code in der Antwort an Luc an)
Gruß Daniel
Anzeige
AW: wahrscheinlich ganz einfach:
13.11.2017 17:59:47
cH_rI_sI
Hi Daniel,
dein Code funktioniert - besten Dank, Du bist ein Genie!
Natürlich auch danke an Luc!
Somit CLOSED...
D.h. also, dein 1.Bsp hat mit deinem 2. gar ...
13.11.2017 21:27:39
Luc:-?
…nichts zu tun, Chris,
und soll nur verdeutlichen, wofür dein Pgm ursprünglich geschrieben wurde…‽ Ich bin aber von einer Umwandlung der einen in die andere Tabelle ausgegangen. Du solltest so etwas zukünftig deutlicher machen, denn dein 1.Bsp war wie das zugehörige Pgm folglich eine überflüssige Info, die nur Verwirrung stiftet…
Im 2.Bsp kommen aber keine TextEinzüge vor, sondern stets nur ein Text pro lfdNr! Eine Nummerierung nur jeder 3.Zeile bekäme man auch mit einer Fml hin, sogar die jeweils 2malige Wiederholung in 2 Folgezeilen. Das wäre recht simpel und Letzteres hätte außerdem den Vorteil, dass man auch nach diesen Zeilen filtern könnte. Genau für solche Fälle hatte ich auch mein Tool geschrie­ben, wodurch man listenartige Tabellen wie KreuzTabellen (quasi pivotartig) aussehen lassen kann.
Wenn die Struktur nicht gleichartig ist, also in unterschiedlich große ZeilenBlöcke geteilt ist, kann man diese vorgeben oder ggf mit der UDF VertStruct ermitteln. Für die Struktur aus Bsp1 ergäbe das ja mit Fml in G1 =VertStruct(A22:A30;"?.1*";;;1;1) für 5 Hpt­Glie­derungsPktt {4;2;1;1;1} Zeilen für die resultierenden 5 Blöcke. Die Zelle dieses Ergebnisses könnte dann in folgende sin­gu­lare MatrixFml eingebunden wdn:
A22[:A30]: {=INDEX(VSplit(GLÄTTEN(VJoin(WIEDERHOLEN(" "&ZEILE(INDIREKT("1:"&ANZAHL(TxEval(G$1))));
INDEX(TxEval(G$1);;ZEILE(INDIREKT("1:"&ANZAHL(TxEval(G$1))))));""));;1;1);ZEILE(A1))}
Dabei kämen hier 3 weitere UDFs in Anwendung:
TxEval: https://www.herber.de/forum/archiv/1476to1480/1476498_Projektplan.html#1477400
VJoin (Vs1.4) & VSplit (Vs1.1) in BspDatei: https://www.herber.de/bbs/user/99024.xlsm
Dadurch wird in jede Zeile die entsprd lfdNr eingetragen. Anschld kann die SubProz VZellenSp direkt auf diesen (ausgewählten) Bereich der Spalte A angewendet wdn, wodurch VerbundZellen erzeugt wdn können, die in jeder ihrer Zellen den jeweiligen Wert behalten (nur der 1. wird angezeigt). Dabei spielt auch keine Rolle, dass die Zellen MatrixFmln enthalten, ja sogar eine plurale MatrixFml (nicht auf Basis der hier gezeigten singularen!) über alle Zellen könnte auf mehrere VbZellenBlöcke in diesem Bereich aufgeteilt wdn, ohne dass ihr Zusammenhang und -halt verloren geht (soviel zu Xl-WarnHinweisen ;-]).
Luc :-?
Anzeige
AW: D.h. also, dein 1.Bsp hat mit deinem 2. gar ...
14.11.2017 08:07:08
cH_rI_sI
Hi Luc,
das erste Beispiel hat nichts mit dem 2ten zu tun - also richtig erkannt;
einziger Unterschied ist nur 3 Zeilen statt einer Zeile.
Sorry für die Verwirrung, ich werde zukünftig versuchen mich klarer auszudrücken.
Danke nochmal für deine Mühe!
Lg,
Chrisi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige