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 :

nombre de ligne d'une sélection multiple [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut nombre de ligne d'une sélection multiple
    Bonjour à tous,
    Je cherche à compter le nombre de ligne de ma sélection.
    Cette sélection peut être des cellules/lignes/colonnes contiguës ou non contiguës (càd sélectionnées avec ctrl)

    Avec le code ci dessous (sel as range) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each sel In Selection
    x = x + sel.Rows.Count
    Next sel
    J'obtient bien un nb de ligne, mais il ajoute une ligne au total pour chaque cellule de la sélection. Si je sélectionne une ligne complète, le résultat est 18384.
    Pour la sélection d'une ligne complète, j'attends x=1
    Pour 3 lignes (contiguës ou non), j'attends x=3
    pour 2 cellules sélectionnées sur 2 lignes différentes, j'attends x=2
    etc...

    Comment puis-je code ça?
    Merci d'avance
    Benoit

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 665
    Points : 5 803
    Points
    5 803
    Par défaut
    Bonjour,

    une proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim r As Long, c As Long, cel as range
    For Each cel In Selection.Cells
    If Not cel.Row = r Then c = c + 1
    r = cel.Row
    Next cel
    MsgBox c
    edit: le code de Mehnir est bien meilleur

  3. #3
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x = Intersect(Selection.EntireRow, Columns(1)).Cells.Count

  4. #4
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut
    Que de choix !
    Merci Messieurs, les 2 codes fonctionnent impec.
    Je comprends comment fonctionne celui de Halaster, mais pas bien celui de Menhir.

    Pour que je me couche moins ignare, pourrais de m'expliquer stp?

    Bonne fin de journée à tous
    Benoit

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 665
    Points : 5 803
    Points
    5 803
    Par défaut
    Citation Envoyé par BenoitL77 Voir le message
    Pour que je me couche moins ignare, pourrais de m'expliquer stp?
    selection.entirerow selectionne les lignes complètes de tout ce que tu as sélectionné
    Intersect permet de garder uniquement ce qui appartient au deux range qu'on lui passe en paramètre
    Donc ici toutes tes lignes et la colonne 1, il te reste donc la première cellule de chaque ligne et tu en compte le nombre

  6. #6
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Utiliser EntireRow a deux avantages : d'abord ça fusionne les cas de cellules sur une même ligne, ensuite on est sûr que pour chaque ligne il y aura la colonne 1.
    Du coup, il suffit de faire l'intersection avec la colonne 1 pour avoir une cellule par ligne.
    Il ne reste plus alors qu'à compter les cellules restantes pour connaitre le nombre de lignes.

  7. #7
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut
    Merci pour ces explication.
    Mais...j'ai crié victoire trop tôt.
    J'ai opté pour la version Menhir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim x As Integer
    x = Intersect(Selection.EntireRow, Columns(1)).Cells.Count 'compte les lignes de la sélection, même si sélection multiple
    Quand j'ouvre mon fichier, j'ai message d'erreur N°91, la variable Object ou la variable de bloc with non définie.
    Sur la ligne 3.
    J'arrête la macro via débugage et une fois ça passé, ça marche impec.

    Pourquoi ce plantage à l'ouverture?
    J'ai essayé d’enregistrer le fichier avec des sélections différentes pour voir (une cellule, une ligne...) ça n'a pas d'influence

    Merci

  8. #8
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut
    je viens de voir que si j'enregistrais mon fichier en étant sur une autre feuille que la feuil2, je n'avais pas de pb à l'ouverture.
    ça ne règle pas le pb, mais vous apportera peut être une info pour trouver la solution...

  9. #9
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut
    Bonjour

    J'ai finalement ajouter un "on error" pour passer le cap du bug à l'ouverture.
    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    Dim x As Integer
    On Error Resume Next
    x = Intersect(Selection.EntireRow, Columns(1)).Cells.Count 'compte les lignes de la sélection, même si sélection multiple
    'MsgBox x
     
    If Target.Address = Target.EntireRow.Address And x = 1 Then 'Si sélection d'une seule ligne complète, car on ne sait pas gérer plusieurs lignes
        ongletsupp = Target.Columns(8)
    Else
    ongletsupp = ""
    End If
    MsgBox ongletsupp & x
     
    End Sub
    ça fonctionne bien, mais ça me fait l'effet d'un pansement sur une jambe de bois.... je ne traite pas la racine du pb.
    Aussi, si vous avez une explication au pb et une correction plus propre, je suis preneur.

    Cordialement
    Benoit

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 943
    Points : 28 942
    Points
    28 942
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai finalement ajouter un "on error" pour passer le cap du bug à l'ouverture.
    ça fonctionne bien, mais ça me fait l'effet d'un pansement sur une jambe de bois....
    Un On Error Resume Next sans avoir une instruction qui suit et qui traite du problème, suivi immédiatement de l'intruction On Error Goto 0 est en effet un cache misère et promet de belles surprises quant aux résultats attendus.

    Je ne sais pas si la cause de l'erreur provient de là mais typer une variable devant compter les lignes en Integer est déjà la certitude d'avoir un jour un problème. Il faut la typer comme un Long

  11. #11
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut
    Bonjour Philippe,
    J'ai donc ajouté un goto 0 pour limiter les "belles surprises"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim x As Long
    On Error Resume Next
    x = Intersect(Selection.EntireRow, Columns(1)).Cells.Count 'compte les lignes de la sélection, même si sélection multiple
    MsgBox x
    On Error GoTo 0
    J'ai typé x en long (ainsi que toutes les autres variables de mon fichier qui traitait des N° de ligne), mais malheureusement ça n'a pas résolut le pb.

    Je viens de faire un test en enregistrant mon fichier en local et non pas sur le réseau.
    Surprise, plus de bug à l'ouverture ! Même sans "On error". Il ne passe même pas dans le code SelectionChange, puisque je n'ai pas le msgbox x.

    Les règles de sécurité de notre réseau font qu'à l'ouverture d'un fichier en provenance du réseau il faut "activer la modification". J'en déduis que c'est cette étape qui génère le bug.
    Comme si il considérait être dans un SelectionChange, (alors qu'il ne l'ai pas en local) mais qu'il ne trouve pas de Sélection.
    Est ce que le "activer la modification" est considéré que un SelectionChange?
    Comment shunter ça?

    Merci d'avance
    Benoit

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 943
    Points : 28 942
    Points
    28 942
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Surprise, plus de bug à l'ouverture ! Même sans "On error". Il ne passe même pas dans le code SelectionChange, puisque je n'ai pas le msgbox x.
    Personnellement, je ne comprends pas la raison pour laquelle la ligne calculant x se mette en erreur et pour le savoir, il est préférable, de ne pas mettre de On Error Resume Next pour analyser la raison de cette erreur.

    Il ne faut pas tirer de conclusion si hâtive car le fait que le message ne s'affiche pas est tout à fait normal si X renvoie une erreur puisqu'il se trouve avant le On Error Goto 0. MsgBox X serait aussi en erreur et donc VBA ira à la ligne suivante.

    Pour être absolument certain que la procédure événementielle Worksheet_SelectionChange, n'intercepte pas la sélection, il faut mettre un point d'arrêt à cette ligne.

  13. #13
    Membre éclairé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 420
    Points : 738
    Points
    738
    Par défaut
    Salut le fil...

    Set c = Intersect(Target, Range("B2")) peut te renvoyer Nothing donc tu dois impérativement faire un test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not c Is Nothing Then ...
    Regardes sur quelle feuille tu démarres dans ton Excel, ceci explique peut-être cela.

    Si tu travailles directement sur les lignes de ta sélection tu as ton résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    Debug.Print Selection.Address
     
        Dim el, x
        For Each el In Selection.Rows
            x = x + el.Rows.Count
        Next
    Debug.Print x
    End Sub

  14. #14
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Valtrase Voir le message
    Set c = Intersect(Target, Range("B2")) peut te renvoyer Nothing donc tu dois impérativement faire un test.
    J'ai du mal à imaginer comment Intersect(Selection.EntireRow, Columns(1)) (intersection d'une ligne et d'une colonne) pourrait renvoyer Nothing.

    A moins que Selection lui-même soit Nothing, qu'il n'y ait pas de feuille (ou classeur) active ou que la feuille active soit un Graph et non une Worksheet.
    Mais j'étais parti sur le postula (peut-être optimiste), que l'opérateur éviterait de se trouver dans un de ces cas au déclenchement de l'instruction.

  15. #15
    Membre éclairé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 420
    Points : 738
    Points
    738
    Par défaut
    Citation Envoyé par Menhir Voir le message
    J'ai du mal à imaginer comment Intersect(Selection.EntireRow, Columns(1)) (intersection d'une ligne et d'une colonne) pourrait renvoyer Nothing.

    A moins que Selection lui-même soit Nothing, qu'il n'y ait pas de feuille (ou classeur) active ou que la feuille active soit un Graph et non une Worksheet.
    Mais j'étais parti sur le postula (peut-être optimiste), que l'opérateur éviterait de se trouver dans un de ces cas au déclenchement de l'instruction.
    Bien vu Menhir, je suis allé trop vite en besogne, nous mettrons cela sur la fatigue

  16. #16
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Au final, comme la procédure qui déclenche ce code est la procédure événementielle SelectionChange(), pourquoi ne pas utiliser Target au lieu de Selection?

  17. #17
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Au final, comme la procédure qui déclenche ce code est la procédure événementielle SelectionChange(), pourquoi ne pas utiliser Target au lieu de Selection?
    Ce serait, en effet, plus que souhaitable.
    Je ne l'ai pas personnellement proposé parce que lorsque j'ai écrit cette ligne de code, nous ne savions pas encore qu'elle se trouvait dans une SelectionChange.

  18. #18
    Membre éclairé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 420
    Points : 738
    Points
    738
    Par défaut
    Salut le fil...
    Je reviens sur le sujet, à l'ouverture du classeur si tu as gardé le code Avec Selection.EntireRow c'est peut-être de là que viens ton erreur si tu n'a pas de sélection

  19. #19
    Membre régulier
    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
    Points : 73
    Points
    73
    Par défaut
    Bonjour Forum
    De retour de grand week-end et je vois que mon sujet a inspiré du monde.
    Merci à vous tous.

    J'ai donc remplacé le Selection par un Target dans Intersect :
    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
     
    Public ongletsupp As String
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim x As Long
    x = Intersect(Target.EntireRow, Columns(1)).Cells.Count 'compte les lignes de la sélection, même si sélection multiple
     
    If Target.Address = Target.EntireRow.Address And x = 1 Then 'Si sélection d'une seule ligne complète, car on ne sait pas gérer plusieurs lignes
        ongletsupp = Target.Columns(8)
    Else
        ongletsupp = ""
    End If
     
    MsgBox ongletsupp & x
    End Sub
    Et je n'ai plus de bug à l'ouverture!

    Par contre, j'en ai trouvé un autre.
    Quand la cellule en colonne H renvoie #REF j'ai le message "erreur 13, incompatibilité de type" au niveau du "target.columns(8)". Dans ce cas, je voudrais que ongletsupp="".
    Comment puis-je faire?
    Merci
    Benoit

  20. #20
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    A tester :
    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
    Public ongletsupp As String
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim x As Long
    x = Intersect(Target.EntireRow, Columns(1)).Cells.Count 'compte les lignes de la sélection, même si sélection multiple
     
    If Target.Address = Target.EntireRow.Address And x = 1 Then 'Si sélection d'une seule ligne complète, car on ne sait pas gérer plusieurs lignes
      If IsError(Target.Columns(8)) Then
        ongletsupp = ""
      Else
        ongletsupp = Target.Columns(8)
      End If 
    Else
        ongletsupp = ""
    End If
     
    MsgBox ongletsupp & x
    End Sub
    Pourquoi ongletsupp est-elle déclarée en "Public"?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/03/2014, 09h15
  2. [C#] Limité le nombre de lignes dans une DataView ...
    Par maitrebn dans le forum Accès aux données
    Réponses: 5
    Dernier message: 07/11/2005, 23h57
  3. nombre de lignes d'une table de ma BD
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 06/07/2005, 10h04
  4. Réponses: 8
    Dernier message: 20/06/2005, 15h10
  5. determination le nombre de ligne d'une table
    Par picoti2 dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/03/2004, 09h25

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