Tableau de variable - celules filtrées

Résolu
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 - 7 nov. 2011 à 19:59
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 8 nov. 2011 à 11:22
Bonjour je souhaite alimenter un tableau de variables uniquement avec les cellules visibles. Les données filtrées ne sont pas prises en compte.

Voici le bout de code qui me pose souci

l = 0
For I = 2 To 20
l = l + 1
k = 0
For J = 2 To 6
  If Cells(I, J).EntireRow.Hidden = False Then
    If J <> 3 Then
        k = k + 1
        tboall(l, k) = Cells(I, J)
    End If
  End If
ReDim Preserve tboall(l, k)
Next J
Next I

12 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 nov. 2011 à 08:11
Bonjour,

On touche là à des difficultés diverses :
- comment redimensionner le tableau au fur et à mesure ? ce n'est en effet d ans ce cas pas possible, comme l'exprime jack
- comment transformer directement en tableau dynamique une plage discontinue ? Ce n'est en effet pas possible si la plage n'est pas continue.
- pourquoi, alors, ne pas profiter de la plage constituée (cellules visibles) pour en déduire les dimensions à donner au tableau et ainsi éviter de le redimensionner ensuite ? Pas possible car le Rows.count dune plage discontinue est faussé.
Alors ?
Alors voilà et bien que, dans un tel cas de figure, je choisirais personnellement une autre méthode (qui passe par l'utilisation d'une feuille temporaire) pour alimenter mon tableau dynamique d'un seul coup

Les attendus :
- attendu tout ce que j'ai dit plus haut
- attendu que le cells.count d'une plage discontinue fonctionne par contre bien
- attendu que je veux éviter de calculer le rows.count en divisant le cells.count par le Columns.count et tout alourdir ensuite
- attendu que, lorsqu'une ligne est cachée, elle concerne toutes les cellules/colonnes de cette ligne
- attendu que l'on connait par contre le nombre de colonnes de la plage à traiter
- attendu que, pour dimensionner d'entrée de jeu mon tableau dynamique, il me suffit donc de calculer le nombre de lignes visibles de cette plage
- attendu que ce nombre de lignes est égal à cellui des cellules de la plage visible dans mle cas où cette plage ne serait composée que d'une seule colonne
Arrêté :
Dim toto As Range, nbcol As Integer
 nbcol = Range("B12:F20").Columns.Count
 Set toto = Range("B2:B20").SpecialCells(xlCellTypeVisible)
 ReDim tablo(1 To toto.Cells.Count, 1 To nbcol)
 Dim ou As Long
 ou = 0
 Dim c As Range, i As Integer
  For Each c In toto
    ou = ou + 1
    tablo(ou, 1) = c.Value
    For i = 2 To nbcol
      tablo(ou, i) = c.Offset(0, i - 1).Value
    Next
 Next
 Set toto = Nothing
 '=======preuve ======= pour affiche le contenu du tableau=====
 Dim j As Integer
For i = 1 To UBound(tablo)
  For j = 1 To nbcol
     MsgBox tablo(i, j)
  Next
 Next

Quand je vous dis, que je suis fou, hein ... Il faut me croire

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 nov. 2011 à 11:05
1) si c'est résolu === >> tag "réponse acceptée", pour que cela puisse servir à d'autres un jour , donc !
2) tu m'étonnes (et m'inquiètes un peu, là :
 With Worksheets("Feuil2")
   .Range(.Cells(1, 1), .Cells(UBound(tablo), UBound(tablo, 2))).Value  = tablo
 End With

mettra les données de ton tableau sur la fgeuille nommée "Feuil2", à partir de la cellule A1 (exemple).
____________________


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 nov. 2011 à 20:18
BVonjour,

Ouvre ton aide VBA sur la méthode Range.SpecialCells et sur le mot xlCellTypeVisible
et sers-t-en donc
Reviens uniquement si toujours en difficulté, mais en nous montrant ce que tu as tenté d'écrire en te servant de cela



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
7 nov. 2011 à 20:53
Bonsoir,

J'avais déjà essayé en écrivant
If Cells(I, J).SpecialCells(xlCellTypeVisible) Then


toutefois mon code bloque au niveau de la ligne
tboall(l, k) = Cells(I, J)


