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 :

Sélectionner plusieurs cellules sans utiliser Range [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 81
    Points : 36
    Points
    36
    Par défaut Sélectionner plusieurs cellules sans utiliser Range
    Bonjour, j'ai une petite question.

    Je souhaiterai sélectionner plusieurs cellules pour les trier. Normalement, j'utiliserai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Columns("A26:D40").Select
    pour sélectionner les cellules que je souhaite trier. Mais ici, étant donné que j’ai une tableau avec une taille variable dans lequel je viens de rajouter une dernière ligne (avec un indice i issue d’une boucle For qui correspond à la dernière ligne), je ne sais pas trop comment faire. Je suppose qu’on ne peut pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Columns("A26:Di").Select
    Voilà mon problème et n’étant qu’un novice mes connaissances sont assez limitées. Auriez-vous une idée ?

    Rafalemirage

  2. #2
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour rafalemirage le forum essai comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Macro4()
    Dim i As Variant
    i = Range("a65536").End(xlUp).Row
    Range(Cells(26, 1), Cells(i, 4)).Select
    End Sub
    ps le code donne est brute pour selectionner une plage
    autrement il faudrait savoir ce que tu veux faire excatement pour cree une boucle
    SALUTATIONS

  3. #3
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Bonjour,

    Bonne réponse

    Mais petit ajout, n'utilise pas les Select et Selection (seulement acceptable dans de rares cas)
    Pour ton code, au lieu d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range(Cells(26, 1), Cells(i, 4)).Select
    Selection.Short '.....
    Utilises directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(26, 1), Cells(i, 4)).Short '....
    Beaucoup plus rapide, efficace, moins lourd, ....

  4. #4
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    re salut drakkar_agfa daccord avec toi c'est du brute de chez brute !! a+
    SALUTATIONS

  5. #5
    Membre éprouvé
    Avatar de ouisansdoute
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    931
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 931
    Points : 1 079
    Points
    1 079
    Par défaut
    Bonjour tout le monde,

    Si on le peut effectivement pas écrire
    Il me semble qu'on peut écrire

  6. #6
    Membre confirmé Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Points : 638
    Points
    638
    Par défaut
    Oui,

    ça fonctionne tout aussi bien!

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Bonjour et merci pour vos réponses. J'ai essayé d'intégrer vos différents morceaux de code dans mon projet mais j'arrive pas à le faire fonctionner.
    j'ai le code suivant :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Private Sub CommandButton2_Click()
     
    Dim i As Integer
    Dim Counter As Integer
     
    i = 0
     
        For Counter = 26 To 10000 ' Cette boucle cherche la première ligne vide dans la première
            i = i + 1            ' colonne.
                If Worksheets("002-Découverture").Cells(Counter, 1) = "" And Test(Counter) = False And Worksheets("Saisie").Range("datedecouverture") <> "" Then
     
     
    ' Mes données sont copiers d'une feuille vers une autre                
     
                    Exit For
                ElseIf Test(Counter) = True Then
                                                            ' Si le numero du tir existe déjà, on affiche un message
                                                            'd'alerte.
                    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
                        Msg = "Une entrée comportant les mêmes informations existe déjà. Souhaitez-vous écraser les donnés?"    ' Définit le message.
                        Style = vbYesNo + vbCritical + vbDefaultButton2    ' Définit les boutons.
                        Title = "Attention "    ' Définit le titre.
                        Help = "DEMO.HLP"    ' Définit le fichier d'aide.
                        Ctxt = 1000    ' Définit le contexte de
                                       ' la rubrique.
                                       ' Affiche le message.
                        Response = MsgBox(Msg, Style, Title, Help, Ctxt)
     
                            If Response = vbYes Then    ' L'utilisateur a choisi Oui.
     
                                     ' Mes données sont copiers d'une feuille vers une autre   
     
                                Exit For
     
                            Else    ' L'utilisateur a choisi Non.
                                Exit For        ' Effectue une action.
                            End If
                ElseIf Worksheets("Saisie").Range("datedecouverture") = "" Then
                    Dim Reponse As Integer
                    Reponse = MsgBox("Il manque la date !", vbInformation + vbOK + vbDefaultButton1, "Attention")
                Else
                End If
        Next Counter
                   Sheets("002-Découverture").Range(Cells(26, 1), Cells(Counter, 13)).Selection '.Sort Key1:=Range("A26")
                   Selection.Sort Key1:=Range("A26")
     
     
    End Sub
    Le problème, c'est que lorsque je fais fonctionner le code en pas à pas, dès qu'il arrive au niveau du

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("002-Découverture").Range(Cells(26, 1), Cells(Counter, 13)).Selection '.Sort Key1:=Range("A26")
    Il me met le message d'erreur '1004' : Erreur définie par l'application ou par l'objet. Et ce même avec les autres solutions, je ne comprend pas pourquoi. Auriez-vous une idée d'ou cela pourrait provenir ?

    Merci

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Bien que les.select ne soit pas souvent nécessaire, c'est quelque fois obligatoire,
    Si ce n'est pas la feuille Sheets("002-Découverture")... qui est active il faut passer par un select.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("002-Découverture").Select
    Range(Cells(26, 1), Cells(Counter, 13)).Select
    Mais aussi... remplace Selection par... Select, ça ira déja mieux
    Et..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           If Response = vbYes Then    ' L'utilisateur a choisi Oui.
               ' Mes données sont copiers d'une feuille vers une autre   
                 Exit For
           Else    ' L'utilisateur a choisi Non.
                 Exit For        ' Effectue une action.
           End If
    peut être plus simplement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         If Response = vbYes Then    ' L'utilisateur a choisi Oui.
               ' Mes données sont copiers d'une feuille vers une autre   
           End If
           Exit For
    A+

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Bonjour, merci pour ta réponse. C'est vrai que déjà, si on évite de faire des fautes de syntaxe ca ira déjà mieux. J'ai modifié mon code comme ceci mais ca me donne la même erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             Sheets("002-Découverture").Select
            Range(Cells(26, 1), Cells(Counter, 13)).Select
            Selection.Sort Key1:=Range("A26")
    Aurai-je oublié autre chose ?

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           Range(Cells(26, 1), Cells(Counter, 13)).Sort Key1:=Range("A26")
    Mais je ne vois pas d'erreur ? si plante encore regarde à combien est counter .

  11. #11
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par LeForestier Voir le message
    essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           Range(Cells(26, 1), Cells(Counter, 13)).Sort Key1:=Range("A26")
    Je dirais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("002-Découverture")
      Range(.Cells(26, 1), .Cells(Counter, 13)).Sort Key1:=.Range("A26")
    End With
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Merci AlainTech et LeForestier, j'ai essayé avec vos deux solutions mais j'ai toujours le même message d'erreur :

    erreur '1004' : Erreur définie par l'application ou par l'objet

    Honnêtement je vois pas du tout comment faire.
    Est-ce que le problème pourrai venir du fait que la colonne A contient des dates ?

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par LeForestier Voir le message
    si plante encore regarde à combien est counter .
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Mon Counter est égale à 27 lorsque je fais tourner mon programme pas à pas.

  15. #15
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Où as-tu écrit ton code?

    Si tu l'as mis dans le code d'une feuille, déplace-le dans un module standard.

    Petit plus: un code propre pour trouver la dernière ligne de la colonne A et faire le tri.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Tri()
      Dim rSort As Range
      With Sheets("002-Découverture")
        Set rSort = Range(.Cells(26, 1), .Cells(Rows.Count, 1).End(xlUp).Offset(0, 12))
        rSort.Sort Key1:=.Cells(26, 1)
      End With
    End Sub
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Bonjour à tous, merci AlainTech pour ta réponse.

    Mon code est dans une feuille. J'ai un code qui permet d'enregistrer les données d'une feuille de "Saisie" vers une feuille de données "002-Découverture". Ce que je souhaite faire, c'est qu'une fois que les données ont été rentrées dans la feuille de données, trier ces données par date.

    Suite à ta réponse, j'ai une petite question, est-ce que si je met mon code dans un module standard, je pourrai toujours l'utiliser depuis mon code de ma feuille en question ?

  17. #17
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Suite à ta réponse, j'ai une petite question, est-ce que si je met mon code dans un module standard, je pourrai toujours l'utiliser depuis mon code de ma feuille en question ?
    Oui, les procèdures peuvent être appelée depuis le code de la feuille qui ne sert normalement (arrêtez moi sinon) qu'a gérer les contrôles et les évenements spécifiques à cette feuille.

    Dans un module standard on peut accéder à la feuille avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("NomdelaFeuille"). '...

  18. #18
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Re,
    J'ai du reprendre ta macros et l'indenté de façon logique pour enfin comprendre le pourquoi du comment parce que j'ai tester la fonction sort sur des dates et ça fonctionne correctement à une petite modification prèt.
    Dans le code de ton bouton tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton2_Click()
        FaitCopie
    End Sub
    Et dans un module général, par exemple Module1, tu met le code ci dessous.
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub FaitCopie()
    Dim i As Integer
    Dim rSort As Range
    Dim Counter As Integer
    Dim Msg, Style, Title, Help, Ctxt, MyString
    Dim Reponse As Integer
     
        For Counter = 26 To 10000 ' Cette boucle cherche la première ligne vide dans la première
            i = i + 1            ' colonne.
            If Worksheets("002-Découverture").Cells(Counter, 1) = "" And Test(Counter) = False And Worksheets("Saisie").Range("datedecouverture") <> "" Then
            ' Mes données sont copiers d'une feuille vers une autre
               ' Exit For TON ERREUR EST ICI
            ElseIf Test(Counter) = True Then
            ' Si le numero du tir existe déjà, on affiche un message d'alerte.
                Msg = "Une entrée comportant les mêmes informations existe déjà. Souhaitez-vous écraser les donnés?"    ' Définit le message.
                Style = vbYesNo + vbCritical + vbDefaultButton2    ' Définit les boutons.
                Title = "Attention "    ' Définit le titre.
                Help = "DEMO.HLP"    ' Définit le fichier d'aide.
                Ctxt = 1000    ' Définit le contexte de la rubrique.
                Response = MsgBox(Msg, Style, Title, Help, Ctxt) ' Affiche le message.
                If Response = vbYes Then    ' L'utilisateur a choisi Oui.
                    ' Mes données sont copiers d'une feuille vers une autre
                End If
                'Exit For TON ERREUR EST ICI
            ElseIf Worksheets("Saisie").Range("datedecouverture") = "" Then
                Reponse = MsgBox("Il manque la date !", vbInformation + vbOK + vbDefaultButton1, "Attention")
        'ICI manque probablement quelque chose ???
            End If
        Next Counter
    'Ici le code de AlainTech avec une petite modif.. 
    'suite à la relecture de l'aide.
    'Sinon, erreur
        With Sheets("002-Découverture")
            Set rSort = Range(.Cells(26, 1), .Cells(Rows.Count, 1).End(xlUp).Offset(0, 12))
        rSort.Select
        Selection.Sort Key1:=.Cells(26, 1)
    End Sub
    Petits conseils..
    1°) A l'emplacement où tu copie les données dans une autre feuille fait plutôt appel à une autre sub/Fonction, ça permet de mieux suivre le déroulement et de plus tu ne doit l'écrire qu'une seule fois à la place de deux.
    2°) Tâche d'écrire le code en l'indentant d'une façon logique et ne pas mettre un tas de ligne vide entre, plus tu a du code en vision directe, mieux tu le suit des yeux.
    3°) Assigne tes variables en début de procédure, ça évite de les dimentionner 2 fois, ce qui était le cas pour Reponse. Et c'est plus lisible.
    Je pense que comme ça, ça va fonctionner.
    A+

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Merci LeForestier et aalex_38,

    J'ai essayé le code que tu m'as donné et il marche parfaitement. Merci pour tes conseilles, je tacherai de m'en souvenir

    J'ai une dernière question, pourquoi le fait de le mettre dans un module général résoud le problème ?

  20. #20
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Ce n'est pas spécialement en mettant le code dans un module que le problème est résolu mais en supprimant les Exit For et en mettant les dim une seule fois.
    Mais quand ont travail sur plusieurs feuilles quelque fois excel se plante si ont met le code dans un module de feuille, c'est plus prudent alors de le mettre dans un module général.
    A+

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/05/2010, 19h03
  2. Réponses: 6
    Dernier message: 11/03/2009, 12h43
  3. Réponses: 3
    Dernier message: 02/09/2008, 18h13
  4. Sélectionner plusieurs cellules d'un DBGrid
    Par chill667 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 23/11/2005, 11h43
  5. [CR8.5]lancer plusieurs impressions sans utiliser l'ocx
    Par sboober dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/05/2005, 10h08

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