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 :

[VBA-E]Selection dynamique avec souris de plages de cellules


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut [VBA-E]Selection dynamique
    quand je fait un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim plage1 As Range
     
    Set plage1 = Application.InputBox(prompt:="Selectionnez la plage à transposer ", Type:=8)
    comment savoir directement, dans quelle feuille de quel classeur se trouve la plage que j'ai selectionné ??

    j'ai essayé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim CL1 As Workbook
    Dim Fl1 As Worksheet
    Set CL1 = ActiveWorkbook
    Set Fl1 = CL1.ActiveSheet
    mais ca ne me donne pas ce que je cherche

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    Tu peux utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Plage1 As Range
     
    Set Plage1 = Application.InputBox(prompt:="Selectionnez la plage ", Type:=8)
     
    MsgBox Plage1.Parent.Name
    MsgBox Plage1.Parent.Parent.Name

    michel

  3. #3
    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
    Déjà un truc : Est-ce bien ainsi que tu as instancié tes objets ?
    Dim CL1 As Workbook
    Dim CL2 As Workbook
    Dim Fl1 As Worksheet
    Dim Fl2 As Worksheet
    Set Fl1 = plage1.Parent.Parent
    Set Fl1 = plage2.Parent.Parent
    Set Fl1 = plage1.Parent
    Set Fl2 = plage2.Parent
    Parce que les Set Fl1 pour 3 objets différents, c'est le dernier qui a le dessus
    Déjà, si tu corrigeais ça
    A+

  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
    Tu n'as plus le message d'erreur ?

  5. #5
    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
    C'est bien ce qu'il me semblait. Je n'ai pas testé pour rien et le résultat est bien ce qu'il me semblait. La seule adresse que tu peux obtenir en réussissant à faire ce que tu "as l'air" de vouloir obtenir (!!!) c'est l'adresse de la celule, non l'adresse complète Book.Feuille.range
    Mes tests ?
    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
    Sub Parent()
    Dim Plage1 As Range
    Dim Plage2 As Range
    Dim CL1 As Workbook
    Dim CL2 As Workbook
    Dim Fl1 As Worksheet
    Dim Fl2 As Worksheet
    Set Plage1 = Application.InputBox(prompt:="Selectionnez la plage ", Type:=8)
     
    Set Fl1 = Plage1.Parent
    Set CL1 = Fl1.Parent
    'Set CL2 = Plage2.Parent.Parent
    'Set Fl2 = Plage2.Parent
    j = 12
    i = 11
    'MsgBox Plage1.Address
    'MsgBox Fl1.Name
    'MsgBox CL1.Name
    MsgBox Workbooks(CL1.Name).Worksheets(Fl1.Name).Cells(j, i).Address
    End Sub
    Tu vas devoir réviser ta syntaxe pour obtenir
    ='[D:\Les docs\LeFichier.xls]LaFeuille'!LeRange
    Là, je vais voir s'il reste quelque chose à manger
    A+

  6. #6
    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
    L'utilisation de RefEdit serait tellement plus simple...

    Trop simple?
    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!

  7. #7
    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
    Hello Alain, peut-on utiliser RefEdit ailleurs que dans un userform ? Tu aurais un exemple ?
    A+

  8. #8
    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
    Je n'ai jamais cherché à le faire mais...

    Où est le problème de créer une petite Form pour remplacer l'InputBox?
    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!

  9. #9
    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
    Citation Envoyé par AlainTech
    Je n'ai jamais cherché à le faire mais...

    Où est le problème de créer une petite Form pour remplacer l'InputBox?
    La sélection manuelle des cellules.

  10. #10
    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 ouskel'n'or
    La sélection manuelle des cellules.
    Ben, justement, RefEdit sert à ça!
    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!

  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
    Par contre, je viens de voir une limitation.

    Si on peut bien sélectionner ce qu'on veut dans le classeur actif, il n'est pas possible d'accéder aux menus et, donc, de changer de classeur.

    Maintenant, si on fait une ouverture/activation du classeur dans lequel on veut sélectionner une plage avant de faire la sélection, ça devrait résoudre le problème.
    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
    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
    J'ai regardé ton code de plus près... Ce que tu veux faire, c'est transposer tes données d'un classeur sur l'autre... Alors il y a beaucoup plus simple
    Colle des données sur une feuille toute neuve d'un classeur tout neuf comportant deux feuilles (ou +) et teste ça. Si c'est ce que tu veux obtenir, tu dis, on adaptera pour deux classeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Transposer()
    i = 5
    j = 12
     
        Range(Cells(1, 1), Cells(i, j)).Copy
        Sheets("Feuil2").Range("K1").PasteSpecial Paste:=xlPasteAll, _
            Transpose:=True
    End Sub
    Tu dis
    A+

    Edit
    Pour lancer la macro, place-toi sur la feuil1

  13. #13
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    C'est pas la meme discussion ici :

    http://www.developpez.net/forums/sho...d.php?t=324794

    Ou j'avais fourni peut etre une mini-solution ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  14. #14
    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
    J'ai l'impression que c'est une simple transposition des données. Le pb avec ta solution, elle n'inverse pas les lignes et les colonnes. Enfin, si geeksideofme passe par là, on saura tout

  15. #15
    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
    Bref, tu peux faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TransposerSurDeuxClasseursDifférents()
    Dim Plage1 As Range
    Dim Plage2 As Range
    Dim Fl1 As Worksheet
    Dim Fl2 As Worksheet
        Set Fl1 = Workbooks("Classeur1").Worksheets("Feuil1")
        Set Fl2 = Workbooks("Classeur2").Worksheets("Feuil1")
        Fl1.Activate
        Set Plage1 = Fl1.Application.InputBox(prompt:="Selectionnez la plage ", Type:=8)
        Fl2.Activate
        Set Plage2 = Fl2.Application.InputBox(prompt:="Selectionnez la cellule", Type:=8)
        Plage1.Copy
        Plage2.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, Transpose:=True
    End Sub
    Si ça ne donne pas le résultat que tu souhaites, tu dis
    NB - Pour la plage où tu colles, tu peux ne choisir que la cellule en haut et à gauche de la plage

  16. #16
    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
    Tiens, ton pb m'intéressait et pour me faire pardonner d'avoir mal lu ta question, je t'ai fait ça. Sans doute peut-on simplifier le code mais je te laisserai le soin de le faire. Pour la compréhension, je pense que ce sera plus aisé ainsi (?)
    Option Explicit
    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
    49
    50
    51
    52
    53
    54
    55
    56
    Sub CopierCollerDunClasseurDansLautre()
    Dim Plage1 As Range
    Dim Plage2 As Range
    Dim CL1 As Workbook
    Dim CL2 As Workbook
    Dim Fl1 As Worksheet
    Dim Fl2 As Worksheet
    Dim Tableau, NoCol(), NoLig()
    Dim LigDep1, ColDep1, LigDep2, ColDep2, i
    Dim Cel As Range
        Set CL1 = Workbooks("Classeur1")
        Set CL2 = Workbooks("Classeur2") 'Tu remplaces par la ligne suivante
        'Set CL2 = Workbooks.Open("D:\xls\TonFichier.xls")
        DoEvents
        Set Fl1 = CL1.Worksheets("Feuil1")
        Set Fl2 = CL2.Worksheets("Feuil2")
        Fl1.Activate
        Set Plage1 = Fl1.Application.InputBox(Prompt:="Selectionnez la plage ", Type:=8)
     
        'Pour récupérer les NoLigne et colonne de début de plage, on crée un tableau
        'qui sépare les adresses de début et de fin de plage
        '(ex : "$B$12:$N$25" -> "$B$12")
        Tableau = Split(Plage1.Address, ":")
        LigDep1 = Range(Tableau(0)).Row 'ligne de départ de la plage ds Fl1
        ColDep1 = Range(Tableau(0)).Column 'Column de départ de la plage
     
        'Création des tableaux des adresses de la plage sélectionnée dans Fl1
        'Pour relever les adresses des cellules de Fl1, on s'affranchit de
        'la colonne et de la ligne de départ
        i = 0
        For Each Cel In Plage1
            ReDim Preserve NoCol(i)
            NoCol(i) = Cel.Column - ColDep1 'Tableau des colonnes dans Fl1
            ReDim Preserve NoLig(i)
            NoLig(i) = Cel.Row - LigDep1 'Tableau des lignes
            i = i + 1
        Next
     
        Fl2.Activate
        Do 'on vérifie qu'une seule cellule a été sélectionnée
            Set Plage2 = Application.InputBox(Prompt:="Selectionnez la plage ", Type:=8)
            If InStr(Plage2.Address, ":") > 0 Then msgox "Ne sélectionner qu'une cellule"
        Loop While InStr(Plage2.Address, ":") = 0
     
        'Dans Fl2, CL2, on récupère les No de colonne et de ligne de début de plage
        LigDep2 = Plage2.Row 'Ligne de départ ds Fl2
        ColDep2 = Plage2.Column 'Colonne de départ
     
        'Collage des données : pour copier, on lit chaque cellule de Plage1
        'Pour coller, on part d'une cellule Plage2.address
        i = 0
        For Each Cel In Plage1
            Fl2.Cells(NoCol(i) + LigDep2, NoLig(i) + ColDep2).FormulaLocal = "='[" & CL1.Name & "]" & Fl1.Name & "'!" & Cel.Address
            i = i + 1
        Next
    End Sub
    J'espère que ce n'était pas un simple exercice, sinon je m'en voudrais
    A+

    NB - Pour le fichier que tu ouvres, tu peux le passer en paramètre
    Tu peux de même passer les deux fichiers si ta macro se trouve dans un troisième...

  17. #17
    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 les classeurs, si tu en changes, tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Cl1 = activeWorkbook 'au sortir de l'input
    idem pour le 2
    Quant à la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set fl1 = Cl1.activeSheet 'au même endroit mais après ^^^

  18. #18
    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
    Citation Envoyé par Tu
    au fait, est ce qu'il y a un InputBox à plusieurs champs de saisie?
    Je corrige ici aussi. Faut toujours vérifier s'con dit. On peut parfaitement saisir plusieurs plages en même temps, sur la même feuille de calculs -> Sélection de la première plage -> Ctrl appuyé -> Sélection de la seconde plage -> Ctrl appuyé -> Sélection de la plage suivante... hétsétéras. A partir de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Fl1.Activate
        Set Plage1 = Fl1.Application.InputBox(Prompt:="Selectionnez la plage ", Type:=8)
        nbreDePlages = Plage1.Areas.Count
        msgbox nbreDePlages 
        TableauDesPlages = Split(Plage1.Address, ",")
        For i = 0 To UBound(TableauDesPlages)
            MsgBox TableauDesPlages(i)
        Next
    L'est vrai que je ne l'ai jamais utilisé.
    Je corrige mon post précédent pour cacher mon erreur

Discussions similaires

  1. Select dynamique avec execute immediate
    Par BOLARD dans le forum SQL
    Réponses: 7
    Dernier message: 03/06/2008, 16h41
  2. Réponses: 6
    Dernier message: 04/08/2007, 14h17
  3. [VBA-E] Selection dynamique avec la sourie de plages de cellules Excel
    Par geeksideofme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/04/2007, 11h20
  4. [Delphi7]Selection TTreeView avec souris
    Par Soulama dans le forum Delphi
    Réponses: 11
    Dernier message: 25/04/2007, 13h46
  5. [VBA-E] bouton dynamique avec fonction
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 38
    Dernier message: 06/02/2006, 12h43

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