Belag55
Messages postés20Date d'inscriptionmercredi 17 décembre 2008StatutMembreDernière intervention13 février 2009
-
13 févr. 2009 à 11:19
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 2010
-
14 févr. 2009 à 16:16
Bonjour,
Voici mon problème : dans un gros tableau excel (comprenant plusieurs milliers de lignes et dizaines de colonnes), je dois régulièrement y pêcher des infos précises. Ce tableau a un nombre de lignes variable (il s'agit de la production globale sur tous les outils d'une usine sur une période donnée.) Pour me simplifier la tâche je me suis concocté un petit code mais j'ai un soucis sur le rendu.
Voici la chose :
' boucle qui définit le nombre de lignes du tableau source
i = 0
Range ("A1").Select
Do While ActiveCell.Offset(i, 0) <> ""
i = i + 1
Loop
' ici je vais chercher dans la colonne "outil" celui qui m'interesse et que je vais nommer "DP"
' et a chaque fois qu'une ligne de cette colonne comporte "DP", je teste une autre colonne (qualité) ou je dois
' trouver la mention "A". Grace à ces 2 champs, je vais récupérer des infos leur correspondat dans 8 autres
' colonnes et les stocher dans un tableau VBA que je nomme "tab_declas()"
j = 0
For Each c In Range("B2:B" & i) 'recherche de la valeur "DP" dans la colonne "B" & i puis "A" dans la colonne
' "X" correspondante. If c "DP" And Range("X" & c.Row) "A" Then j j + 1 'j 2ème dimension du tableau "tab_declas"
'redimentionne et alimente le tableau tab_declas en fonction de la boucle
'avec des valeurs sur des colonnes prédéfinies du tableau source
ReDim Preserve tab_declas(7, j)
tab_declas(0, j - 1) = Range("D" & c.Row).Value
tab_declas(1, j - 1) = Range("H" & c.Row).Value
tab_declas(2, j - 1) = Range("N" & c.Row).Value
tab_declas(3, j - 1) = Range("O" & c.Row).Value
tab_declas(4, j - 1) = Range("R" & c.Row).Value
tab_declas(5, j - 1) = Range("T" & c.Row).Value
tab_declas(6, j - 1) = Range("V" & c.Row).Value
tab_declas(7, j - 1) = Range("AF" & c.Row).Value
End If
Next c
Donc voila, jusque là tout va bien, j'ai récupéré mes valeurs dans un tableau VBA, mais pour la restitution
c'est une autre histoire. Avec la ligne de code suivante, j'ai bien mes données recopiées sur ma feuille excel, mais pas dans le bon sens : mes colonnes se retrouvent en ligne et mes lignes en colonnes et j'ai beau modifier cette ligne et tourner le problème dans tous les sens, je n'arrive pas au résultat espéré.
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 14 févr. 2009 à 01:51
Bonjour
Ton problème, c'est que Redim Preserve t'interdit de permuter les deux dimensions du tableau, ce qui, comme tu le sais certainement, résoudrait ton problème.
Mais puisqu'au début de ton code tu as calculé dans la variable i le nombre de lignes, et que tu sais que la 2e dimension de ton tableau ne peut pas dépasser i, tu peux faire un Redim tab_declas(7, i) sans risque de dépassement.
Ce faisant, tu te libères des contraintes de Redim Preserve, et tu peux donc permuter les deux Dimensions de ton tableau pour le "redresser".
Ton code devient alors :
i = 0
Range ("A1").Select
Do While ActiveCell.Offset(i, 0) <> ""
i = i + 1
Loop
Redim tab_declas(i,7) ' initialisation du tableau, avec permutation
' des lignes/colonnes par rapport au code initial
j = 0
For Each c In Range("B2:B" & i) If c "DP" And Range("X" & c.Row) "A" Then
tab_declas(j, 0) = Range("D" & c.Row).Value
tab_declas(j, 1) = Range("H" & c.Row).Value
tab_declas(j, 2) = Range("N" & c.Row).Value
tab_declas(j, 3) = Range("O" & c.Row).Value
tab_declas(j, 4) = Range("R" & c.Row).Value
tab_declas(j, 5) = Range("T" & c.Row).Value
tab_declas(j, 6) = Range("V" & c.Row).Value
tab_declas(j, 7) = Range("AF" & c.Row).Value
j = j + 1
End If
Next c
Range(Cells(1, 1), Cells(j, 8) = tab_declas
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 14 févr. 2009 à 16:16
Salut
je propose l'utilisation de la propriété "End" d'une plage("Range") pour le calcul du nombre de lignes de cellules non vides
Au lieu de :
i = 0
Range ("A1").Select
Do While ActiveCell.Offset(i, 0) <> ""
i = i + 1
Loop
Faire cela :
Range ("A1").Select
debut = ActiveCell.Row
fin = ActiveCell.End(xlDown).Row
nblignes = fin-debut + 1