Fonction récursive pour "aplanir" un Array

  • Initiateur de la discussion Initiateur de la discussion dionys0s
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dionys0s

XLDnaute Impliqué
Bonjour le forum,

je cherche à mettre au point une petite fonction récursive pour "aplanir" un array en une dimension qui lui même contiendrait des arrays. C'est à dire qu'à partir d'un array qui ressemblerait à :
Array(Array(Array(1, 2), Array(3, 4)), 5, 6, Array(7, 8), 9, 10)
c'est à dire avec des arrays imbriqués (mais pas forcément sur chaque index), je puisse à la fin obtenir
Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Je bloque un peu, et je n'ai pas trouvé de piste en cherchant sur le web.
Merci d'avance pour votre aide 🙂
 
Re : Fonction récursive pour "aplanir" un Array

Bonjour

un truc du genre
Code:
Option Explicit

Sub Main()
  Dim tabOrigine As Variant
  Dim tabApplati As Variant
  ReDim tabApplati(0)
  tabOrigine = Array(Array(Array(1, 2), Array(3, 4)), 5, 6, Array(7, 8), 9, 10)
  Aplanir tabOrigine, tabApplati
  ReDim Preserve tabApplati(UBound(tabApplati) - 1)
  
'La suite est juste pour afficher le résultat obtenu ; elle ne sert à rien !
  Dim elt As Variant
  Dim p As String
  For Each elt In tabApplati
    p = p & vbCrLf & elt
  Next elt
  MsgBox "Résultat : " & p
  
End Sub

Sub Aplanir(origine As Variant, ByRef destination As Variant)
  Dim elt As Variant
  For Each elt In origine
    If IsArray(elt) Then
      Aplanir elt, destination
    Else
      destination(UBound(destination)) = elt
      ReDim Preserve destination(UBound(destination) + 1)
    End If
  Next elt
End Sub
devrait faire l'affaire
 
Dernière édition:
Re : Fonction récursive pour "aplanir" un Array

Re,

le code pourrait-il être considéré comme optimisé comme ceci ?
VB:
Sub Main()

  Dim tabOrigine() As Variant
  Dim tabApplati() As Variant
  
  'ReDim tabApplati(0)
  tabApplati = VBA.Array 'Tableau vide dimensionné de 0 à -1
  tabOrigine = Array(Array(Array(1, 2), Array(3, 4)), 5, 6, Array(7, 8), 9, 10)
  Aplanir tabOrigine, tabApplati
  'ReDim Preserve tabApplati(UBound(tabApplati) - 1)
  Stop

End Sub

Sub Aplanir(origine As Variant, ByRef destination As Variant)

  Dim elt As Variant

  For Each elt In origine
    If IsArray(elt) Then
      Aplanir elt, destination
    Else
      ReDim Preserve destination(UBound(destination) + 1) 'Redim Preserve placé avant => au premier passage, 0 to -1 devient 0 to 0
      destination(UBound(destination)) = elt
    End If
  Next elt

End Sub
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour