Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2725 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [Excel/VBA] Manipulation de tableaux à 2 dimensions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Excel/VBA] Manipulation de tableaux à 2 dimensions

n°1459482
agkklr
Posté le 18-10-2006 à 12:54:14  profilanswer
 

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 !

mood
Publicité
Posté le 18-10-2006 à 12:54:14  profilanswer
 

n°1459525
galopin01
Posté le 18-10-2006 à 13:48:25  profilanswer
 

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
n°1459530
agkklr
Posté le 18-10-2006 à 13:56:10  profilanswer
 

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.

n°1459540
agkklr
Posté le 18-10-2006 à 14:06:12  profilanswer
 

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:

n°1460030
galopin01
Posté le 18-10-2006 à 20:17:50  profilanswer
 

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+

n°1460068
agkklr
Posté le 18-10-2006 à 21:19:53  profilanswer
 

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."
n°1460153
eric455
Posté le 18-10-2006 à 23:14:19  profilanswer
 

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+
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [Excel/VBA] Manipulation de tableaux à 2 dimensions

 

Sujets relatifs
Numérotation feuilles excelQuestion toute simple sur les arrays en VBA / Excel
Recherche multiple dans ExcelTrapper un msg d'erreur dans VBA
[Excel] Filtrer une colonne à partir d'une celluleExcel : convertisseur binaire
Help fonction personnalisée Excel 2003[VBA excel] Récupérer dans 1 listbox le resultat d'1 AutoFilter!résolu
Plus de sujets relatifs à : [Excel/VBA] Manipulation de tableaux à 2 dimensions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR