VBA Lecture d'une variable tableau multidimensions

AGLAS

XLDnaute Nouveau
Bonjour,

Question pour les usagers de variables tableaux multidimensionnelles : Comment formaliser le parcours des 2 dimensions de manière cohérrente : la 1ère dimension de ma variable tableau dans une boucle For..Next pour chaque occurence toutes les occurences de la 2ème s'y rapportant dans une seconde boucle For..Next ?


Code:
        For i = 0 To UBound(tab())
            'traitement 1ère dimension...
            For j = 0 To UBound(tab(i, 2)  'Erreur de compilation !
                Traitement 2ème dimension...
            Next j
        Next i

Merci d'avance pour vos suggestions éclairées.
 
B

bebere

Guest
bonsoir Aglas,le Forum
exemple:tableau 12 lignes 3 colonnes
redim tbl( 1 to 12,1 to 3)
'pour écrire dans tableau
For ligne = 1 To UBound(tbl)
For colonne = 1 To LBound(tbl)
'ligne 1
'tb(1,1)=2'tb(1,2)=3'etc..
'ligne 2
'tbl(2,1)=3'tb(2,2)=4'etc..
tbl(ligne,colonne)=ligne+colonne
next colonne
next ligne
' For ligne = 1 To UBound(tbl)
For colonne = 1 To LBound(tbl)
cells(ligne,colonne).value=tbl(ligne,colonne)
next colonne
next ligne
à bientôt
 
B

bebere

Guest
bonsoir Aglas,le Forum
exemple:tableau 12 lignes 3 colonnes
redim tbl( 1 to 12,1 to 3)
'pour écrire dans tableau
For ligne = 1 To UBound(tbl)
For colonne = 1 To LBound(tbl)
'ligne 1
'tb(1,1)=2'tb(1,2)=3'etc..
'ligne 2
'tbl(2,1)=3'tb(2,2)=4'etc..
tbl(ligne,colonne)=ligne+colonne
next colonne
next ligne
' For ligne = 1 To UBound(tbl)
For colonne = 1 To LBound(tbl)
cells(ligne,colonne).value=tbl(ligne,colonne)
next colonne
next ligne
à bientôt
 
B

bebere

Guest
bonsoir Aglas,le Forum
exemple:tableau 12 lignes 3 colonnes
redim tbl( 1 to 12,1 to 3)
'pour écrire dans tableau
For ligne = 1 To UBound(tbl)
For colonne = 1 To LBound(tbl)
'ligne 1
'tb(1,1)=2'tb(1,2)=3'etc..
'ligne 2
'tbl(2,1)=3'tb(2,2)=4'etc..
tbl(ligne,colonne)=ligne+colonne
next colonne
next ligne
' For ligne = 1 To UBound(tbl)
For colonne = 1 To LBound(tbl)
cells(ligne,colonne).value=tbl(ligne,colonne)
next colonne
next ligne
à bientôt
 
A

AGLAS

Guest
Re:VBA Lecture d'une variable tableau multidimensi

Merci pour ta réponse bebere, mais en fait je ne parviens pas à intégrer cette logique dans ma macro perso qui renvoit invariablement #VALEUR! et franchement je suis réellement dégouté de voir que rien n'y fait. Il semble que mon tableau à 2 dimensions soit à l'origine du plantage. Ci-après le code problématique (les instructions posant pb sont en commentaire), mais pour une visu concrète j'ai joints le gourbi en pièce jointe. La macro s'appelle DUREE2. Merci donc à tout avis bienveillant et ... éclairé.


Code:
Function DUREE2(ParamArray ref_index() As Variant) As String

    Dim ligne_select(), n As Integer
    Dim predec() As Integer
    
    n = 0
    For i = 0 To UBound(ref_index())
        If Worksheets('Plan').Cells(ref_index(i), col_selection) = 'Vrai' Then
            
            ReDim Preserve ligne_select(n)
            '------------------------------ ci-après en commentaire déclaration posant pb
            'ReDim Preserve predec(0 To n, 0 To p)
            
            For j = 0 To UBound(ligne_select())
                pos = InStr(Worksheets('Plan').Cells(ref_index(i), col_prec), ligne_select(j))
                If pos > 0 Then
                    '---------------------- ci-après en commentaire instructions posant pb
                    'ReDim Preserve predec(0 To n, 0 To p)
                    'predec(n, p) = ligne_select(j)
                    p = p + 1
                End If
            Next j
            ligne_select(n) = ref_index(i)
            p = 0
            n = n + 1
        End If
    Next i
    
    For ligne = 0 To UBound(ligne_select())
        DUREE2 = DUREE2 & 'ligne ' & ligne_select(ligne) & '; '
        For p = 0 To LBound(ligne_select)
           'DUREE2 = DUREE2 & 'prédecesseurs : ' & predec(indice, p) & ';'
        Next p
    Next ligne
        
End Function
[file name=Function.zip size=39985]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Function.zip[/file] [file name=Function.zip size=39985]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Function.zip[/file]

Message édité par: AGLAS, à: 29/08/2005 01:29
 

Pièces jointes

  • Function.zip
    39 KB · Affichages: 60

_Thierry

XLDnaute Barbatruc
Repose en paix
Re:VBA Lecture d'une variable tableau multidimensi

Bonjour Aglas, Bébère, le Forum


Ton problème vient du fait que tu tentes de redimensionner ton Tableau tant au Largeur qu'en Hauteur (ReDim Preserve predec(0 To n, 0 To p))

Dans l'aide on peut pourtant bien lire ceci :

Si vous utilisez le mot clé Preserve, vous ne pouvez redimensionner que la dernière dimension du tableau. Vous ne pouvez en aucun cas modifier le nombre de dimensions. Par exemple, si votre tableau n'a qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la dernière et seule dimension. Toutefois, si le tableau compte plusieurs dimensions, seule la taille de la dernière dimension est modifiable si vous souhaitez préserver le contenu du tableau.

Donc il est clair que tu dois au moins définir le nombre de tes Colonnes...
Ensuite tu peux jongler sur le Nombre de Lignes (inconnu)...

Ton Tableau sera alors 'à l'envers' :
For i = 1 To TaLimit
   
ReDim Preserve Tablo(0 To 2, 0 To x)
    Tablo(0, x) = Cells(i, 1)
'(Col 0 / Ligne x)
    Tablo(1, x) = Cells(i, 2)
'(Col 1 / Ligne x)
    Tablo(2, x) = Cells(i, 3)
'(Col 2 / Ligne x)
    x = x + 1
Next i

Pour avoir un exemple concret en pratique avec aussi comment récupérer le tout, suit bien ce Fil et la Démo jointe, pour laquelle j'ai eu des compliments pour la clarté d'utilisation :

=> Lien supprimé

Bonne Journée
[ol]@+Thierry[/ol]

Message édité par: _Thierry, à: 29/08/2005 08:06

Message édité par: _Thierry, à: 29/08/2005 08:07
 

AGLAS

XLDnaute Nouveau
Re:VBA Lecture d'une variable tableau multidimensi

Bonjour _Thierry, Bébère, le Forum,

Merci beaucoup pour cette précision qui m'avait effectivement échappé. Cependant, le pb de la construction (et surtout de l'optimisation) de l'algo reste posé, car je ne connaîs pas à l'avance le nombre d'occurrences de ma 1ère dimension (qui correspond au nombre de lignes sélectionnées) et encore moins les occurrences de la 2nde dimension associée (qui correspond aux potentiels prédécesseurs d'une ligne donnée).

