Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
812to816
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
812to816
812to816
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Dynamische Bäume

Dynamische Bäume
24.10.2006 11:46:35
Marcus
Hallo zusammen!
Ich möchte gerne einen "dynamischen Baum" erzeugen. Dazu bräuchte ich 2 Informationen:
1. Wenn ich in eine Zelle (z.B. A1) eine Zahl eingebe (3), dann soll er mir in die nachfolgenden fünf Spalten in die oberste Zeile (B1-D1) die Zahlen 1-3 schreiben.
2. gleichzeitig soll er unter in den Spalten B-D einen "Baum" zeichnen, der wie folgt aussehen soll:
-1----2----3
----------Zahl
-----Zahl
Zahl------Zahl
-----Zahl
----------Zahl
Das soll insofern dynamisch sein, als dass die Zahl in Zelle A1 varieren kann.
Hat da jemand eine Idee, wie man das machen könnte?
Ich weiß, viele Wege führen nach Rom, aber ich wäre schon mit einem zufrieden. Ich hatte bisher nämlich noch überhaupt keine Idee. :-(
Danke schon mal an euch Spezialisten!
Gruß,
Marcus

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dynamische Bäume
24.10.2006 11:57:22
HermannZ
Hallo markus;
zu 1;
beispiel;
 
 ABCDE
155     
1563123 
157 Formel nach   
158 rechts kopieren   
Formeln der Tabelle
B156 : =WENN($A$156="";"";WENN(SPALTE(A1)<=$A$156;SPALTE(A1);""))
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
zu 2; das habe ich noch nicht verstanden musst du etwas näher erläutern.
Gruss hermann
Anzeige
AW: Dynamische Bäume
24.10.2006 13:07:14
Marcus
Hallo Hermann.
Danke schon mal für den ersten Beitrag. Das haut so hin, wie ich das wollte!
Zu 2.: Es geht darum, dass eine Baumstruktur (Darstellung wie in der Eingangsfrage) angezeigt wird. Da ich im Vorfeld nicht weiß, wieviele Spalten (siehe 1. meiner Frage) belegt werden, muss die Baumstruktur dynamisch sein. D.h. (bezogen aufs Beispiel), ich brauche in der letzten belegten Spalte (D=3) (3-1)*2+1 Zeilen. In die Spalte B kommt in die Zeile 4 (3*2+1 aufgerundet) der erste Wert, in die Spalte C kommt in die 2. und 4. Zeile der nächste Wert (berechnet sich aus dem Wert aus Spalte B) und in die Spalte D kommt in die 1., 3. und 5. Zeile ein Wert (berechnet sich aus den Werten aus Spalte C).
Ist das jetzt verständlicher?
Kannst du mir da auch weiterhelfen?
Gruß,
Marcus
Anzeige
AW: Dynamische Bäume
24.10.2006 13:04:40
ingUR
Hallo, Marcus,
bevor in dei eigentliche Indexarbeit eingesteigen werden kann (ich persönlich würde sowieso hier ein VBA-Makro schreiben), hier eine begrenzte Realisierung, nur um zu fragen, ob so Deine Aufgabe richtig verstanden wurde.
Hierbei soll dann in der endgültigen Fassung der Wert der Zelle wohl die Anzahl der Endverästelung ergeben, was bedeuten würde, dass eine Matrix mit (2*n-1) Zeilen und n Spalten (jeweils ohne Kopfzeile und "Führungsspalte") so zu belegen ist, dass nur die bestimmten Index-Felder, ausgehend vom Feld (n;1), belegt werden sollen.
Danach sind in Spalte 2 der Matrix die Felder (n-1;2) und (n+1;2) zu belegen. Das Schema setzt sich fort mir Felder (n-2;3) und (n-0;3); (n+2;3). Hier wird deutlich, dass es hilfreich wär, den Baum in der Spalte 1 und nicht in der Spalte 2 beginnen zu lassen und auf die "Kopfzeile" zu verzichten, um Zeilen und Spaltenindex nicht zusätlich in einer Vormel berechnen zu müssen, sonder gleich die Funktieonen ZEILE() und SPALTE() unverändert einsezen zu können:
Feld(n-(Spalte()-1);n+(+/-)*(n-Zeile()) [ungeprüfte Idee]
 
 ABCD
155123
2   55
3  55 
4 55 55
5  55 
6   55
Formeln der Tabelle
B1 : =WENN(ISTZAHL(A1);SPALTE()-SPALTE(A1);"")
C1 : =WENN(ISTZAHL(A1);SPALTE()-SPALTE(A1);"")
D1 : =WENN(ISTZAHL(A1);SPALTE()-SPALTE(A1);"")
D2 : =WENN(ISTZAHL(D1);A1;"")
C3 : =WENN(ISTZAHL(C1);A1;"")
B4 : =WENN(ISTZAHL(B1);A1;"")
C4 : =WENN(ISTZAHL(C2);A2;"")
D4 : =WENN(ISTZAHL(D1);A1;"")
C5 : =WENN(ISTZAHL(C1);A1;"")
D6 : =WENN(ISTZAHL(D1);A1;"")
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Gruß,
Uwe
Anzeige
AW: Dynamische Bäume
24.10.2006 17:07:11
ingUR
Hallo, Markus,
es reicht die Zeit nicht, um zu entdecken, warum in der beigefügten Beispielmappe der Baum für die ungerade Anzahl um eine Spalte nach reechts verschoben beginnt und so die Endspalte nicht mehr darstellt.
Vielleicht reicht Dir der bisherige Stand als Grundgerüst, um daran weiter zu arbeiten, obwohl ich meine, dass Du wesentlich kompfortabler und flexibler die Sache über VBA lösen kannst.
Gruß,
Uwe
https://www.herber.de/bbs/user/37633.xls
AW: Dynamische Bäume
24.10.2006 22:19:32
ingUR
Hallo, Marcus,
hier die VBA-Lösung zum Binärbaum, als Standard-Modul-Prozeduren:
Option Explicit Sub BinaerBaumMitSummenbildung() Dim ws As Worksheet Dim maxN As Integer, i As Integer, k As Integer, z0 As Integer, s As Integer Dim StartWert As Integer On Error Resume Next Set ws = Worksheets("BinTree") If ws Is Nothing Then Set ws = Worksheets.Add ws.Name = "BinTree" End If maxN = InputBox("Anzahl der Ästlung (0; -1 := Abbruch)") If maxN > 255 Or maxN < 1 Then Exit Sub StartWert = InputBox("Startwert") With ws .Cells.Clear .Cells.ColumnWidth = 10.71 For k = 1 To maxN .Cells(1, k + 1) = k .Cells(1, k + 1).Interior.ColorIndex = 35 Next k For i = -maxN + 1 To maxN - 1 .Cells(maxN + i + 1, 1) = Abs(i) .Cells(maxN + i + 1, 1).Interior.ColorIndex = IIf(i = 0, 3, 35) Next i z0 = maxN + 1 .Cells(z0, 2) = StartWert For k = 1 To maxN s = k + 1 'Schleife über alle Spalten .Cells(z0 - (k - 1), s) = StartWert .Cells(z0 + (k - 1), s) = StartWert For i = 0 To k - 2 If k - 1 = 2 * Int(k / 2) And i = 2 * Int(i / 2) Then ' 'ungerade Spaltennummer .Cells(z0 - i, s) = .Cells(z0 - i - 1, s - 1) + .Cells(z0 - i + 1, s - 1) .Cells(z0 + i, s) = .Cells(z0 - i, s) Else If k = 2 * Int(k / 2) And i - 1 = 2 * Int(i / 2) Then ' 'gerade Spaltennummer .Cells(z0 - i, s) = .Cells(z0 - i - 1, s - 1) + .Cells(z0 - i + 1, s - 1) .Cells(z0 + i, s) = .Cells(z0 - i, s) End If End If Next i Next k .Columns("A:" & Chr(64 + k)).Columns.AutoFit .Cells.HorizontalAlignment = xlCenter .Cells.VerticalAlignment = xlCenter .Range("A1").Select End With Set ws = Nothing End Sub Sub BinaerbaumOhneSummenbildung() Dim ws As Worksheet Dim maxN As Integer, i As Integer, k As Integer, z0 As Integer, s As Integer Dim StartWert As Integer On Error Resume Next Set ws = Worksheets("BinTree") If ws Is Nothing Then Set ws = Worksheets.Add ws.Name = "BinTree" End If maxN = InputBox("Anzahl der Ästlung (0; -1 := Abbruch)") If maxN > 255 Or maxN < 1 Then Exit Sub StartWert = InputBox("Startwert") With ws .Cells.Clear .Cells.ColumnWidth = 10.71 For k = 1 To maxN .Cells(1, k + 1) = k .Cells(1, k + 1).Interior.ColorIndex = 35 Next k For i = -maxN + 1 To maxN - 1 .Cells(maxN + i + 1, 1) = Abs(i) .Cells(maxN + i + 1, 1).Interior.ColorIndex = IIf(i = 0, 3, 35) Next i z0 = maxN + 1 .Cells(z0, 2) = StartWert For k = 2 To maxN s = k + 1 'Schleife über alle Spalten .Cells(z0 - (k - 1), s) = StartWert .Cells(z0 + (k - 1), s) = StartWert For i = 0 To k - 1 If k - 1 = 2 * Int(k / 2) And i = 2 * Int(i / 2) Then ' 'ungerade Spaltennummer .Cells(z0 - i, s) = StartWert .Cells(z0 + i, s) = StartWert Else If k = 2 * Int(k / 2) And i - 1 = 2 * Int(i / 2) Then ' 'gerade Spaltennummer .Cells(z0 - i, s) = StartWert .Cells(z0 + i, s) = StartWert End If End If Next i Next k .Columns("A:" & Chr(64 + k)).Columns.AutoFit .Cells.HorizontalAlignment = xlCenter .Cells.VerticalAlignment = xlCenter .Range("A1").Select End With Set ws = Nothing End Sub Die Prozedurnahmen verdeutlichen den Unterschied beider, unabhängig voneinander einzusetzenden Prozeduren.
Die Startparameter werden jeweils über nacheinader sich öffnenden INPUTBOXs eingeben.
Sofern die Eingabe über die Zelle [A1] zwingend vorgegeben ist, ist vor dem Löschen der Zellen, der Zelleninhalt der Zelle A1 in eine Variable zwischenzuspeichern und kann anschließen dorthin wieder ausgeschreiben werden:
Startwert = .Cells(1,1).Value
.Cells.Clear
.Cells(1,1)=Startwert
Vielelicht erübrigt sich mit diesen Routinen die Fehlersuche in der Zellenformel.
Gruß,
Uwe
Anzeige
AW: Dynamische Bäume
24.10.2006 22:26:15
ingUR
Hallo, Marcus,
bei einem Test mit 255 Endelementen, hat sich gezeigt, dass es sinnvoll ist, statt .Range("A1").select, die Urprungszeile des Baumes nach dessen Erstellung mit .Cells(maxN + 1, 1).Select anzuwählen.
Gruß!
AW: Dynamische Bäume
25.10.2006 11:08:23
Marcus
Hallo Uwe.
Herzlichen Dank für den tollen VBA-Code!! Damit kann ich super was anfangen.
Ich pass das jetzt mal auf meine konkrete Fragestellung an. Wenn noch was sein sollte, melde ich mich einfach noch einmal bei dir, ok?!
Nochmal herzlichen Dank!!
Gruß,
Marcus
AW: Dynamische Bäume
25.10.2006 11:30:32
Marcus
Hallo Uwe.
Wie mach ich das denn, wenn ich das Pferd von hinten aufzäumen will. D.h.: Eigentlich will ich nicht von der Wurzel (Wert in 1.Spalte), sondern mit den letzten Werten anfangen bzw. diese festlegen. Die Werte in den Spalten davor werden dann sukzessive aus der nachfolgenden/berechneten Spalte errechnet.
Kannst du mir auch da einen Tipp geben? Wäre spitze!
Gruß,
Marcus
Anzeige
AW: Dynamische Bäume
25.10.2006 12:20:25
ingUR
Hallo, Marcus,
obwohl ich nicht sicher bin, ob ich Deine Aufgabe richtig verstehe, wenn ich annehme, dass Du die Ausgabe der Baumstruktur nur seitenverkehrt benötigst (vielleicht würde es mir helfen, wenn Du ein wenig mehr über den Zweck mitteilen könntest), will ich dennoch, für den Fall dass ich Dich richtig verstanden haben, Dir folgenden Vorschlag unterbreiten, ohne dass die Indexberechnung neu gestaltet werden muß:
Schreibe die Werte nicht direkt in eine Zelle sondern in eine Matrix BiV(2*N-1; N) und schreibe dann spaltenweise aus dieser Matrix, mit der Spalte N beginnend, die Werte in die Spalten des Tabellenblatts, mit Spalte B beginnend - wenn Führungsspalte in Spalte A eingerichtet ist -.
Alternativ könntest Du aber auch das Programm so belassen und in einer Abschlußschleife, die Spalten vertauschen oder in umgekehrter Folge in ein neues Arbeitsblatt übertragen (ggf. Application.ScreenUpdating-Eigenschaft einsetzen!).
Gruß,
Uwe
P.S.
Benötigst Du eigentlich die Summenbildung? Dieser Teil könnte auch so umgestaltet werden, dass die Werte der Dichtefunktion ermittelt werden:
Sub BinaerBaumMitDichte() Dim ws As Worksheet Dim maxN As Integer, i As Integer, k As Integer, z0 As Integer, s As Integer Dim StartWert As Double On Error Resume Next Set ws = Worksheets("BinTree") If ws Is Nothing Then Set ws = Worksheets.Add ws.Name = "BinTree" End If maxN = InputBox("Anzahl der Ästlung (0; -1 := Abbruch)") If maxN > 255 Or maxN < 1 Then Exit Sub StartWert = InputBox("Startwert") With ws .Cells.Clear .Cells.ColumnWidth = 10.71 For k = 1 To maxN .Cells(1, k + 1) = k .Cells(1, k + 1).Interior.ColorIndex = 35 Next k For i = -maxN + 1 To maxN - 1 .Cells(maxN + i + 1, 1) = Abs(i) .Cells(maxN + i + 1, 1).Interior.ColorIndex = IIf(i = 0, 3, 35) Next i z0 = maxN + 1 .Cells(z0, 2) = StartWert For k = 2 To maxN s = k + 1 'Schleife über alle Spalten .Cells(z0 - (k - 1), s) = .Cells(z0 - k + 2, s - 1) / 2 .Cells(z0 + (k - 1), s) = .Cells(z0 - (k - 1), s) For i = 0 To k - 2 If k - 1 = 2 * Int(k / 2) And i = 2 * Int(i / 2) Then ' 'ungerade Spaltennummer .Cells(z0 - i, s) = .Cells(z0 - i - 1, s - 1) / 2 + .Cells(z0 - i + 1, s - 1) / 2 .Cells(z0 + i, s) = .Cells(z0 - i, s) Else If k = 2 * Int(k / 2) And i - 1 = 2 * Int(i / 2) Then ' 'gerade Spaltennummer .Cells(z0 - i, s) = .Cells(z0 - i - 1, s - 1) / 2 + .Cells(z0 - i + 1, s - 1) / 2 .Cells(z0 + i, s) = .Cells(z0 - i, s) End If End If Next i Next k .Range(Columns(1), Columns(k)).Columns.AutoFit .Cells.HorizontalAlignment = xlCenter .Cells.VerticalAlignment = xlCenter .Cells(maxN + 1, 1).Select End With Set ws = Nothing End Sub Hier sind noch zwei kleine Änderungen berücksichtigt, die auch in den Anderen Prozeduren gelich übernommen werden können:
1.)
'.........
.Cells(z0, 2) = StartWert
For k = 2 To maxN
s = k + 1
'.........
und 2.)
'.........
Next k
.Range(Columns(1), Columns(k)).Columns.AutoFit
.Cells.HorizontalAlignment = xlCenter
'............
Anzeige
AW: Dynamische Bäume
25.10.2006 13:05:02
Marcus
Danke, dass du dich meiner annimmst.
Das Problem soll das Binomialmodell lösen. Dabei habe ich am Ende des Baums (=letzte Spalte) verschiedene Ausgangswerte. Die Werte der Spalten davor setzt sich aus jeweils zwei der nachfolgenden Spalte (eben der Spalte eins größer und der Zeile eins über und eins unter der aktuellen Zelle) zusammen. Der erste, alleinige Wert in der Spalte (du hast ihn Startwert genannt) ist dann mein eigentliches Ergebnis.
Beispiel "Summe nach vorne":
-----1----2----3
3--------------5
2---------8
1----15--------3
0-31------7
1----16--------4
2---------9
3--------------5
Ist das jetzt klarer? Ausgangspunkt ist der "Vektor" (5,3,4,5).
Gruß,
Marcus
Anzeige
AW: Dynamische Bäume
25.10.2006 15:51:06
ingUR
Hallo, Marcus,
um es frei heraus zu sagen, hättest Du gleich die konkreten Aufgabenstellung vorgestellt, wir hätten uns die Umwege sparen können!
Hier also die Lösung für die umgekehrte Baumenwicklung:
Option Explicit Sub BinaerBaumReverse() Dim ws As Worksheet Dim maxN As Integer, i As Integer, k As Integer, z As Integer, z0 As Integer, s As Integer Dim StartWerte, Startwert As Integer StartWerte = Array(5, 3, 4, 5) On Error Resume Next Set ws = Worksheets("BinTreeReverse") If ws Is Nothing Then Set ws = Worksheets.Add ws.Name = "BinTreeReverse" StartWerte = Array(5, 3, 4, 5) For i = 0 To UBound(StartWerte) ws.Cells(2 * i + 2, 2) = StartWerte(i) Next i MsgBox "Gebe einen Anfangsvektor in der Spalte B ein" ws.Range("B2").Select Exit Sub End If With ws maxN = (ws.Cells(ws.Rows.Count, 2).End(xlUp).Row + 1) / 2 If maxN > 255 Or maxN < 1 Then Set ws = Nothing Exit Sub End If StartWerte = .Range("B2:B" & 2 * maxN).Value .Cells.Clear .Cells.ColumnWidth = 10.71 For k = maxN To 1 Step -1 .Cells(1, k + 1) = maxN - (k - 1) .Cells(1, k + 1).Interior.ColorIndex = 35 Next k For i = -maxN + 1 To maxN - 1 z = maxN + i + 1 .Cells(z, 1) = Abs(i) .Cells(z, 1).Interior.ColorIndex = IIf(i = 0, 3, 35) If z = 2 * Int(z / 2) Then .Cells(z, 2).Value = StartWerte(z - 1, 1) Next i z0 = maxN + 1 For k = 2 To maxN s = k + 1 For i = k To 2 * maxN - k Step 2 z = i + 1 .Cells(z, s) = .Cells(z - 1, s - 1) + .Cells(z + 1, s - 1) Next i Next k .Columns(1).Columns.AutoFit .Columns(maxN + 1).Columns.AutoFit .Range(Columns(2), Columns(maxN)).ColumnWidth = Columns(maxN + 1).ColumnWidth .Cells.HorizontalAlignment = xlCenter .Cells.VerticalAlignment = xlCenter .Cells(z0, z0).Select End With Set ws = Nothing End Sub Hier bin ich davon ausgegangen, dass es für die Lösung unerheblich ist, welche Ausrichtung die Darstellung hat. Wenn dies ein Problem ist, dann schlage ich Dir die Lösung über das interne Array(2*maxN-1;maxN) vor.
Die Eingabemöglichkeit müßtes Du auch nach Deinen Arbeitschritten anpassen bz.e entwickeln. Derzeit gehe ich davon aus, dass der Eingabevektor - mit den entsprechendem Leerzellen - in der Spalte B ab Zeile 2 auf dem Tabellenblatt "BinTreReverse" eingetragen wird.
Gruß,
UWe
Anzeige
AW: Dynamische Bäume - Korrektur
25.10.2006 16:03:28
ingUR
Hallo, Marcus,
wegen der Kopfzeile (Zeile 1), die nicht zum Baumgehört, ermittelt sich maxN auf der Grundlage der letzten beschriebenen Zeile in der Spalte B nach der Formel:
maxN = (ws.Cells(ws.Rows.Count, 2).End(xlUp).Row) / 2
Die Addition von Eins entfällt, da sie ja bereits durch die erste Zeile berücksichtigt wurde.
Gruß!
AW: Dynamische Bäume
27.10.2006 09:47:19
Erich
Hallo Marcus,
noch ne Formellösung:
 ABCD
1 171615
2161  
315 3 
4142 8

Formeln der Tabelle
ZelleFormel
B1=WENN(ANZAHL(B2:B100)>0;ANZAHL(B2:B100);"")
A2=WENN(B2&C2="";"";ABS(ANZAHL($B$2:$B$100)+1-ZEILE()))
C2=WENN(ISTZAHL(B3)*(ZEILE()>=SPALTE());B1+B3;"")

Bedingte Formatierungen der Tabelle
ZelleNr.: / BedingungFormat
B11. / Formel ist =ISTZAHL(B1)Abc
C11. / Formel ist =ISTZAHL(C1)Abc
D11. / Formel ist =ISTZAHL(D1)Abc
A21. / Formel ist =ISTZAHL(A2)*(A2=0)Abc
A22. / Formel ist =ISTZAHL(A2)Abc
A31. / Formel ist =ISTZAHL(A3)*(A3=0)Abc
A32. / Formel ist =ISTZAHL(A3)Abc
A41. / Formel ist =ISTZAHL(A4)*(A4=0)Abc
A42. / Formel ist =ISTZAHL(A4)Abc


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
(Formel von B1 nach rechts kopieren, von A2 nach unten, von C2 nach rechts und unten)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige