Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA : transformer algorithme récursif en algorithme itératif.

dionys0s

XLDnaute Impliqué
Bonjour le forum,

j'avais écrit il y a quelques mois une fonction servant à "aplatir" un ParamArray pouvant être rempli par des valeurs et/ou des arrays, chaque array étant potentiellement également composé de valeurs et/ou d'arrays.

VB:
Public Sub TestAplatir()

  Dim Str1 As String, Str2 As String

  'Exemple sans array
  Let Str1 = VBA.Join(Aplatir( _
    1, _
    2, _
    3, _
    4, _
    5, _
    6, _
    7, _
    8, _
    9, _
    10), ", ") 'Renvoie "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"

  'Exemple avec des valeurs et des arrays imbriqués
  Let Str2 = VBA.Join(Aplatir( _
    1, _
    Array( _
      2, _
      3), _
    Array( _
      4, _
      Array( _
        5, _
        6, _
        7), _
      8, _
      9), _
    10), ", ") 'Renvoie "1, 2, 3, 4, 5, 6, 7, 8, 9, 10" également

  VBA.MsgBox Str1 & VBA.vbNewLine & Str2

End Sub

Public Function Aplatir(ParamArray Elements() As Variant) As Variant()

  Dim vntElement As Variant

  Let Aplatir = VBA.Array

  For Each vntElement In Elements
    Call sAplatir(Aplatir, vntElement)
  Next vntElement

End Function

Private Sub sAplatir(ByRef Result() As Variant, ByRef Element As Variant)

  Dim vntElement As Variant

  If VBA.IsArray(Element) Then
    For Each vntElement In Element
      Call sAplatir(Result, vntElement)
    Next vntElement
  Else
    ReDim Preserve Result(LBound(Result) To UBound(Result) + 1)
    Let Result(UBound(Result)) = Element
  End If

End Sub

Ma question est la suivante : existe-t-il une approche non récursive (itérative donc) pour arriver au même résultat à partir des même paramètres ? J'étais persuadé d'avoir trouvé par le passé des pages Internet à ce sujet, mais impossible de les retrouver.

D'avance, merci pour votre aide

dionys0s
 

Pièces jointes

  • Flat ParamArray.xlsm
    20.7 KB · Affichages: 3

ThomasR

XLDnaute Occasionnel
Bonjour,

Je pense avec une sub main qui commencerait par faire une boucle sur le premier array
à l’intérieur de celle-ci utilisation de variable variant dans une boucle do until qui appel une fonction qui parcours un array et qui ne s'arrête que si ce n'est pas un array
du redim dans tous les sens, et pour que ce soit plus simple des goto pour recommencer

bref un truc moche et verbeux

pourquoi vouloir faire autrement, car le sujet que tu souhaites traiter est parfait en récursif, le faire comme tu le demande reviendrai à coder comme un débutant qui ne saurait pas faire d’algorithmie.

Je suis curieux de savoir. (tu dois le faire en assembleur c'est pour ça ;-) )

Cordialement,
Thomas
 

Discussions similaires

Réponses
17
Affichages
853
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…