Copie Cellules Visibles Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
P
Pilougne
Membre habitué
Membre habitué
Messages : 106
Inscrit le : 27 novembre 2015
Version d'Excel : 10

Message par Pilougne » 23 avril 2016, 09:42

Bonjour,

Je souhaite copier les cellules visibles (filtrées) et non vides des colonnes Poulies, Tomates, Voiture du tableau feuille TATA dans le tableau feuille TOTO à la suite des données dans les bonnes colonnes.
J’arrive à copier une colonne mais en indiquant la plage des données car sinon je copie en plus des lignes vides et ça ne fonctionne pas si un filtre est activé.
J’aimerais que la macro ne copie que ces plages de données sans avoir besoin de définir le début et fin de plage.
Est-il aussi possible de copier les commentaires car ils disparraissent ?

Merci pour votre aide.

Pilougne
CpyCell.xls
(60 Kio) Téléchargé 22 fois
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 23 avril 2016, 09:57

Bonjour,

Utiliser SpecialCells pour définir LastLigne ne sert à rien. En outre, la définition par End(xlUp) te renverra la dernière ligne du tableau, même si elle est vide (un effet pervers des tableaux Excel !).
Pour utiliser correctement SpecialCells, tu dois filtrer pour masquer les lignes vides, tu dois masquer les colonnes que tu ne veux pas, et tu l'appliques à ton tableau (car SpecialCells s'applique à un objet Range).

Cordialement.
P
Pilougne
Membre habitué
Membre habitué
Messages : 106
Inscrit le : 27 novembre 2015
Version d'Excel : 10

Message par Pilougne » 24 avril 2016, 18:16

Bonjour MFerrand,

Merci pour votre réponse, je comprends pourquoi je galère.
Auriez-vous un exemple pour m'aider?.

Cordialement
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 29 avril 2016, 12:10

Bonjour,

Essaie ceci :
Sub Transférer()
    Dim plt(), i%, k%, n%
    For k = 1 To 5 Step 2
        For i = 1 To [Tableau1].Rows.Count
            If [Tableau1].Cells(i, k) <> "" And i > n Then n = i
        Next i
    Next k
    ReDim plt(1 To n, 1 To 3)
    For k = 0 To 2
        For i = 1 To n
            plt(i, k + 1) = [Tableau1].Cells(i, k * 2 + 1)
        Next i
    Next k
    [Tableau17].Cells(1, 1).Resize(n, k).Value = plt
End Sub
sans filtrage ni SpecilCells, qui me paraît plus sûr...
(Bouton Transférer)

Cordialement.
pilougne_CpyCell.xls
(66.5 Kio) Téléchargé 25 fois
P
Pilougne
Membre habitué
Membre habitué
Messages : 106
Inscrit le : 27 novembre 2015
Version d'Excel : 10

Message par Pilougne » 30 avril 2016, 17:34

Bonjour MFerrand,

Je vous remercie pour votre aide et votre temps passé sur mon problème.
je viens de tester votre fichier qui fonctionne correctement mais sauf erreur il ne "gère" pas le filtrage et les données transférées ne se cumulent pas. Si je ne me trompe, vous utilisez les variables dynamiques, vu mon petit niveau je n'y aurais jamais pensé en vba, j'étais entrain de voir du côté de Userange, mais pareil, je n'arrive pas a détecter la dernière ligne non vide du tableau.
Je suis preneur de toute solution.
En espérant de mon problème serve aussi à d'autres.

Cordialement
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 1 mai 2016, 09:24

Bonjour,

J'ignore ce que tu entends pas "gérer le filtrage" !? L'objectif était que les valeurs de 3 colonnes du tableau de la feuille 1 soient transférées dans le tableau de la feuille 2.
En tout état de cause, si la procédure avait opéré un filtrage pour procéder à cette action, elle aurait rétabli la situation initiale une fois l'action réalisée, tu ne verrais donc rien.
Mais cette procédure réalise le transfert au moyen d'un tableau VBA, servi valeur par valeur et affecté globalement au tableau cible.

