> Wenn mit vba, wie identifiziere ich die
> Gliederungsebene einer Zelle?
Du willst "auslesen" in welcher Gliederungsebene du dich befindest, aber wer
und wie wird denn die Gliederung eingerichtet? Wenn du das weisst, kannst du
es auch mit VBA programmieren. Wenn du Gliederungen hast, ohne zu wissen
warum, sind deine Daten schlecht organisiert.
viele grüsse
arno
http://mitglied.lycos.de/cfawhb/excel/newsGliederung.xls
--
Gruß Alexander XL2000/WIN98SE (Antworten bitte nur hier!)
Lars <lars.k...@gmx.de> schrieb in im Newsbeitrag:
31519c25.04031...@posting.google.com...
Hi Arno,
ueber (Excel 97 SR 2 ) Daten->Gruppierung und Gliederung->Gruppierung->Zeilen.
In der ersten Zelle geder Zeile soll nun die jeweilige Gliederungszahl stehen:
1.
1.1.
1.2.
1.3.
usw ...
usw. = also:
2.
2.1
2.2
3.
3.1
schon klar! woran erkennst du den wechsel von von 1.3 nach 2. ?
arno
Hi Arno,
genau dies ist mein Problem, ich möchte die Gliederungsebenen (welche
links am Blattrand durch + und - aufgeklappt und geschlossen werden
können) mit VBA identifizieren, damit ich die Nummerierung als Wert
(1.3 oder 2.) zurück in die Zelle geben kann.
Gruss Lars
_woran_erkennst_du,_dass_von_1.3_auf_2._gewechselt_werden_soll,_wenn_du_das_
manuell_erledigen_müsstest?
arno
"Lars" <lars.k...@gmx.de> schrieb im Newsbeitrag
news:31519c25.04031...@posting.google.com...
ich erkenne es an den Gliederungsebenen am linken Blattrand (links von
den Zeilennummern sind die Gliederungsebenen mit + und - aufklappbar).
ich kann auch einen screenshot zur Verdeutlichung verschicken...
> ich erkenne es an den Gliederungsebenen am linken Blattrand
ich frage dich nur noch ein einziges mal, also reiss dich zusammen:
Nehmen wir mal an, in deinem Blatt sind _keine_ Gliederungssymbole (das sind
diese + und - Dinger ganz links). Wenn du diese Gliederungen selbst setzen
müsstest, woran erkennst du dann, was in welche Ebene gehört? Woran erkennst
du, dass Ebene 1.3 aus ist und jetzt 2. kommt?
Solltest du keine Antwort auf diese Frage haben, dann lies meine
ursprüngliche Antwort auf deine Frage.
arno
Hi Arno
</etwas Ironie>
Das kommt mir doch irgendwie bekannt vor. Meine Kunden sind genauso.
Das Programm MUSS doch wissen, was ich will. Du musst also einfach ein
'Do what I mean' Makro bereitstellen
sorry, konnte einfach nicht widerstehen ;-)
</etwas Ironie aus>
----
An Lars:
Bitte nicht missverstehen. Arnos Problem (und das geht mir so und den
anderen Mitlesenden wahrscheinlich auch) ist, dass wir eine exakte
Spezifikation brauchen, wie Du die Gliederungsebenen setzen möchtest.
D.h. du musst uns irgendwelche Merkmale nennen, die ein
Computeralgorithmus auch erkennen kann. Bsp wären z.B.:
- Eine neue Ebene fängt immer dann an, wenn ein bestimmtes Wort in
Spalte A auftaucht
- du hast in einer anderen Spalte ein bestimmtes Merkmal, das den
Wechsel ankündigt.
Stelle Dir einfach vor, du müsstes einem Kollegen erklären, wann er in
Deiner Tabelle MANUELL eine Nummerierung setzen soll. wenn du das
eindeutig definieren kannst, ist es relativ einfach, das in VBA
umzusetzen.
Du hast bisher leider eher eine 'Henne - Ei' Erklärung geliefert :-)
- Wenn die Markierung gesetzt ist, dann nummeriere wie die Gruppierung
gesetzt wurde.
Gruß
Frank
Die Herrschaft über das restliche Universum reisse ich dann endgültig mit
dem "Officemodul NG" an mich. Die tägliche Büroarbeit wird dabei
vollautomatisch allein durch die morgendliche Betätigung des Lichtschalters
im heimatlichen Badezimmer erledigt. Dazu müsste ich nur noch schnell
wissen, auf welche Frage die Antwort "42" lautet.
Ja, sonst bin ich völlig gesund ;))
arno
Hi Arno
rotflol
Sag bloß Bescheid, wenn Deine Software fertig ist. Teste auch gerne die
Beta Version :-)
Frank
nieeemallssssssss, sssssissssst meeeeiiiin schatzsssssssss! miiiir
alllleiiinnnn, jawoll!
dann pass nur auf, dass du nicht mit dem Schatzzz in den Schicksalsberg
stürzt, wenn du mit Frank am Rand des Kraters darum kämpfst ;-).
Frank - hüte deine Finger! Er beißt sie ab, um seinen Schatzzz wieder zu
bekommen ;-) Und kümmere dich beizeiten um deinen Rücktransport! Am
besten, Du schreibst ein ähnliches
wirkliches*Anliegen*Erkennungs*Programm! Das dürfte _dir_ doch nicht
schwerfallen!
Ingrid
arno schrieb:
Hi Ingrid
irgendwie werden die Adler dann hoffentlich kommen :-)
Allerdings scheinen wir den OP mit diesem Off-Topic Thread jetzt doch
etwas verschreckt zu haben.
Frank
Ingrid
Frank Kabel schrieb:
merksssst du essssss, frank?? merkssst du essssss?? zuersst verfolgggt sie
unsssss heimlich, und dann eine verschwörung! pfui, hexe, pfui bah!
;)
:-)
--
Regards
Frank Kabel
Frankfurt, Germany
Hallo Frank und Arno,
das Problem ist folgendes: Man kann aus dem Inhalt des Blattes keine
logische Formulierung ableiten mit der man erkennt, wann ein
Nummerierungssprung von 1.3 nach 2.0 kommen soll. Daher soll sich die
Nummerierung an der vom Benutzer erstellten Gliederung richten. Diese
wird von Hand geändert und gepflegt. Die Merkmale anhand derer der
Computeralgorithmus den Nummerierungssprung erkennen muss ist anhand
der vorhandenen Gliederung.
Man kann die Gliederung mit dem Inhaltsverzeichnis eines Buches
vergleichen: in der ersten Spalte soll die Nummerierung stehen in der
2. Spalte steht Text. Gegliedert wird vom Benutzer inhaltlich
entsprechend den Zeileninhalten (wie Kapitel und Unterkapitel bei
einem Buch). Der Sinn sollte sein, dass wenn ich einen weiteren
Unterpunkt (Zeile) nachträglich einfüge sollen alle auf dieser (und
betroffene tieferen) Ebene(n) nachkommenden Nummerierungen automatisch
angepasst werden.
Sorry, nicht sauer werden, viele Grüße, Lars
gut, deine User legen eine Gliederung fest, indem Sie eine Gliederung
anlegen.
Auslesen kannst du z. B. das Level von Zeile 5 mit folgendem Makro, was du
brauchst ist "OutlineLevel":
Sub test()
x = Sheets(1).Rows(5).OutlineLevel
Cells(5, 3).Value = x
End Sub
Ich schlage folgendes vor:
1) Level auslesen
Du erstellst in einer leeren Mappe in Tabelle1 eine Gliederung. Dann baust
du dir ein Makro, das die Zeilen des Blattes durchläuft und die
Gliederungsebene feststellt, z. B. in Spalte 3 (siehe oben).
2) Inhaltsverzeichnis schreiben
Dann kannst du dir einen Algorithmus überlegen, der aus Spalte 3 in Spalte 4
deine Nummererung erstellt, dh. aus
1
2
3
3
2
3
2
3
3
wird
1
1.1
1.1.1
1.1.2
1.2
usw.
Beachten: Excel kann nur 8 Gliederungsebenen. Der zweite Schritt ist recht
kompliziert mit Schleifen zu programmieren. Ich kenne keinen Algorithmus,
aber es wäre leicht möglich, dass du den 2. Schritt auch ohne Makro mit
cleveren Formeln mit Textverkettung usw. schaffen könntest (Aufteilung der
Levels auf Spalten, bisheriger Maximalwert +1, dann alle Levelspalten
verketten...).
Also:
Geh mal Schritt 1 an. Und vergiss nicht: Die User werden dich mit allen
erdenklichen unlogischen Gliederungen in den Wahnsinn treiben ;)
arno
das Ende ist nahe.
Nimm eine leere Tabelle, schreib folgendes untereinander irgendwohin:
1
2
3
3
2
3
4
5
6
7
8
8
2
3
1
2
3
3
2
3
3
benenne eingegebenen Bereich mit "ebene". benenne den selben Bereich nur
eine Spalte rechts mit "bereich".
weiter unten erstelle eine Gliederung, nicht vergessen "Details stehen
unten" in den Gliederungseigenschaften.
benenne den gegliederten Bereich mit "ebene1". benenne den selben Bereich
nur eine Spalte rechts mit "bereich1".
starte die beiliegenden makros.
viel spass noch damit.
arno
PS: unlogische Strukturen werden selbstverständlich unlogisch numeriert
(garbage in - garbage out)
Option Base 1 'bei 1 durchnummerieren
Sub InhaltvonHierarchie()
'wandelt Hierarchieinformationen in ein Inhaltsverzeichnis um
Dim L(8) As Integer
Dim i As Integer
Dim mspalte As Integer
Dim oldval As Integer
Dim actval As Integer
Dim cel As Range
Dim V As Variant
Dim m As Integer
Dim n As Variant
Range("bereich").ClearContents
mspalte = Range("ebene").Column + 1 'Ausgabespalte definieren
oldval = 0
For Each cel In Range("ebene") 'alle Zellen der Hierarchie durchalufen
actval = cel.Value
If oldval > actval Then 'bei einem Rücksprung auf eine höhere Ebene
For i = actval + 1 To oldval ' zur Sicherheit ginge auch: To 8
'alle restlichen Ebenen löschen
L(i) = 0
Next i
End If
L(actval) = L(actval) + 1 'neue Verzeichniseinträge berechnen
V = L(1) 'mit dem ersten Zeichen beginnen
For m = 2 To actval ' zur sicherheit ginge auch: To 8
'Unterverzeichnisse anhängen
If L(m) = 0 Then
n = ""
Else
n = "." & L(m)
End If
V = V & n
Next m
Cells(cel.Row, mspalte).Value = "'" & V 'wert in tabelle ausgeben
oldval = actval 'den letzten wert zwischenspeichern
Next cel
End Sub
Sub InhaltvonGliederung()
'wandelt Gliederung in ein Inhaltsverzeichnis um
Dim L(8) As Integer
Dim i As Integer
Dim mspalte As Integer
Dim oldval As Integer
Dim actval As Integer
Dim cel As Range
Dim V As Variant
Dim m As Integer
Dim n As Variant
Range("bereich1").ClearContents
mspalte = Range("ebene").Column + 1 'Ausgabespalte definieren
oldval = 0
For Each cel In Range("ebene1") 'alle Zellen der Hierarchie durchalufen
actval = cel.Rows.OutlineLevel
If oldval > actval Then 'bei einem Rücksprung auf eine höhere Ebene
For i = actval + 1 To oldval ' zur Sicherheit ginge auch: To 8
'alle restlichen Ebenen löschen
L(i) = 0
Next i
End If
L(actval) = L(actval) + 1 'neue Verzeichniseinträge berechnen
V = L(1) 'mit dem ersten Zeichen beginnen
For m = 2 To actval ' zur sicherheit ginge auch: To 8
'Unterverzeichnisse anhängen
If L(m) = 0 Then
n = ""
Else
n = "." & L(m)
End If
V = V & n
Next m
Cells(cel.Row, mspalte).Value = "'" & V 'wert in tabelle ausgeben
oldval = actval 'den letzten wert zwischenspeichern
Next cel
End Sub