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 :

Selection des cellules non vides


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juillet 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2018
    Messages : 12
    Par défaut Selection des cellules non vides
    Bonjour,
    Je souhaiterais sélectionner une plage de cellule non vide (de A3/A4 à B100 par exemple) pour ensuite la copier a la place exacte que je souhaite (c'est-à-dire en A6), j'ai la macro couper/coller a partir de A3 du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Copie1()
    Worksheets("Feuil1").Activate
    Range("A3:B100").Select
    Selection.Cut
    Range("A6").Offset(0, 0).Select
    ActiveSheet.Paste
    End Sub
    La ligne avec "range" me convient bien car garde l'écart entre les lignes (une ligne vide entre chaque ligne).
    Mon problème c'est qu'une fois sur deux la ligne A3 est vide dans ce cas ma copie commence en A7, (car ma macro copie aussi la ligne A3 qui est vide).
    Si quelqu'un a une solution pour modifier un peu ce code, merci d'avance.

    Cordialement.

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Tcheylan, bonjour le forum,

    La règle d'or en VBA c'est d'éviter autant que possible les Select et autres Activate. Pour pallier à ton problème une petit test devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Copie1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim PL As Range 'déclare la variable PL (PLage)
     
    Set O = Worksheets("Feuil1") 'définit l'onglet O
    'définit la plage PL (selon que A3 est vide ou pas)
    If O.Range("A3") <> "" Then Set PL = O.Range("A3:B100") Else Set PL = O.Range("A4:B100")
    PL.Copy ActiveSheet.Range("A6") 'copie la plage PL et la colle dans la cellule A6 de l'onglet actif
    End Sub

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tout d'abord, une réécriture de ta macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Copie1()
        Worksheets("Feuil1").Activate
        Range("A3:B100").Cut Range("A6")
    End Sub
    Les Select/Selection, dans la plupart des cas, ça ne fait que compliquer le code et ralentir l'exécution.

    Attention aussi : tu dis que tu veux faire une "copie" dans tes explications mais ta macro fait un déplacement (Cut).

    Mon problème c'est qu'une fois sur deux la ligne A3 est vide dans ce cas ma copie commence en A7, (car ma macro copie aussi la ligne A3 qui est vide).
    Je ne suis pas sûr d'avoir compris ton problème.
    Si ce que tu souhaites c'est commencer la copie en A4 si A3 est vide, tu peux faire comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range("A3:B100").Offset(IIf(Range("A3") = "", 1, 0), 0).Cut Range("A6")

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juillet 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2018
    Messages : 12
    Par défaut
    Super, vos deux solutions fonctionnent et je vous remercie, ma macro est enfin fonctionnelle !
    Bonne journée à vous

    Edit: Est-il possible de modifier cette macro pour qu'au lieu de couper/coller, elle coupe/insère en décalant les lignes vers le bas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Copie1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim PL As Range 'déclare la variable PL (PLage)
     
    Set O = Worksheets("DPGF") 'définit l'onglet O
    'définit la plage PL (selon que A3 est vide ou pas)
    If O.Range("A3") <> "" Then Set PL = O.Range("A3:B100") Else Set PL = O.Range("A4:B100")
    If O.Range("A4") <> "" Then Set PL = O.Range("A3:B100") Else Set PL = O.Range("A5:B100")
    If O.Range("A5") <> "" Then Set PL = O.Range("A3:B100") Else Set PL = O.Range("A6:B100")
    PL.Copy Sheets("DPGF_FINAL").Copy("A6") 'copie la plage PL et la colle dans la cellule A6 de l'onglet actif
    Set O = Worksheets("DPGF_FINAL")
    End Sub

  5. #5
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Re,

    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Copie1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim PL As Range 'déclare la variable PL (PLage)
     
    Set O = Worksheets("DPGF") 'définit l'onglet O
    'définit la plage PL (selon que A3 est vide ou pas)
    If O.Range("A3") <> "" Then Set PL = O.Range("A3:B100") Else Set PL = O.Range("A4:B100")
    If O.Range("A4") <> "" Then Set PL = O.Range("A3:B100") Else Set PL = O.Range("A5:B100")
    If O.Range("A5") <> "" Then Set PL = O.Range("A3:B100") Else Set PL = O.Range("A6:B100")
    PL.Cut 'coupe la plage PL
    Sheets("DPGF_FINAL").Range("A6").Insert Shift:=xlDown  'insère la plage PL à partir de la cellule A6 de l'onglet "DPGF_FINAL" 
    'PL.Rows.Delete 'si tu veux supprimer les lignes
    Set O = Worksheets("DPGF_FINAL")
    End Sub

  6. #6
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juillet 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2018
    Messages : 12
    Par défaut
    Super, ca fonctionne.
    Dernière question pour régler un petit détail, tout s'insère bien et au bon endroit et merci pour votre aide, seulement j'ai un range "A3:B100" qui copie aussi les lignes vides en dessous de ma plage de cellule, ce qui crée parfois un gros espace en dessous de mon insertion;
    peut être est-il possible de modifier mon code pour que la macro sélectionne seulement ma plage de cellule, tout en gardant l'espacement entre les lignes ?
    Rappel de ma macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Copie1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim PL As Range 'déclare la variable PL (PLage)
     
    Set O = Worksheets("DPGF") 'définit l'onglet O
    'définit la plage PL (selon que A3 est vide ou pas)
    If O.Range("A3") <> "" Then Set PL = O.Range("A3:B80") Else Set PL = O.Range("A4:B80")
    If O.Range("A4") <> "" Then Set PL = O.Range("A3:B80") Else Set PL = O.Range("A5:B80")
    If O.Range("A5") <> "" Then Set PL = O.Range("A3:B80") Else Set PL = O.Range("A6:B80")
    PL.Copy
    Sheets("DPGF_FINAL").Range("A6").Insert Shift:=xlDown 'copie la plage PL et la colle dans la cellule A6 de l'onglet actif
    Set O = Worksheets("DPGF_FINAL")
    End Sub

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Arf !... Les questions sans fin. J'adore !...

    Essaie ça (si j'ai bien compris) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Copie1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim LD As Integer 'déclare la variable LD (Ligne Début)
    Dim LF As Integer 'déclare la variable LF (Ligne Fin)
    Dim P As Range 'déclare la variable PL (PLage)
     
    Set O = Worksheets("DPGF") 'définit l'onglet O
    LD = O.Range("A1").End(xlDown).Row + 1 'définit la ligne du début LD
    LF = O.Cells(Application.Rows.Count, "A").End(xlUp).Row + 1 'définit la ligne de fin LF
    Set LD = O.Range(O.Cells(LD, 1), O.Cells(LF, 2)) 'définit la plage PL
    PL.Copy 'copy la plage PL
    Sheets("DPGF_FINAL").Range("A6").Insert Shift:=xlDown 'insere la plage pL à partir de cellule A6 de l'onglet "DPGF_FINAL"
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2002] Concatener des cellules non vides pour faire liste d'envoi mail
    Par tchoutchou69 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 25/11/2011, 10h38
  2. [XL-2007] copie d'une selection de cellules non vides
    Par gabi75 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/06/2010, 15h49
  3. [XL-2003] action sur des cellules non vides
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/05/2009, 15h33
  4. Somme des cellules non vides en VBA
    Par baldg dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/03/2008, 00h44
  5. Selection des cellules non verrouillées
    Par stounouslous dans le forum Excel
    Réponses: 2
    Dernier message: 01/03/2008, 18h23

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