Microsoft 365 Copier-coller dans une plage avec des cellules masquées

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

iliess

XLDnaute Occasionnel
Bonjour,
Je vous transmets un code qui permet de copier-coller dans des cellules filtrées d'une plage contenant des cellules masquées.
Pourriez-vous, s’il vous plaît, l’améliorer ou le modifier afin de le rendre plus rapide et performant, sachant que ma plage de données est très étendue ?
Je vous remercie par avance pour votre aide.
Cordialement.

VB:
Sub RemplirDictionnaireVisible()
    Dim Disco1 As Object  ' Déclare un objet dictionnaire
    Dim Cellule As Range  ' Déclare une variable pour chaque cellule dans la plage
    Dim Plage As Range    ' Déclare la plage de cellules à parcourir

    ' Créer un objet dictionnaire
    Set Disco1 = CreateObject("Scripting.Dictionary")

    ' Définir la plage de cellules à analyser
    Set Plage = Range("C2:C19")  ' Plage de A1 à A20

    ' Parcourir chaque cellule de la plage
    For Each Cellule In Plage
        ' Vérifier si la cellule est visible (pas masquée)
        If Not Cellule.EntireRow.Hidden And Not Cellule.EntireColumn.Hidden Then
            ' Ajouter au dictionnaire : clé = adresse de la cellule, valeur = contenu de la cellule
            Disco1(Cellule.Address) = Cellule.Value
        End If
    Next Cellule


    ' Définir la nouvelle colonne (par exemple colonne B)
    NouvelleColonne = "A"
For Each Cle In Disco1.Keys
    ' Extraire uniquement le numéro de ligne de l'adresse
    Dim Ligne As String
    Ligne = Replace(Cle, "$", "") ' Enlever les signes "$" pour garder "A1"
    Ligne = Mid(Ligne, 2) ' Garder uniquement la partie ligne après la lettre de la colonne
    
    ' Construire l'adresse avec la nouvelle colonne
    Range(NouvelleColonne & Ligne).Value = Disco1(Cle)
Next Cle
    ' Libérer le dictionnaire
    Set Disco1 = Nothing
End Sub
 

Pièces jointes

Solution
Re,
Sur ma PJ ça marche, et le résultat est identique à la feuille B. Voir PJ.
Sur quel fichier travaillez vous ?

1735512673278.png
Bonjour Iliess,
Essayez cette macro :
VB:
Sub EssaiCopierColler()
    Dim L%
    Application.ScreenUpdating = False
    For L = 2 To 1000   ' A adapter
        If Not Cells(L, "A").EntireRow.Hidden And Not Cells(L, "A").EntireColumn.Hidden Then
            Cells(L, "A") = Cells(L, "C")
        End If
    Next L
End Sub
Sur 1000 lignes avec mon vieux XL2007 je passe de 89ms à 54ms (-40%).
A tester grandeur nature. 😉
 

Pièces jointes

Dernière édition:
Ou encore avec :
VB:
Sub EssaiCopierColler()
    Dim T, L%
    T = [A1:C1000]
    If Not Columns(1).Hidden Then
        For L = 2 To 1000   ' A adapter
            If Not Rows(L).Hidden Then
                T(L, 1) = T(L, 3)
            End If
        Next L
    End If
    [A1].Resize(UBound(T, 1), 1) = T
End Sub
Pus rapide, on passe de 89ms à 31ms ( -65% )
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
176
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
375
Retour