Registriert seit: 29.09.2015
Version(en): 2030,5
16.10.2019, 23:17
(Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019, 23:17 von snb.)
Hi,
Vielleicht gibt es hier Leute die in eine VBA Technik interessiert sind die man nicht so oft begegnet; Recursion
Wenn man damit bekannt ist kann es viel VBA-Code und Ärger sparen.
Schau mal hier:
http://www.snb-vba.eu/VBA_Recursion_en.htmlVorschläge für Verbesserung und Beispiele sind wilkommen.
Tschüss
NB. Auch hier gepostet:
https://www.helpmij.nl/forum/showthread....n-recursie :16:
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
17.10.2019, 07:37
(Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2019, 07:37 von LCohen.)
Ein schönes Beispiel hast Du gewählt, snb.
Standardbeispiele sind ansonsten "Türme von Hanoi" oder "Suchen in allen Unterverzeichnissen". Aber Deins ist viel besser, da kurz!
Registriert seit: 21.06.2016
Version(en): 2021
17.10.2019, 15:22
(Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2019, 15:24 von Ego.)
Hallo snb,
A) zu 5.4 complete procedure
1. Um die Vorteile der Recursion deutlicher darzustellen, könnte man n und k als Parameter der Routine M_Snb eintragen. (In dem Sinn: Man kann über die Parameter beliebige n und k vorgeben ohne das Porgramm ändern zu müssen.)
2. Du hast in der Routine M_comb die Konstante 3 (=k-2) fest eingetragen und ermittelst die aktuelle Ebene über die Split-Funktion. Ich fände es allgemeiner die Ebene als Parameter der Routine M_comb zu übergeben und auf jeden Fall k als Parameter der Routine M_comb oder als Modul-Variabel zu übergeben.
B) Ein Beispiel
Ein einfaches Beispiel für eine Recursion, dass schon einigemale in den Foren nachgefragt wurde, ist das Suchen nach einer Kombination von Zahlungseingängen, die in der Summe zu einer Rechnung passen.
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Registriert seit: 29.09.2015
Version(en): 2030,5
@Ego
Das stimmt. Wie du sehen kannst in der Beispieldatei ist das genau was ich gemacht habe.
Der Text im page war nur dargestellt um das Prinzip von recursion zu verdeutlichen.
Danke für deine Vorschläge. :19:
Ih bin mir nich sicher ob deinen Beispielvorschlag sinnvoll ist, weil es of kein passende Lösung gibt.
Registriert seit: 06.12.2015
Version(en): 2016
Hallo,
zuerst vielen Dank für diesen Beitrag, es ist auch meine Erfahrung wie schwer verständlich das Thema Recursion ist.
Ein Beispiel für den Einsatz ist auch das Auslesen eines Zip-files (wer denkt da an Exel?)
Code:
Sub zpath()
dim sh, n
Set sh = CreateObject("shell.application")
Set n = sh.namespace("C:\temp\test4.zip") '<<<< anpassen >>>>
recur sh, n
End Sub
Sub recur(sh, n)
dim i , subn
For Each i In n.items
If i.isfolder Then
Set subn = sh.namespace(i)
recur sh, subn
Else
Debug.Print i.Path, i.name
End If
Next
Exit Sub
end sub
Als Brainstorming erinnerte ich mich an einen meiner ersten Versuche mit Basic (C64) ein "Apfel-Männchen" (Chaos-Theorie, Mandelbrot-Mengen) zu programmieren.
Aktueller (und ungelöst) ist, aus mehreren Webseiten für alle Elemente die Header auszulesen. Dies ist bisher an der unterschiedlichen Struktur von Webseiten gescheitert.
Allgemeiner, viele Prozesse lassen sich mit x(t) = f(x(t-1)) beschreiben. Würde das ebenfalls in den Bereich passen?
mfg
Registriert seit: 29.09.2015
Version(en): 2030,5
18.10.2019, 11:06
(Dieser Beitrag wurde zuletzt bearbeitet: 18.10.2019, 11:07 von snb.)
Ola @Fennek
die Items einer Folder können hier nur gelesen werden mittels .getfolder.items
Code:
Dim sh, c01
Sub M_snb()
Set sh = CreateObject("shell.application")
M_items "G:\OF\zip_002\__ribbon_test.xlsx.zip"
MsgBox c01
End Sub
Sub M_items(c00)
For Each it In sh.Namespace(c00).items
c01 = c01 & vbLf & it.Name
If it.isfolder Then
For Each it1 In it.getfolder.items
c01 = c01 & vbLf & it1.Name
Next
End If
Next
End Sub
Registriert seit: 29.09.2015
Version(en): 2030,5
@Fennek
Für Fibonacci scheint mir recursion unnötig kompliziert:
Code:
Sub M_snb_fib()
ReDim sp(30)
sp(0) = 1
sp(1) = 1
For j = 2 To UBound(sp)
sp(j) = sp(j - 2) + sp(j - 1)
Next
MsgBox sp(UBound(sp))
End Sub
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
(18.10.2019, 12:24)snb schrieb: Für Fibonacci scheint mir recursion unnötig kompliziert
Um Gottes willen! Da wird der Stack so groß wie alle Einzelzahlenspeicher zusammen.
Registriert seit: 29.09.2015
Version(en): 2030,5
Wuste nicht das sie/er auch VBA Spezialist war ?
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
18.10.2019, 13:04
(Dieser Beitrag wurde zuletzt bearbeitet: 18.10.2019, 13:04 von LCohen.)
Meinst Du mich, die Leonarda? Nee, bin ich nicht. Aber jeder, der Rekursion programmiert, hat bestimmt schon mal "Speicherüberlauf" erlebt, weil er nicht aus einem Aufruf wieder zurückkam.