le message d'erreur indique que "l'indice n'appartient pas à la selection"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
7 nov. 2011 à 21:10
En fait pour m'epargner cette boucle de remplissage de mon tableau, j'avais dans un premier temps écris
tboall()=Range("B2:F20").SpecialCells(xlCellTypeVisible


cela n'a pas fonctionné. Pourrais-tu me dire pourquoi et me proposer une solution ?

-> Mon but est d'avoir un tableau de variable de la zone B2:F20 mais sans recopier les cellules des lignes non visibles.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 nov. 2011 à 00:37
Salut

Si tu essayes de remplir ton tableau avant de le dimensionner, tu vas avoir des soucis :
Dans ta boucle, tu affectes une valeur à tboall(l, k) et seulement après tu fais un Redim
Comment est dimensionné ton tableau tboall ?

Si ta variable l est incrémentée à chaque tour de la boucle For I, le contenu de ta variable l est donc directement lié à celui de I. Ta variable l est donc superflue puisque l = I - 1

Ta variable J semble représenter les colonnes des cellules que tu vises.
Or .EntireRow.Hidden est valable pour la ligne : Perte de temps à boucler sur les colonnes .
Pour en revenir à ta variable l, je pense qu'il ne faudrait l'incrémenter qu'après avoir fait le test Visible ou pas, non ?
Mais comme on ne sait pas ce que tu veux mettre et ne pas mettre dans ton tableau, difficile de t'aider plus.

PS : En VB, les index de tableau commencent à 0, pas à 1 (sauf déclaration contraire) - pas gênant.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
8 nov. 2011 à 08:17
bonjour merci pour ces explications.

Voici la suite du code
Sub tableau()
Dim tboall() As Variant
Dim tbosub() As Variant

Worksheets(1).Select
'tboall = Range("B2:F20")

l = 0
For I = 2 To 20
l = l + 1
K = 0
For J = 2 To 6
  If Cells(I, J).EntireRow.Hidden = False Then
    If J <> 3 Then
        K = K + 1
        ReDim tboall(l, K)
        tboall(l, K) = Cells(I, J)
    End If
  End If
Next J
Next I

ReDim Preserve tbosub(1)
For I = 1 To UBound(tboall, 1)
   For J = 1 To UBound(tbosub)
      If tboall(I, 1) tbosub(J) Then blnExiste True
   Next J
   If blnExiste = False Then
      If tbosub(1) <> "" Then ReDim Preserve tbosub(UBound(tbosub) + 1)
      tbosub(UBound(tbosub)) = tboall(I, 1)
   End If
   blnExiste = False
Next I

For I = 1 To UBound(tbosub)
Cells(I + 20, 7) = tbosub(I)
Next I

ReDim rezult(UBound(tbosub), 4)
For J = 1 To UBound(tbosub)
    rezult(J, 2) = 0
    rezult(J, 3) = 0
    rezult(J, 4) = 0
    For I = 1 To UBound(tboall, 1)
        If tboall(I, 1) = tbosub(J) Then
            rezult(J, 1) = tbosub(J)
            
            If tboall(I, 3) <> "" Or tboall(I, 4) <> "" Or tboall(I, 5) <> "" Then
            rezult(J, 2) = rezult(J, 2) + 1

            End If
            
            If tboall(I, 3) "" And tboall(I, 4) "" And tboall(I, 5) = "" Then
            rezult(J, 3) = rezult(J, 3) + 1

            End If
            
            rezult(J, 4) = rezult(J, 4) + 1
            

        End If
    Next I
  
Next J


Cette fois -ci cela bloque au moment où je fait le test
If tboall(I, 3) <> "" 
. A quel endroit faut-il redimensionner le tableau ?

Ma macro fonctionne lorsque je me contente de considérer toutes les cellules de la zone:
'tboall = Range("B2:F20")

Cela se complique lorsque je veux créer le même tableau mais sans les lignes cachées. Par exemple B2:F20 mais sans la zone E2:E20

c'est pourquoi j'ai dans un premier temps voulu remplacer
'tboall = Range("B2:F20")

par
tboall = Range("B2:F20").SpecialCells(xlCellTypeVisible)

N'obtenant aucun résultat j'ai voulu procéder par un remplissage avec boucle:
l = 0
For I = 2 To 20
l = l + 1
K = 0
For J = 2 To 6
  If Cells(I, J).EntireRow.Hidden = False Then
    If J <> 3 Then
        K = K + 1
        ReDim tboall(l, K)
        tboall(l, K) = Cells(I, J)
    End If
  End If

Next J
Next I


Je ne sais pas si mon explication est tout à fait claire.
Merci d'avance pour ton aide
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 nov. 2011 à 08:22
Oui ?

Et tu as essayé mon code de fou ? Il marche bien


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
8 nov. 2011 à 08:34
Bonjour,

je ne m'étais pas aperçu que tu avais posté un message, j'étais en train de rédiger le message suivant. Je vais tester de suite !
Merci
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
8 nov. 2011 à 09:54
Bonjour,

Super ça a tout l'air de marcher. je pense réussi à l'adapter à mon cas de figure.

Saurais-tu toutefois me dire comment afficher le tableau de variable ds une feuille excel (pour vérifier son contenu)

Jusqu'à présent je m'étais débrouillé en faisant:
Cells(21, 8) = tboall(1, 2)
Cells(22, 8) = tboall(2, 2)
Cells(23, 8) = tboall(3, 2)
Cells(24, 8) = tboall(4, 2)
Cells(25, 8) = tboall(5, 2)


Mais comme le tableau est à dimension variable, cette méthode n'est pas vraiment adaptée. -> Comment faire ?

Merci pour ton aide
0
titeuf136 Messages postés 91 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 19 octobre 2012 1
8 nov. 2011 à 11:17
J'avais écris un truc qui ressemble, mais pas tout à fait exact.

Merci encore et bonne journée
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 nov. 2011 à 11:22
C'est ma réponse de 8 h 11 (celle qui correspond au sujet principal), qu'il faut taguer "réponse acceptée" !
pas la dernière, qui traite d'autre chose, elle !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous