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 :

je perds la sélection des lignes après une insertion [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2020
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Janvier 2020
    Messages : 129
    Par défaut je perds la sélection des lignes après une insertion
    Bonjour à tous,

    J'ai ce petit code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub intégration_prix()
    Dim prixcpt, lignecpt As Integer
    prixcpt = Range("e3").Value
    lignecpt = Range("d3").Value
     
    Rows("7:12").Select
        Selection.Copy
        Sheets("Nomenclature").Select
        Rows(lignecpt + 1).Select
        Selection.Insert Shift:=xlDown
        Selection.EntireRow.Hidden = True
     
    Cells(lignecpt, 6) = prixcpt
     
    End Sub
    J'ai fait la partie copie/insertion de ligne via l'enregistreur de macro. Juste modifié pour définir la ligne d'insertion avec ma variable 'lignecpt'.
    En théorie, je copie 6 lignes dans ma feuille active, je les insère et je les masque toutes. Ce sont les actions que j'ai faites lors de l'enregistrement et qui ont données le résultat escompté.
    Mais quand je lance la macro...seule la 1ère des 6 lignes insérées est masquée !

    Si je refait la manip manuellement, ça marche très bien ; les 6 lignes sont masquées.

    Je comprends que seule la 1ère ligne reste sélectionnée au moment où la macro masque la sélection. Mais pourquoi?
    That's the question...
    Merci de votre aide
    Benoit

  2. #2
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Bonjour Benoit,

    Evite les .Select autant que possible, cela engendre souvent des erreurs. J'en ai fait les frais au début de mon projet.

    Voici la méthode Range.Copy, base-toi sur celle-ci pour connaître la syntaxe. Tu n'auras plus besoin des .Select logiquement
    https://docs.microsoft.com/fr-fr/off...cel.range.copy

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Benoît, Bonjour rêver,

    Sur mon poste de travail, les objets restent les mêmes. Heureusement.

    Quoi qu'il en soit, ce type de code est à proscrure
    Je confirme la emarque de rêver.
    Qui plus est, j'ajouterais
    - La variable prixcpt est ici déclarée, à tort, en Variant
    - Il convient de bien attacher les objets Range à leur feuille parent, en utilisant, pour ce faire, le bloc With

    Plus généralement, l'enregistreur peut être utile à 2 conditions
    1 - bien intégrer les méthodes et les propriétés qu'il reporte
    2 - l'épurer autant que possible en
    2 a - supprimant les Select de tout poil et en rattachant les objets
    2 b - conservant seulement les lignes qui ne sont pas celles par défaut. Pour en prendre conscience, il suffit d'utiliser l'enregistreur pour une mise en page puis constater le code reporté.

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub intégration_prix()
    Dim prixcpt As Long, lignecpt As Long
    Dim WS_Source As Worksheet, WS_Dest As Worksheet
     
    prixcpt = Range("E3").Value
    lignecpt = Range("D3").Value
     
    Set WS_Source = ActiveSheet
    Set WS_Dest = Worksheets("Nomenclature")
     
    WS_Source.Rows("7:12").Copy
    WS_Dest.Rows(lignecpt + 1).Insert Shift:=xlDown
    WS_Dest.Cells(lignecpt + 1, 1).Resize(6, 1).EntireRow.Hidden = True
    WS_Dest.Cells(lignecpt, 6) = prixcpt
     
    End Sub

  5. #5
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Maintenant que j'y pense... Pourquoi stockes-tu un numéro de ligne dans une cellule ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2020
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Janvier 2020
    Messages : 129
    Par défaut
    Merci à vous 3 pour vos retours.
    Pb résolu et je serais encore un peu moins débutant en VBA ce soir !

    Je stocke un N° de ligne dans une cellule car une précédente macro vient me la ranger là. Dans ma feuille "nomenclature", j'ai toute une liste de composants dont je doit calculer le prix.
    Pour l'instant, j'ébauche un principe de fonctionnement pour présenter aux utilisateurs. Je ferait sans doute différent ensuite.

    Bonne fin de journée
    Benoit

  7. #7
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Ce numéro de ligne en question, correspond-il au numéro de la ligne sur le tableur ? Si tel est le cas, tu n'en as absolument pas besoin

    Autrement, nous ne parlons pas des mêmes "lignes"

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2020
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Janvier 2020
    Messages : 129
    Par défaut
    oui, il s'agit du n° de ligne du tableur.

    Mon process :
    dans l'onglet "nomenclature", je sélectionne un composant (donc une ligne), je lance une macro qui, entre autre, m'emmène dans un autre onglet.
    dans celui ci, je fait de calculs pour définir le prix
    je lance la macro qui est le sujet de cette discussion

    Pour savoir où insérer, dans "nomenclature", les lignes copier , j'ai besoin de connaitre le N° de ligne où j'étais au départ.
    J'ai trouver cette astuce de copier l'info dans une cellule.

    Mais sans doute y' a t'il mieux à faire? Peut être une variable qui soit utilisable dans 2 macro/sub/module différentes ?

    Je suis preneur de quelques pistes, merci

  9. #9
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Bonjour Benoit,

    "Pour connaître le numéro de ligne où j'étais au départ" - Par rapport à ton tableau où tu colles les données ?

    Si tel est le cas, je te conseillerai de nommer ton tableau de collage :

    "t_paste" - pour l'exemple

    et ton tableau de copie :

    "t_copy"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    Private Sub Collage()
    Dim WbT As ThisWorkbook
    Dim WbO As Worksheet
    'WbO -> Feuille de Collage
    Dim WbC As Worksheet
    'WbC -> Feuille de copie
    Dim t1 As ListObject, t2 As ListObject
    Dim lrDest As ListRow
    'Ligne de Destination
    Dim lrSource As ListRow
    'Ligne d'Origine
    Dim ChoixLC As Integer
    Set WbO = WbT.Sheets(1)
    Set WbC = WbT.Sheets(2)
    'Tu es libre de choisir la feuille que tu veux je te rassure ^^
    Set t1 = WbO.ListObjects("t_paste")
    Set t2 = WbO.ListObjects("t_copy")
     
     
     
    lrSource = t2.DataBodyRange.Row(ChoixLC)
    'ChoixLC -> Choix Ligne Copie
    Set lrDest = t1.DataBodyRange.ListRow.Add 
     
    lrSource.Range.Copy lrDest.Range
    End Sub
    Si tu veux plus d'explications, je peux t'en fournir.

    Sinon je te passe le lien d'où j'ai tiré les informations pour copier/coller d'un TS à un autre :
    Copier/Coller d'un TS à un autre

    Et pour la méthode Range.Copy
    https://docs.microsoft.com/fr-fr/off...cel.range.copy

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

Discussions similaires

  1. [AC-2010] Sélection des données d'une ligne d'une liste déroulante
    Par ptitga dans le forum Access
    Réponses: 6
    Dernier message: 22/09/2014, 08h04
  2. Réponses: 0
    Dernier message: 18/07/2010, 14h41
  3. Boucler pour effacer des lignes dans une listbox à sélection multiple
    Par simond1 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/08/2008, 22h25
  4. Sélection des lignes de feuille Excel avec une listbox
    Par wlofab dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/07/2008, 15h35
  5. Ordre de sélection des lignes sur une table DB2
    Par Pierre Formosa dans le forum DB2
    Réponses: 1
    Dernier message: 26/04/2006, 20h03

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