Comme je l'ai indiqué, elle n'opère aucun filtrage et n'utilise pas la méthode SpecialCells, et également elle ne procède pas par copier-coller. Elle utilise donc des méthodes propres à VBA qui ne sont pas reproductibles manuellement.

Elle présuppose effectivement que le tableau cible est vide, mais on peut aisément remédier à cela. Je ne l'avais point fait car ton utilisation de tableaux Excel de façon quelque peu désordonnée car il sont en partie vides... ne permet pas d'utiliser les méthodes habituelles de recherche de la fin d'une plage. Mais c'est ton choix !
Sub Transférer()
    Dim plt(), i%, k%, n%
    For k = 1 To 5 Step 2
        For i = 1 To [Tableau1].Rows.Count
            If [Tableau1].Cells(i, k) <> "" And i > n Then n = i
        Next i
    Next k
    ReDim plt(1 To n, 1 To 3)
    For k = 0 To 2
        For i = 1 To n
            plt(i, k + 1) = [Tableau1].Cells(i, k * 2 + 1)
        Next i
    Next k
   [surligner]i = 0
    Do
        i = i + 1
        If IsEmpty([Tableau17].Cells(i, 1)) Then Exit Do
    Loop
    [Tableau17].Cells(i, 1).Resize(n, k).Value = plt[/surligner]
End Sub
Tu modifies la fin de la macro (partie surlignée) et tu testes en actionnant deux fois le transfert. Tu auras 2 fois les valeurs à transférer à la suite...

Cordialement.
P
Pilougne
Membre habitué
Membre habitué
Messages : 106
Inscrit le : 27 novembre 2015
Version d'Excel : 10

Message par Pilougne » 6 mai 2016, 10:59

Bonjour,

Je suis désolé si ma demande n'est pas très claire, votre fichier réalise correctement la copie de mes colonnes dans le tableau de la feuille 2 (MERCI) , mais je ne souhaite copier uniquement les cellules non filtrées, j'entends par filtrage: critère.
Exemple si je sélectionne le critère jaune sur la colonne 1 , je ne veux copier que les cellules des lignes qui seront visibles.

Cordialement.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 6 mai 2016, 11:25

Bonjour,
Sub Transférer()
    Dim plt(), i%, k%, n%, m%
    For k = 1 To 5 Step 2
        For i = 1 To [Tableau1].Rows.Count
            If [Tableau1].Cells(i, k) <> "" And i > n Then n = i
        Next i
    Next k
    ReDim plt(1 To 3, 1 To n)
    For i = 1 To n
        If Not [Tableau1].Rows(i).Hidden Then
            m = m + 1
            For k = 0 To 2
                plt(k + 1, m) = [Tableau1].Cells(i, k * 2 + 1)
            Next k
        End If
    Next i
    ReDim Preserve plt(1 To 3, 1 To m): i = 0
    Do
        i = i + 1
        If IsEmpty([Tableau17].Cells(i, 1)) Then Exit Do
    Loop
    [Tableau17].Cells(i, 1).Resize(m, k).Value = Application.Transpose(plt)
End Sub
Ça ressemble, mais il y a pas mal de petites différences...

Cordialement.
pilougne_CpyCell.xls
(68 Kio) Téléchargé 25 fois
P
Pilougne
Membre habitué
Membre habitué
Messages : 106
Inscrit le : 27 novembre 2015
Version d'Excel : 10

Message par Pilougne » 7 mai 2016, 13:40

Bonjour,

Je vous REMERCIE c'est exactement ce que je voulais.
Il me reste a décortiquer votre code, car j'aime bien
comprendre ce que j'utilise.

Merci

Cordialement.
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 7 mai 2016, 13:44

Si quelque chose t'échappe, je répondrai aux questions...

Bonne journée.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message