[Excel/VBA] Manipulation de tableaux à 2 dimensions

Manipulation de tableaux à 2 dimensions [Excel/VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 18-10-2006 à 12:54:14    

Bonjour,  
 
J'ai plusieurs questions sur la manipulation de tableaux bi-dimensionnels sous VBA :
 
- Est-il possible de supprimer une ligne du tableau (Genre Tableau(i).Delete) ?
- Est-il possible de comparer simplement une ligne dans deux tableaux (Genre If Tableau1(i) = Tableau2(j), sous couvert qu'ils aient la même dimension en colonnes)
 
Merci beaucuop !

Reply

Marsh Posté le 18-10-2006 à 12:54:14   

Reply

Marsh Posté le 18-10-2006 à 13:48:25    

bonjour,
Les réponses sont NON !
mais ce n'est pas utile.
Dans ton cas au lieu de supprimer : vide et passe à la ligne suivante
De la sorte à la fin tu auras un tableau (à moitié vide certes) mais tu n'auras plus qu'à le décharger en bloc dans une feuille vierge : La formule est connue :
Range(Cells(1, 1), Cells(i, k)) = Selection1()  
Ensuite tu n'auras .plus qu'à supprimer les lignes vides...
Je vois pas quel est ton problème pour comparer deux array : Tu t'apprêtais à comparer joyeusement deux tableaux excel, les array ne sont pas plus compliqués
For x = 1 to Ubound (Selection1())
For k = 1 to NbColonnes
For kk = 1 to NbColonnes 'pour comparer chaque colonne avec toutes les autres.
 If Selection1(i,k) = Selection1(i,kk) Then ...
 
Attention dans chaque boucle kk, il faudra poser un "flag" avant de mettre un Exit For xx
remettre le "flag" à 0 avant de tester le k suivant et ainsi de suite.
Après c'est à doit de savoir combien d'égalité (ou d'inégalité) sont nécessaire pour vider la ligne ou la garder :  
un petit compteur de "flag" fera le travail avant de passer à la boucle For  x suivante.
 
Ok ?


Message édité par galopin01 le 18-10-2006 à 13:52:36
Reply

Marsh Posté le 18-10-2006 à 13:56:10    

OK, c'est ce que j'ai fait au final. Disons qu'une comparaison ligne à ligne eût probablement été plus rapide. Mais bon, ça marche comme ça.  
 
Par contre, je veux supprimer les lignes d'un tableau pour pouvoir accélerer mon traitement : Une fois qu'une entrée a été trouvée, elle n'a plus lieu d'être présente, et de parasiter les recherches qui suivent. Dès le moment où mes tableaux comptent plusieurs milliers de lignes, c'est important d'optimiser.
 
Si une suppression est impossible, alors soit je passe par une feuille, mais la gestion des feuilles est assez lente, soit je "construis" la fonction : J'extrais deux arrays de la première "autour" de la ligne à supprimer, et je les concatène ensuite. Le problème devient alors la concaténation.

Reply

Marsh Posté le 18-10-2006 à 14:06:12    

Et ce qui me gave beaucoup, c'est que je n'arrive pas à faire la chose suivante :
 
A partir d'un tableau à 2 dimensions, faire référence à une "ligne"
 
Genre Tableau(2) :fou:

Reply

Marsh Posté le 18-10-2006 à 20:17:50    

bonjour,
je t'ai donné l'algo en 3 boucle For ! (avec une piote erreur de variable il est vrai  :D )
For x = 1 to Ubound (Selection1())  
For k = 1 to NbColonnes  
For kk = 1 to NbColonnes 'pour comparer chaque colonne avec toutes les autres.  
 If Selection1(x,k) = Selection2(x,kk) Then ...  
 
La première boucle For va travailler ligne par ligne (elle fait référence à la ligne x, pour reprendre ton expression)
Pour x = 1 on va passer en revu les k colonnes
et pour chaques k de Selection1, il faut qu'on passe en revue chaque kk de Selection2
Supprimer la ligne de cet array n'optimiserait rien du tout c'est d'ailleurs pour ça que ce n'est pas possible avec les array : la ligne est de toute façon traitée alors tu effaces -ou pas- en fonction des besoins et basta. Il sera toujours temps de supprimer en bloc les lignes vides dans le tableau final renvoyé dans Excel.
 
Quand à travailler directement sur les tableaux Excel l'augmentation du temps de traitement est de l'ordre de 1 à 100...
 
Sans aucun doute.
 
A+

Reply

Marsh Posté le 18-10-2006 à 21:19:53    

Merci beaucoup de ton aide. En effet, j'ai utilisé la méthode que tu suggérais, mais ça ajoute une boucle For pour le traitement de chaque ligne, au lieu de simplement comparer des vecteurs, ce que j'aurais souhaité.
Pour la suppression des lignes, en fait, j'ai trouvé un paliatif : J'ai ajouté un "colonne" dans la matrice permettant de flagger la ligne. Ainsi, au lieu de supprimer la ligne, je vérifie la valeur de cette colonne, et suivant la présence ou non du flag, je ne la traite pas. Si je la traite, "j'active" le flag. Ca revient globalement au même.
Bilan de l'opération : En passant d'un travail direct sur les cellules XL à un travail sur arrays, j'étais passé de 10 minutes de temps de traitement à 30 secondes pour des tableaux à comparer de 5000x10. En ajoutant ce système de flag, je suis passé à 10 secondes de traitement \o/


Message édité par agkklr le 18-10-2006 à 21:20:46

---------------
"Mon modèle, c'est moi-même."
Reply

Marsh Posté le 18-10-2006 à 23:14:19    

Bonsoir le Forum
 
Histoire de Tableau !!! à 2 dim
 
Ma petite idée vaut ce qu'elle vaut. On admet que tu déclares ton tableau : dim tab(1000,5)  
 
Moi j'aurais déclaré : dim tab(1000,6) , et dans la "colonne" 6, je cummule les autres "colonnes" occupées : 1, 2, .....avec un max de 6
 
Car si j'ai bien compris tu recopies ton tableau dans sur une nouvelle feuille, et bien dans ce cas là, si tab(x,6)=0 je saute à la "ligne" suivante ...... Plus besoin de supprimer les lignes vides sur ta feuille excel
 
A+
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed