Tableau de variable - celules filtrées [Résolu]

Messages postés
91
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
19 octobre 2012
- - Dernière réponse : ucfoutu
Messages postés
18039
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
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 198 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 198 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
91
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
19 octobre 2012
0
Merci
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"
Commenter la réponse de titeuf136
Messages postés
91
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
19 octobre 2012
0
Merci
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.
Commenter la réponse de titeuf136
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
0
Merci
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)
Commenter la réponse de cs_Jack
Messages postés
91
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
19 octobre 2012
0
Merci
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
Commenter la réponse de titeuf136
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
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
Commenter la réponse de ucfoutu
Messages postés
91
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
19 octobre 2012
0
Merci
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
Commenter la réponse de titeuf136
Messages postés
91
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
19 octobre 2012
0
Merci
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
Commenter la réponse de titeuf136
Messages postés
91
Date d'inscription
vendredi 15 janvier 2010
Statut
Membre
Dernière intervention
19 octobre 2012
0
Merci
J'avais écris un truc qui ressemble, mais pas tout à fait exact.

Merci encore et bonne journée
Commenter la réponse de titeuf136
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
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
Commenter la réponse de ucfoutu