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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    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 : 1975
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
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    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
    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
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  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
    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
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    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
    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
    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, …

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, 17h31
  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, 23h54
  3. Réponses: 17
    Dernier message: 27/02/2014, 22h29
  4. Réponses: 81
    Dernier message: 16/09/2013, 15h48
  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: 01/07/2011, 00h35

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