Inversion tableau

Belag55 Messages postés 20 Date d'inscription mercredi 17 décembre 2008 Statut Membre Dernière intervention 13 février 2009 - 13 févr. 2009 à 11:19
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 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é.

    Range(Cells(1, 1), Cells(8, UBound(tab_declas, 2) + 1)) = tab_declas

Si quelqu'un pouvait éclairer ma lanterne de débutant, ça serait sympa. Merci

2 réponses

cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
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


Est-ce que tu peux tester le code ci-dessus ?

Amicalement
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
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



CNTJC
0