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 :

utiliser la sélection faite à la souris


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Responsable administratif à la pension
    Inscrit en
    Février 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif à la pension

    Informations forums :
    Inscription : Février 2006
    Messages : 73
    Par défaut utiliser la sélection faite à la souris
    Bonjour,

    Je m'essaie au macro excel . Je connais moyenement vba word 2007 .

    J'ai créé une macro sur base d'une sélection faite à la souris pour trier sur base des colonnes A et D.

    Je voudrais automatiser ce texte pour qu'il tienne compte de chaque sélection souris que j'effectue.

    Voici le texte de la macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A9:A14") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("D 9 : D 14") _ (j'ai mis des espaces pour éviter les smileys dans mon message...)
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range("A9:G14")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 46
    Par défaut
    Bonjour,

    Je suis pas sur d'avoir compris la demande donc je vais reformuler ce que j'ai compris:

    Tu souhaites sélectionner une plage, lancer la macro et que le tri s'effectue sur la plage sélectionnée uniquement.

    C'est bien ça? ou je suis complètement à coté?

    Guillaume

  3. #3
    Membre confirmé
    Profil pro
    Responsable administratif à la pension
    Inscrit en
    Février 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif à la pension

    Informations forums :
    Inscription : Février 2006
    Messages : 73
    Par défaut
    C'est exactement cela.

    J'ai une feuille avec des tableaux que j'actualise en rajoutant ou retirant des lignes.

    Le nombre de colonnes reste identique dans tous les tableaux mais le nombre de ligne peut changer. La place du début du sous-tableau varie en fonction des rajouts des sous-tableaux se trouvant au-dessus.

    Merci pour ton aide.

  4. #4
    Membre Expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 475
    Par défaut
    Bonjour

    Essaie ceci

    Je prends d'abord la sélection + traitement

    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
    'Adresse de ta sélection
    adress = Selection.Address(0, 0)
    'Décomposition et recomposition
    deb = Left(Selection.Address(0, 0), InStr(1, Selection.Address(0, 0), ":") - 1)
    fin = Mid(Selection.Address(0, 0), InStr(1, Selection.Address(0, 0), ":") + 1, Len(Selection.Address(0, 0)))
    debcol = Left(deb, 1)
    deblig = Right(deb, 1)
    fincol = Left(fin, 1)
    finlig = Right(fin, 1)
    sel1 = deb & ":" & debcol & finlig
    sel2 = fincol & deblig & ":" & fin
        
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range(sel1), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range(sel2), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range(adress)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 46
    Par défaut
    Ok alors essaye quelque chose comme ca:

    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
     
     
    adresse = Selection.Address(False, False)
     
    debut = Left(Selection.Address(0, 0), InStr(1, adresse, ":") - 1)
    fin = Mid(Selection.Address(0, 0), InStr(1, adresse, ":") + 1, Len(adresse))
    debutColonne = Left(debut, 1)
    debutLigne = Right(debut, 1)
    finColonne = Left(fin, 1)
    finLigne = Right(fin, 1)
    critere1 = "A" & debutLigne & ":A" & finLigne
    critere2 = "A" & debutLigne & ":A" & finLigne
     
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range(critere1), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range(critere2), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
     
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range(adresse)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 46
    Par défaut
    Après test, je me suis rendu compte que QuestVba et moi-même avons fait la même erreur de ne prendre que le dernier chiffre pour les lignes
    De plus la récupération des colonnes est inutile.
    J'ai aussi fait un tri plus propre

    Voila donc un code qui doit fonctionner:
    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
     
    Sub trier()
     
    adresse = Selection.Address(False, False)
    debutLigne = Selection.Row
    fin = Mid(Selection.Address(0, 0), InStr(1, adresse, ":") + 1, Len(adresse))
    finLigne = Range(fin).Row
    critere1 = "A" & debutLigne & ":A" & finLigne
    critere2 = "D" & debutLigne & ":D" & finLigne
     
    Range(adresse).Sort _
            Key1:=Range(critere1), Order1:=xlAscending, _
            Key2:=Range(critere2), Order2:=xlAscending, _
            Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
     
    End Sub

  7. #7
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Et pour continuer à jouer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub trier()
    Dim critere1 As Range, critere2 As Range
    Set critere1 = Selection.Resize(, 1)
    Set critere2 = Selection.Offset(0, Selection.Columns.Count - 1).Resize(, 1)
    Selection.Sort _
            Key1:=critere1, Order1:=xlAscending, _
            Key2:=critere2, Order2:=xlAscending, _
            Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
    Set critere1 = Nothing: Set critere2 = Nothing
    End Sub
    Cordialement.

  8. #8
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Pas besoin, en effet, de lourds traitements de chaînes de caractère pour travailler sur une Selection continue.
    La propriété Selection renvoie un objet Range qui est une plage à part entière, tu peux donc exploiter ses propriétés Range directement par rapport à ton référentiel qui est la plage sélectionnée et non la feuille, ce qui dans le cas d’une plage continue revient à une mini feuille possiblement d’une seule case

    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub gogo()
    With Selection 'valable pour une selection sur une plage continue (une zone) seulement).
        Debug.Print .Range("A1").Row 'renvoie le N° de ligne de la cellule à gauche en haut
        Debug.Print .Range("A1").Column 'renvoie le N° de colonne de la cellule à gauche en haut
        Debug.Print .Cells(.Cells.Count).Row 'renvoie le N° de ligne de la cellule en bas à droite
        Debug.Print .Cells(.Cells.Count).Column 'renvoie le N° de colonne de la cellule en bas à droite
        Debug.Print .Address
        'etc....
    End With
     
    End Sub
    cordialement,

    Didier

  9. #9
    Membre confirmé
    Profil pro
    Responsable administratif à la pension
    Inscrit en
    Février 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif à la pension

    Informations forums :
    Inscription : Février 2006
    Messages : 73
    Par défaut
    Le texte ci-dessous fonctionne. Merci à tous !
    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
     
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        Dim SelecSup, SelecInf, TriA, TriD, TriGlobal
     
        With Selection 'valable pour une selection sur une plage continue (une zone) seulement).
        Debug.Print .Range("A1").Row 'renvoie le N° de ligne de la cellule à gauche en haut
        Debug.Print .Range("A1").Column 'renvoie le N° de colonne de la cellule à gauche en haut
        Debug.Print .Cells(.Cells.Count).Row 'renvoie le N° de ligne de la cellule en bas à droite
        Debug.Print .Cells(.Cells.Count).Column 'renvoie le N° de colonne de la cellule en bas à droite
        Debug.Print .Address
     
     
        SelecSup = Selection.Range("A1").Row
        SelecInf = Selection.Cells(.Cells.Count).Row
     
    TriA = "A" & SelecSup & ":" & "A" & SelecInf
    TriD = "D" & SelecSup & ":" & "D" & SelecInf
    TriGlobal = Selection.Address
     
     
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range(TriA) _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range(TriD) _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range(TriGlobal)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
    End Sub

  10. #10
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Pour soulager ton code quelques remarques :

    ces lignes, que j'avais mises seules qu'à titre d'exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Debug.Print .Range("A1").Row 'renvoie le N° de ligne de la cellule à gauche en haut
        Debug.Print .Range("A1").Column 'renvoie le N° de colonne de la cellule à gauche en haut
        Debug.Print .Cells(.Cells.Count).Row 'renvoie le N° de ligne de la cellule en bas à droite
        Debug.Print .Cells(.Cells.Count).Column 'renvoie le N° de colonne de la cellule en bas à droite
        Debug.Print .Address
    sont inutiles, sauf en phase de débogage éventuel, vois l'aide VBA. Le Debug.Print ne sert qu'à afficher ce qu'on veut dans la fenêtre Exécution de l’éditeur VBE (plus pratique que des msgbox de debogage, mais tout aussi inutile en code final).

    Vois aussi le fonctionnement des blocs With... End With
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With Selection 'valable pour une selection sur une plage continue (une zone) seulement).
        ' .../...
        SelecSup = Selection.Range("A1").Row
        SelecInf = Selection.Cells(.Cells.Count).Row
    Ici les deux mots Selection sont à supprimer du coup

    Tu peux imbriquer les blocs aussi, tu pourrais donc mettre les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Worksheets("Feuil1")
    répétitifs dans un bloc With.. End with


    ça viendra avec l'habitude , tu peux consulter ces excellents Tutos :

    Programmer efficacement avec Excel en VBA http://bidou.developpez.com/tutoriels/ExcelVBA/
    44 pages :

    Support de cours complet pour le VBA d'Excel http://bidou.developpez.com/article/VBA/
    233 pages :

    cordialement,

    Didier

  11. #11
    Membre confirmé
    Profil pro
    Responsable administratif à la pension
    Inscrit en
    Février 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable administratif à la pension

    Informations forums :
    Inscription : Février 2006
    Messages : 73
    Par défaut
    Merci pour tes remarques Ormonth. Tu réponds à une demande "muette" de ma part.

    Pour les Debug.Print, je m'en doutais un peu, ça m'avait l'air d'être redondant...

    Pour le with Selection, distraction de ma part...

    Par contre pour l'imbrication... ? Veux-tu dire que je peux mettre un With sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields
    pour alléger le code ?

    hologram

  12. #12
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    oui, tu l'as d'ailleurs fait en partie dans le #9, il faut seulement faire très attention à ce sur quoi on veut agir en mettant les "." dépendants aux bons endroits.

    Les blocs With te permettent d'invoquer un objet d'une façon "groupée", donc tu reviens au même constat que tes Selection que tu avais conservés la fois précédente.

    cordialement,

    Didier

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

Discussions similaires

  1. Problème d'utilisation de Dll faite maison. . .
    Par _SamSoft_ dans le forum Windows
    Réponses: 27
    Dernier message: 20/02/2007, 14h55
  2. [VB.Net] Comment utiliser une dll faite en VB6 ?
    Par hassanovich dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/06/2006, 14h25
  3. Utiliser la molette de la souris
    Par systemofaxav dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/05/2006, 17h54
  4. Sélection avec la souris hors d'une application
    Par carlg dans le forum API, COM et SDKs
    Réponses: 17
    Dernier message: 08/03/2006, 11h02
  5. Utiliser la roulette de la souris dans un DBLookupComboBox
    Par lagunss dans le forum Composants VCL
    Réponses: 1
    Dernier message: 14/10/2005, 23h35

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