La solution qui me vient immédiatement serait de constituer le tableau relatif aux numéro des lignes sélectionnées et dans un second temps reparcourir ce tableau pour constituer le tableau des potentiels prédécesseurs de chacune des lignes.

Ce qui m'amène à une autre question : étant donné qu'à une ligne donnée, il peut y avoir aucun ou plusieurs prédécesseurs et que ce nombre peut varier d'une ligne à une autre, je suppose que la taille de la 2nde dimension de mon tableau doit être égale au nombre max de prédécesseurs toutes lignes confondues (avec ce que cela suppose comme code pour gérer ce max au fil de l'eau). Mais alors si je renvoie Ubound(preced, 5) qui correspond au max d'occurrences de prédécesseurs de la tâche indicée 5 de ma 1ère dimension, je suppose que cela va renvoyer le nombre d'occurences de prédécesseurs non nulles (au regard du max du tableau) ? D'ailleurs à partir du moment où mon tableau est de type Integer et que je modifie sa taille, les valeurs ne sont-elles pas initialisées à 0 ? Oh et puis #@#! je ne sais plus.

Je sais, pour bien faire, je devrais tester par moi-même, mais j'ai bataillé une bonne partie du week-end sans aboutir et j'avoue que je suis un peu las du 'jeu de l'essai et de l'erreur'. Merci donc, si infos, pour moi, il y a.

Sidonie.

Message édité par: AGLAS, à: 29/08/2005 11:16

Message édité par: AGLAS, à: 29/08/2005 11:19
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re:VBA Lecture d'une variable tableau multidimensi

Re Bonjour Sidonie, Bébère, le Forum

