Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA und Recursion
#1
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.html

Vorschläge für Verbesserung und Beispiele sind wilkommen.

Tschüss

NB. Auch hier gepostet: https://www.helpmij.nl/forum/showthread....n-recursie   :16:
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#2
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!
Antworten Top
#3
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.





Antworten Top
#4
@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.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#5
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
Antworten Top
#6
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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#7
@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
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#8
(18.10.2019, 11: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.
Antworten Top
#9
Wuste nicht das sie/er auch VBA Spezialist war ?
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#10
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.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste