IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copier/coller des cellules non vides d'une plage définie sur une seule ligne d'une page différente


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Copier/coller des cellules non vides d'une plage définie sur une seule ligne d'une page différente
    Bonjour à tous,
    Nouveau sur le forum et novice en programmation VBA, après des recherches, tests et adaptation (avec mes maigres connaissances actuelles) de différents codes proposés, je ne parviens toujours pas à résoudre mon problème.
    Je souhaite mettre en oeuvre une macro pour me permettre de copier sur une seule ligne et dans une feuille différente, les cellules non vides d'une plage de la feuille active définie (C20:G27) pouvant variée de 2 à 8 lignes. Chaque ligne ne possède qu'une seule cellule remplie mais de manière aléatoire.

    Nom : Demande_forum.jpg
Affichages : 1845
Taille : 107,9 Ko

    Je parviens, pour le moment à copier les différentes cellules, mais pas sur une seule ligne.
    J'ai absolument besoin d'un petit coup de main pour la solution.

    Merci pour votre ... précieuse aide

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour
    Je vais personnellement d'abord te guider.
    Puis voir ce que tu en fais (et ne revenir t'aider qu'au vu de cet effort) --->>
    1) dresser la plage plage des cellules concernées (t'intéresser à ce propos à la méthode specialcells (à lire dans ton aide VBA interne)
    2) s'agissant d'une plage de cellules discontinues, on ne peut la copier directement par la méthode Range.copy.
    Une telle plage discontinue est toutefois composée de sous-plages continues : ces sous-plages sont des objets Area (à lire dans ton aide VBA interne)
    pour chaque plage Area, de la plage plage -->> méthode range.copy
    Copier avec quelle destination ? --->> la ligne de ton choix et la colonne (1 au départ) que tu augmentes du nb d'articles de chaque area après avoir procédé à la copie de cet area)

    Montre-moi ce que tu fais (tentes au moins de faire) sur ces bases.

    EDIT : correction de la méthode --->>
    Ne pas décomposer en areas (car difficulté si 2 - ou plus - cellules composent un area)
    modifier donc le 2) ainsi :
    dire que la colonne C ou copier = 0
    Pour chaque cellule de la plage Plage, ajouter sa valeur en colonne C + 1, à la ligne L choisie pour la copie.

    je viens de le faire -->> 4 lignes de code très simple sur les bases que je t'ai indiquées.
    Et on pourrait n'en avoir que 3 (plus besoin de la variable C) si chaque ligne contenait forcément une donnée

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour
    "chaque ligne n'a qu'une seule cellule remplie"
    heu oui dans ta capture il y en a deux sur chaques lignes une rouge/une noire????????

    avoir représenté deux exemples dans une meme capture peut preter a confusion

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    il y a plusieurs solutions diverses et variées
    perso la methode areas +copy paste me semble un peu moulin et pareil dans un tableau car il faudrait sous boucler sur les cells des areas contigues

    une methode peu ortodoxe mais qui fonctionne quand meme
    recuperation de l'adresse de la plage des cellule occupées
    replace des ":" par "," conversion en array avec split ,remplacement des addresse par les valeurs des cellules(address)
    j'ai utilisé les meme emplacement que dans ta capture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TEST1()
        Dim plage As Range, plage2 As Range, tabl As Variant, i As Long
        With ActiveSheet
            Set plage = .Range("C20:G28")
            Set plage_intermediaire = plage.SpecialCells(xlCellTypeConstants)
            tabl = Split(Replace(plage_intermediaire.Address, ":", ","), ",")
            For i = 0 To UBound(tabl)
                tabl(i) = .Range(tabl(i))
            Next
            Debug.Print Join(tabl, ",")
            .Range("j23").Resize(1, UBound(tabl)) = tabl
        End With
    End Sub

    methode avec boucle sur les CELLS de la plage des specialcells(xlcelltypeconstant) qui reste la plus sur et plus ortodoxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TEST3()
        Dim plage As Range, plage2 As Range, tabl As Variant, i As Long
        With ActiveSheet
            Set plage = .Range("C20:G28")
            Set plage2 = plage.SpecialCells(xlCellTypeConstants)
            ReDim tabl(plage2.Cells.Count)
            For Each cel In plage2.Cells
                i = i + 1: tabl(i - 1) = cel
            Next
            'Debug.Print Join(tabl, ",")
            .Range("j23").Resize(1, UBound(tabl)) = tabl
        End With
    End Sub
    3° que je proscrit
    dans ce prototype de boucle je proscrit la methode boucle sur areas il peut y avoir plusieurs cells contigues dans un area s'a m'obilgerait a sous boucler
    je te le met quand meme au cas ou il y aurait des cell contigues dans un/des areas tu pourrais ainsi observe la coquille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'methode boucle areas peut etre problematique si il il y a un/des areas multicell(contigues)exemple("c20:c21")
    Sub TEST2()
        Dim plage As Range, plage2 As Range, tabl As Variant, i As Long
        With ActiveSheet
            Set plage = .Range("C20:G28")
            Set plage2 = plage.SpecialCells(xlCellTypeConstants)
            ReDim tabl(plage2.Areas.Count)
            For i = 1 To plage2.Areas.Count
                tabl(i - 1) = plage2.Areas(i).Value
            Next
            'Debug.Print Join(tabl, ",")
            .Range("j23").Resize(1, UBound(tabl)) = tabl
        End With
    End Sub
    edit :

    dans la boucle for each cells faire une iteration d'une variable "i" et donner la valeur a la cells ligne22,"i").offset(i)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TEST4()
        Dim plage As Range, plage2 As Range, i As Long
        With ActiveSheet
            Set plage = .Range("C20:G28")
            Set plage2 = plage.SpecialCells(xlCellTypeConstants)
              For Each cel In plage2.Cells
             i = i + 1: Cells(22, "I").Offset(0, i) = cel.Value
              Next
         End With
    End Sub
    bref solution il y a

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    A JA83140 :
    1) je souhaite vraiment que tu t'y mettes sur les bases que je t'ai indiquées (en tenant compte de mon EDIT en ce qui concerne le point 2)
    C'est ainsi, que tu progresseras.
    2) et ce d'autant que le tout se fait en seulement 3 lignes de code vraiment simples y compris si l'on compte dans ces "trois" lignes celles de début (for .. to ...) et de fin (Next) de la boucle à mettre en oeuvre.

    Je compte sur toi pour me montrer que tu souhaites vraiment t'impliquer un peu

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour !

    Juste en s'appuyant sur les simples fonctions de feuille de calculs d'Excel INDEX & SUPPRESPACE
    donc sans SpecialCells et en cinq lignes de code …

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Demo1()
        For R% = 1 To 8
            S$ = S$ & Join(Application.Index([C20:G27].Value, R))
        Next
            [D80:K80].Value = Split(Application.Trim(S))
    End Sub
    ___________________________________________________________________________________________________________

         Merci de cliquer sur en bas à droite de chaque message ayant aidé puis sur pour clore cette discussion …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour Marc,
    Même pas. C'est d'une extrême simplicité pour peu qu'il applique ce que je lui ai indiqué.
    Mais je lui laisse d'abord la main (sinon il ne progressera pas vraiment). Même s'il se trompe (et je corrigerai alors).

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    @marcl joliiiii
    j'y avais pas pensé

    attention tout de meme que le demandeur est selon lui un novice autant commencer par des boucle ou fonction vba simples

    ta methode est simple au premier abords pour un averti mais il faut d'abords maitriser la fonction index (ligne/colonne) sur un range ou variable tableau

    edit: ainsi que faire la différence entre trim de vb et application.trim qui n'ont pas la meme fonction et donc resultat différent je l'avais oublié celle la merci pour le coup d'aiguille

    bien vu en tout cas j'adore le style

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Salut Jacques !

    Comme je n'aime pas SpecialCells et là ne gagnant rien à l'utiliser
    (même nombre de lignes de code mais c'est vrai plus simple à appréhender pour un débutant),
    c'était aussi un peu pour Patrick et puis je n'allais pas donner ta solution …

    Salut & merci Patrick !

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Mais ... même pas besoin (moi non plus) d'utiliser specialcells
    Et surtout : merci de ne pas avoir donné directement la solution (ce sera bien qu'un débutant tente d'abord).

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    perso j'aime bien specialcells pour des petites plages

    comme je l'ai precisé en reéditant mon message Marc bien faire la difrence entre

    machin=trim(" a b c d e f g h ")
    et
    machin= application.trim(" a b c d e f g h ")

    elle font pas la meme chose


  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    C'est pour cela j'ai bien mis en avant « les fonctions de feuille de calculs d'Excel INDEX & SUPPRESPACE » …

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    j'aimerais bien connaitre en tout cas le code de ce caractere present dans toute cellule meme vide ce n'est pas chr(160 )ca c'est sur ni chr(1) je n'ai jamais trouvé
    j'ouvrirais une discussion a ce sujet

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Une cellule AFFICHE une donnée. Elle ne CONTIENT rien.
    Mais cet aspect est ici hors sujet.

  15. #15
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Un grand MERCI à toutes les personnes qui se sont penchées sur mon problème.

    J'ai réussi à obtenir dans vos réponses le résultat souhaité même si je n'ai pas forcement tout compris.

    Encore merci

  16. #16
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Je ne sais pas ce que tu as finalement écrit, mais regarde comme c'était simple.
    Exemple de tes images --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each a In Worksheets("Eval").Range("C20:G27").Cells
      If a.Value <> "" Then Worksheets("Pde_1").Range("D80:X80")(a.Row - 19) = a.Value '--->> je vais "généreusement" jusqu'à X (confortable)
    Next

Discussions similaires

  1. [XL-2016] probleme copier coller si cellule non vide
    Par miklmarch dans le forum Excel
    Réponses: 4
    Dernier message: 11/01/2017, 16h31
  2. [XL-2013] Copier uniquement des cellules non vides sur un autre classeur
    Par tonyfrost dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/06/2014, 22h54
  3. Réponses: 17
    Dernier message: 27/02/2014, 21h29
  4. Réponses: 81
    Dernier message: 16/09/2013, 14h48
  5. [XL-2007] copier/coller des cellules vers une première ligne vide
    Par aminee1666 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/06/2011, 23h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo