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 :

test avant d'entrer dans une boucle For each cell in selection


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut test avant d'entrer dans une boucle For each cell in selection
    Bonjour,

    je sollicite votre aide, car je bloque sur un petit problème.
    j'ai fait pas mal de recherche sans succès, je suis débutant.

    je souhaiterais fait un test avant d'entré dans la boucle For each in selection
    si l'utilisateur sélectionne la colonne entière ou la feuille entière alors, je ne rentre pas dans la boucle et je fait un msgbox "trop de cellules sélectionnées".

    voici mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub tousmajuscules_Click()
    Dim cell As Range
    For Each cell In Selection
    cell = UCase(cell)
    Next cell
    End Sub

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu peux tester Selection : Si tu as ":" alors c'est une plage de cellules

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if instr(Selection.address,":")<> 0 then 'c'est pas bon...
    ou bien compter le nombre cellules dans la sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Selection.cells.count > 1 then 'pas bon non plus

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    merci ouskel'n'or

    j'ai opté pour ta second proposition, comptage de lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub tousmajuscules_Click()
    Dim cell As Range
     
    If Selection.rows.Count < 65535 Then
    For Each cell In Selection
    cell = UCase(cell)
    Next cell
    Else: MsgBox "trop de cellules sélectionnées"
    End If
    End Sub
    j'estime que si l'utilisateur a choisi la colonne entière si il y a 65536 ligne (excel 2003), dans ce cas la boucle risque de durée un certain temps donc je ne la lance pas.

    l'idéal serais de faire un Ucase() que sur les cellules qui contiennent des données dans la Selection.

    j'ai essayé Selection = Ucase(Selection), mais ça me donne une erreur de type

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pour ton info, ucase n'a aucune relation proche ou lointaine avec ce que tu veux obtenir
    Citation Envoyé par L'aide en ligne à Ucase
    Renvoie une valeur de type Variant (String) contenant la chaîne indiquée, convertie en majuscules.
    Pour ton pb, et selon la sélection,
    - tu veux récupérer les cellules renseignées d'une ligne ou d'une colonne.
    - tu veux récupérer de la première ligne renseignée à la dernière sans t'occuper de la sélection (hormis la colonne) ou seulement la plage sélectionnée s'il ne s'agit que de quelques cellules ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Pour ton pb, et selon la sélection,
    - tu veux récupérer les cellules renseignées d'une ligne ou d'une colonne.
    - tu veux récupérer de la première ligne renseignée à la dernière sans t'occuper de la sélection (hormis la colonne) ou seulement la plage sélectionnée s'il ne s'agit que de quelques cellules ?
    - seulement la plage sélectionnée en fait.
    Parfois certain utilisateurs ont tendance a sélectionné toute une ou plusieurs colonnes entière, alors qu'ils n'ont que quelques lignes remplies, ce qui fait que la boucle risque de durée un long moment pour rien, d'ou mon test.

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ok. lis bien ce que j'ai mis en remarque, ça explique les trois options possibles et donc le pourquoi du "Else"
    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
    Sub Test()
    Dim Plage As Range, Deb As String, Derlig As String, cell As Range
        'Si la sélection couvre plusieurs colonnes, on sort.
        If Split(Selection.Address, "$")(1) <> Split(Selection.Address, "$")(3) then exit sub
        If Selection.Cells.Count > 1 Then
            Deb = Split(Selection.Address, ":")(0) 'adresse du début de colonne ou de sélection.
            Derlig = Split(Selection.Address, "$")(4) 'Dernière ligne de la plage ou de la colonne
            'Ici on a trois possibilités :
            '1 - Derlig > à la dernière ligne renseignée de la colonne :
            '   La colonne entière a été sélectionnée => On prend la dernière ligne renseignée à la place de DerLig
            '2 - Derlig < à la dernière ligne renseignée de la colonne :
            '   La totalité des cellules renseignées de la colonne n'est pas sélectionnée => On garde Derlig
            '3 - dernière ligne renseignée de la colonne = Dernière ligne sélectionnée dans la colonne
            If ActiveCell.SpecialCells(xlCellTypeLastCell).Row < Derlig Then
                    Set Plage = Range(Deb & ":" & Split(ActiveCell.Address, "$")(1) & ActiveCell.SpecialCells(xlCellTypeLastCell).Row)
                Else
                    Set Plage = Range(Deb & ":" & Split(ActiveCell.Address, "$")(1) & Derlig)
            End If
            For Each cell In Plage
                MsgBox cell
            Next
           else
            'la sélection ne couvre qu'une cellule
        End If
    End Sub
    Si une chose t'échappe, tu demandes

    PS - Tu as une explication sur l'utilisation de split ici

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    ça m'a l'air excellent, je teste ce script dès que possible.
    merci

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Je viens de voir un pb : Si une seule cellule est sélectionnée, la première ligne de code provoque une erreur (Split(...)(3) => L'indice n'existe pas)
    Donc, il est nécessaire de modifier l'entrée dans la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        If selection.Cells.Count = 1 then exit sub
        If Split(Selection.Address, "$")(1) <> Split(Selection.Address, "$")(3)then exit sub
        Deb = Split(Selection.Address, ":")(0) 'adresse du début de colonne ou de sélection.
        '... la suite du code (penser à supprimer le endif)
    Les deux conditions doivent être indépendantes et dans cet ordre.
    Le If suivant et le Else qu'il contient étant devenus inutiles.

Discussions similaires

  1. Utilisation de condition dans une boucle for-each
    Par siro1 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/03/2012, 17h07
  2. Réponses: 0
    Dernier message: 02/11/2011, 15h41
  3. [XL-2003] Faire un somme dans une boucle for each
    Par tools dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/01/2011, 08h36
  4. ligne d'unecellule dans une boucle "for each"
    Par JohnNC115 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/01/2011, 14h03
  5. comment effacer un element dans un collection dans une boucle for each
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/10/2008, 12h48

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