Je t'avouerai que je n'ai pas vraiment essayé de corriger ta Function, car maintenant je suis au bureau et je n'ai pas trop de temps pour me lancer dans un algo de ce style.

Ce que je sais et peux te confirmer...

Si tu optes pour délimiter une des deux dimensions de ton tableau avec un Max, il est clair que ce tableau contiendra des Valeurs Nulles jusqu'à ce que cette dimension atteigne cette valeur Max...

Un exemple tout bête avec un classeur vierge :

Une Feuille active avec des données comme suit dont on ne connait ni le nombre de Colonnes ni le nombre de Lignes... La seule chose qu'on sait d'avance c'est qu'il n'y aura pas plus de 50 colonne mais les lignes peuvent être illimitée à la Feuille (65536)

A1:Axx : 1, 2, 3, 4... 10... xx
B1:Bxx : 11, 11, 12, 13... 20... xx
C1:Cxx : 21, 22, 23...... 30... xx
y1:yxx : y1, y2, y3...... y30 .... yxx


Si tu lances un algo de ce Style :

Option Explicit

Sub MyTestAlgo()
Dim Tablo() As Integer
Dim MyLimitCol As Byte, C As Byte
Dim i As Integer, L As Integer

MyLimitCol = 49
'(en base zéro = 50)

   
For i = 1 To ActiveSheet.UsedRange.Rows.Count
       
ReDim Preserve Tablo(MyLimitCol, L)
           
           
For C = 0 To MyLimitCol
                    Tablo(C, L) = Cells(i, C + 1)
           
Next
           
        L = L + 1
   
Next i

With Worksheets.Add
    .Range('A1').Resize(UBound(Tablo, 2) + 1, UBound(Tablo, 1) + 1) = Application.Transpose(Tablo)
End With

End Sub

Il est certain que tu va récupérer plein de zéro (si Tablo est Integer) pour toutes les colonnes qui n'avaient pas de données...

Maintenant dans un cas comme ceci on peut finter de la sorte sans pour autant faire deux passage de l'Algo...

Option Explicit

Sub MyTestAlgo()
Dim TabData As Variant
Dim Tablo() As Integer
Dim MyLimitCol As Byte, C As Byte
Dim MyLimitLin As Byte
Dim i As Integer, L As Integer

TabData = ActiveSheet.UsedRange

MyLimitLin = UBound(TabData, 1)
MyLimitCol = UBound(TabData, 2) - 1

   
For i = 1 To MyLimitLin
       
ReDim Preserve Tablo(MyLimitCol, L)
           
           
For C = 0 To MyLimitCol
                    Tablo(C, L) = Cells(i, C + 1)
           
Next
           
        L = L + 1
   
Next i

With Worksheets.Add
    .Range('A1').Resize(UBound(Tablo, 2) + 1, UBound(Tablo, 1) + 1) = Application.Transpose(Tablo)
End With

End Sub


Maintenant pour ton cas précis, je n'ai pas vraiment approfondi car en plus il s'agit d'un Function Perso dont je n'ai pas vraiment cherché à comprendre le raisonnement.

Ceci est juste pour t'aider toi à comprendre le raisonnement d'un Algo de construction d'une 'Dynamic Array' en deux dimensions...

Regarde aussi le Travail de notre ami 'Zon' qui a regroupé pas mal d'info sur sa page Wiki :

Lien supprimé


Bon Appétit
[ol]@+Thierry[/ol]

Edition PS

Pour cette question que j'ai zappée :
D'ailleurs à partir du moment où mon tableau est de type Integer et que je modifie sa taille, les valeurs ne sont-elles pas initialisées à 0 ?

=> Non ! et quelque soit le Type de Tableau, si tu utilises bien le 'KeyWord' Preserve dans ton 'Statement' Redim... Tu préserveras tes données précédemment incrémentées dans le Tableau séquentiel.

Message édité par: _Thierry, à: 29/08/2005 12:19
 

Zon

XLDnaute Impliqué
Re:VBA Lecture d'une variable tableau multidimensi

Salut,

Aglas il me semble qu'en remplaçant les 2 ReDim Preserve predec(0 To n, 0 To p) par ReDim Preserve predec(0 To UBound(ref_index), 0 To p) . Ubound(ref_index) ne bouge pas contrairement à n.

For p = 0 To LBound(ligne_select) quel intérêt de faire une boucle de 0 à 0 ?

A+++


Ps: RDV à Lyon, Thierry
 

Discussions similaires

Réponses
16
Affichages
557
Réponses
19
Affichages
2 K

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 429
Messages
2 088 350
Membres
103 823
dernier inscrit
ben talha redouane