Tableau VBA, problème de restitution des données

Jack2

XLDnaute Occasionnel
Bonjour le Forum,

Dans la demande suivante :
https://www.excel-downloads.com/threads/tranfert-dinfo-et-visualisation.212529/
Il s'agissait de trouver dans la colonne J de trouver des cellules non vides (dates),puis de chercher le Prénom correspondant (colonne B) et l'identifiant (colonne E).

Pour travailler les tableaux, j'ai voulu mettre que les lignes non vides de la colonne C avec les deux correspondances. Ca marche pour un tableau à deux dimensions (procédure Lit_Donnees). Par contre, ça ne marche pas avec un tableau à 3 dimensions (procédure Lit_Donnees2).

Si quelqu'un peut m'aider à trouver cette erreur qui m'échappe depuis hier, merci par avance.

Jack2
 

Pièces jointes

  • A.xls
    231.5 KB · Affichages: 55
  • A.xls
    231.5 KB · Affichages: 72
  • A.xls
    231.5 KB · Affichages: 70

Bebere

XLDnaute Barbatruc
Re : Tableau VBA, problème de restitution des données

bonjour Jack
un exemple
Code:
Sub Lit_Donnees2()
Dim TInfo() As String
Dim Nb As Integer, Ind As Integer
Dim Deb As Long, Lig As Long

Lig = 6
Sheets("SF").Select
Nb = WorksheetFunction.CountA(Columns(10)) - 4
'Nb = Sheets("SF").Application.CountA(Range("J7:J" & Range("B1", Range("B65535").End(xlUp)).Rows.Count))

ReDim TInfo(1 To Nb, 1 To 3) 'nb lignes,3 colonnes
For Ind = 1 To Nb
    Deb = Range("J" & Lig).End(xlDown).Row
    Lig = Deb
    TInfo(Ind, 1) = Trim(Cells(Lig, 2))
    TInfo(Ind, 2) = Cells(Lig, 2).Offset(0, 3)
    TInfo(Ind, 3) = Cells(Lig, 2).Offset(0, 8)
Next Ind


Sheets("Feuil1").Select
For Ind = LBound(TInfo, 1) To UBound(TInfo, 1) 'index ligne
For c = LBound(TInfo, 2) To UBound(TInfo, 2) 'index colonne
    Cells(Ind, c) = TInfo(Ind, c)
    Next c
    Next Ind
'    Range("B" & Ind) = TInfo(Ind, 2)
'    Range("C" & Ind) = TInfo(Ind, 3)


End Sub
 

Jack2

XLDnaute Occasionnel
Re : Tableau VBA, problème de restitution des données

Bonjour le Forum, Bonjour Bebere,

Merci pour cette partie de code que j'ai aperçue quelques fois :
Code:
For Ind = LBound(TInfo, 1) To UBound(TInfo, 1) 'index ligne
    For c = LBound(TInfo, 2) To UBound(TInfo, 2) 'index colonne
        Cells(Ind, c) = TInfo(Ind, c)
    Next c
Next Ind
Elle permet d'éviter des erreurs avec LBound et UBound et de scinder les lignes et les colonnes, ce qui est plus pratique pour vérifier la validité du code.

Mon problème était de savoir d'où provenait l'erreur dans la partie "écriture" la partie "lecture" semble fonctionner :
Code:
For Ind = 1 To Nb
    Range("A" & Ind) = TInfo(Ind, 1, 1)
    Range("B" & Ind) = TInfo(1, Ind, 1)
    Range("C" & Ind) = TInfo(1, 1, Ind)
Next Ind
uniquement pour la première valeur i = 1 dans la procédure Lit_Donnees2, avec un tableau de type TInfo(Nb, Nb, Nb (cf. résultat en A1:C1 dans la feuille " Feuil1" . L'optimisation que tu m'as fournie correspond à un tableau de type TInfo(Nb, Nb) comme dans Lit_Donnees1.

Si tu as une idée sur l'origine.. Merci par avance.

Jack2
 

Paf

XLDnaute Barbatruc
Re : Tableau VBA, problème de restitution des données

bonjour à tous,

Dans la partie remplissage du tableau TInfo :
Code:
TInfo(Ind, 1, 1) = Trim(Cells(Lig, 2))
TInfo(1, Ind, 1) = Cells(Lig, 2).Offset(0, 3)
TInfo(1, 1, Ind) = Cells(Lig, 2).Offset(0, 8)
quant Ind = 1 on obtient
Code:
TInfo(1, 1, 1) = Trim(Cells(Lig, 2))
TInfo(1, 1, 1) = Cells(Lig, 2).Offset(0, 3)
TInfo(1, 1, 1) = Cells(Lig, 2).Offset(0, 8)

c'est à dire qu'on écrit dans le même "élément" le prénom puis le code et la date.

Je crois que le code suivant serait préférable (même si un tableau 3D ne se justifie pas:
Code:
TInfo(Ind, 1, 1) = Trim(Cells(Lig, 2))
TInfo(Ind, 2, 1) = Cells(Lig, 2).Offset(0, 3)
TInfo(Ind, 1, 2) = Cells(Lig, 2).Offset(0, 8)

Bonne suite
 
Dernière édition:

Jack2

XLDnaute Occasionnel
Re : Tableau VBA, problème de restitution des données

Bonsoir tout le monde,

J'avais essayé Tinfo(1 to nb,1 to nb,1 to nb) et option Base 1. Paf a raison, au premier passage en "écriture" on a effectivement :
Code:
TInfo(1, 1, 1) = Trim(Cells(Lig, 2))
TInfo(1, 1, 1) = Cells(Lig, 2).Offset(0, 3)
TInfo(1, 1, 1) = Cells(Lig, 2).Offset(0, 8)
C'est pour cette raison que la date entrée en dernier apparaît 3 fois au premier passage. Encore une erreur de débutant. Le tableau 3D était un essai. La solution donnée par Bebere et par tableau 2D est plus logique, plus compréhensible et évite ce genre d'erreur.

Encore merci à tous.

Jack2
 

Discussions similaires

Statistiques des forums

Discussions
312 115
Messages
2 085 443
Membres
102 889
dernier inscrit
monsef JABBOUR