XL 2016 Affichage plage de données

Cheesecake

XLDnaute Nouveau
Salut tout le monde :)

Vous étonnez pas de l'heure à laquelle le message est posté, je suis actuellement au Canada ;)
Je suis une débutante en VBA et voici mon problème :

J'ai une plage de données du type :
1 2
1 3
2 5
2 4
3 9
3 2
La première colonne correspond au numéro de ligne et la deuxième correspond à ce que contient chaque ligne.

Du coup, j'aimerais pouvoir avoir un affichage comme suit :
2 3
5 4
9 2

Je vous mets en pièce jointe ce que j'ai codé avec des commentaires, et qui ne marche pas :/ (Erreur 9: L'indice n'appartient pas à la sélection)

Merci d'avance pour votre aide ! :D
 

Pièces jointes

  • exercice.xlsm
    15.2 KB · Affichages: 34

Dranreb

XLDnaute Barbatruc
Bonsoir.
La propriété Value d'un Range de plusieurs cellule est un tableau de Variant à 2 dimensions toujours basé 1, d'où votre erreur parce qu'un indice est à 0 au début.
En tout cas moi j'ai écrit ça, qui a tourné du 1er coup :
VB:
Sub Parcour2()
Dim TDon(), LDon As Long, TRés(1 To 10, 1 To 10), LRés As Long, CRés As Long, TNbCol(1 To 10) As Long
TDon = Range("A1:B6").Value
For LDon = 1 To UBound(TDon, 1)
   LRés = TDon(LDon, 1)
   CRés = TNbCol(LRés) + 1: TNbCol(LRés) = CRés
   TRés(LRés, CRés) = TDon(LDon, 2)
   Next LDon
Cells(1, "E").Resize(10, 10).Value = TRés
End Sub
 

Cheesecake

XLDnaute Nouveau
Bonsoir,

Merci pour votre réactivité! J'ai remplacé les indices 0 par 1 mais la même erreur s'affiche :/

D'après ce que j'ai compris dans votre code :
TDon contient la plage de données initiale. Ensuite, pour chaque ligne LDon de cette plage, LRés va recevoir le numéro de la ligne concernée.
La 3ème ligne du For avec TRès permet de remplir au fur et à mesure le nouveau tableau selon LRés et CRés avec la 2ème colonne de TDon et la ligne concernée.

Pourriez-vous m'expliquer comment vous obtenez la valeur de CRés ? je ne la comprends pas :/ (à quoi correspond TNbCol, que signifie 1:TnbCol(LRés), pourquoi terminer la ligne par =Crés)

Merci encore ! :)
 

Dranreb

XLDnaute Barbatruc
Vous avez bien compris tout le début.
TNbCol contient pour chaque numéro de ligne résultante le nombre de colonnes déjà remplies. Partout à 0 au départ, on y ajoute 1 pour obtenir CRés puis on le remet à jour pour la fois d'après, s'il y a lieu.
Le ':' est un séparateur d'instructions, quand on veut en mettre plusieurs sur une ligne.
 
Dernière édition:

Cheesecake

XLDnaute Nouveau
En fait j'aimerais appliquer ce code sur un échantillon très grand.
Le résultat contiendrait 515 597 lignes et un nombre de colonne maximal égal à 100.
J'ai testé plusieurs combinaisons concernant les tailles de TRés et resize() mais une erreur s'affiche (la même erreur 9 que précédemment).
En fait cette plage de données ne tiens même pas sur une feuille Excel, donc j'aimerais commencer avec 100 000 lignes...
Que devrait-je mettre dans les paramètres de Très et resize() pour effectuer l'affichage? :/
Merci pour votre aide.
 

Dranreb

XLDnaute Barbatruc
Bonjour
Vous pouvez faire TDon = Range(Cells(1, "B"), Cells(1000000, "A").End(xlUp)).Value
Vous pouvez ne pas mettre de dimension à la déclaration, juste TRés(), mais alors il faut un Redim TRés(1 To 515597, 1 To 100) avant de pouvoir le manipuler.
Vous pouvez en fin utiliser Resize(Ubound(TRés, 1), UBound(Trés, 2))
 

Discussions similaires

Réponses
4
Affichages
454

Statistiques des forums

Discussions
315 127
Messages
2 116 539
Membres
112 774
dernier inscrit
Foudil59