Macro demande selection de plage de donne- vb

Résolu
Bonjour, je galere un peu aujourd hui pour une macro,
je voudrais savoir comment creer une boite de dialogue sous excel qui demande de selectioner une plage de donnee avec la souris ou sans

le but etant de l incorporer dans un autre macro que j ai devloppe avec deja beaucoup d aide lol de tableau dynamique.

donc en gros par exemple il faudrait que cela me demande de selectionner la plage de cellule correspondante
a chaque etape...

voila le lien du fichier pour l exemple http://www.cijoint.fr/cjlink.php?file=cj200910/cijIAh4jgm.xls

et voila le code de ma macro pour ceux qui ont la flemme

Sub essai()
Columns("M:V").Clear

Range("K1") = Range("F1")
With Range("K2")
.FormulaR1C1 = "=RC[-5]"
.AutoFill Destination:=Range("K2:K5829")
End With
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Sheet1!R1C10:R5829C11").CreatePivotTable TableDestination:= _
"'[ccm.xls]Sheet1'!R2C13", TableName:= _
"Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:= _
"Employee Name", ColumnFields:="Price"
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Price")
.Orientation = xlDataField
.Caption = "Nombre de Price"
.Function = xlCount
End With
ActiveWorkbook.ShowPivotTableFieldList = True
ActiveWorkbook.ShowPivotTableFieldList = False
Columns("K:K").ClearContents

ccm.xls: mettre le nom du fichier réel

merciiii
Configuration: Windows XP Internet Explorer 7.0

25 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

La demande porte sur une boîte de dialogue VBA Excel permettant de sélectionner une plage de données avec la souris, afin d’intégrer cette saisie dans une macro générant un tableau croisé dynamique. Des codes proposent d’utiliser Application.InputBox avec Type:=8 pour que l’utilisateur choisisse une plage continue, puis d’afficher ou d’utiliser l’adresse de la plage dans la macro. En cas de plages non contiguës, des exemples permettent d’utiliser Union pour combiner des zones sélectionnées, ou d’adapter les sélections sur plusieurs colonnes, tout en conservant l’intégration dans la macro. Plusieurs solutions fournissent des variantes selon que l’on sélectionne une plage unique, des plages disjointes ou des colonnes spécifiques, facilitant l’intégration dans des TCD et la réutilisation du code.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,
    Voici des codes pour la sélection de plages de données avec VBA Excel :
    Sources : https://apprendreexcel.com/

    Sub SelectionPlageAvecSouris()
    Dim Plage As Range
    Set Plage = Application.InputBox("Sélectionnez une plage !", "Sélection de cellules", Type:=8)
    MsgBox ("La plage que vous avez séléctionnez est : " & Plage.Address)
    End Sub

    Sub SelectionDiscontinue()
    Dim Z1, Z2, MaPlageMultiZone As Range
    Worksheets("Feuil1").Select
    Range("A1").Select
    ActiveCell.End(xlDown).Select
    Zone1 = ActiveCell.Address
    Selection.Offset(0, 2).Select
    Zone2 = ActiveCell.Address
    Set Z1 = Range("A1", Zone1)
    Set Z2 = Range("C1", Zone2)
    Set MaPlageMultiZone = Union(Z1, Z2)
    ZoneSelection = MaPlageMultiZone.Select
    End Sub

    Sub SelectionDeuxColonnesNonContigues()
    ' Soit les colonnes A (1) et D (4) à sélectionner
    NCol1 = 1
    NCol2 = 4
    Union(Cells(1, NCol1), Cells(1, NCol2)).EntireColumn.Select
    End Sub

    Je pense que là tu disposes de tous les outils pour terminer ta macro.
    Bon courage
    1. je reviens vers vous parce que j ai un probleme

      alors pour le moment j en suis la (je mettrai une meilleur explication dans les box apres)

      je ne met pas end sub car mon prob est juste apres

      Sub essai()
      Dim Plage As Range
      Dim Range1
      Dim Range2
      Set Plage = Application.InputBox("Sélectionnez une plage !", "Sélection de cellules", Type:=8)
      MsgBox ("La plage que vous avez séléctionnez est : " & Plage.Address)
      Plage.Clear

      Set Range1 = Application.InputBox("Sélectionnez le titre de la premiere variable !", "Sélection de cellules", Type:=8)
      MsgBox ("La plage que vous avez séléctionnez est : " & Plage.Address)
      Set Range2 = Application.InputBox("Sélectionnez la premiere colonne qui touche le tableau !", "Sélection de cellules", Type:=8)
      MsgBox ("La plage que vous avez séléctionnez est : " & Plage.Address)
      Range1 = Range2

      End Sub

      et je n arrive pas a adapter ces deux ligne
      With Range("K2")
      .FormulaR1C1 = "=RC[-5]"

      une idee ?

      ps : au debut je pensais mettre les trois codes en debut de macro et les appeler au besoin mais je ne sais pas faire
      1. Modérateur
        Je ne comprends rien de rien à ta question... Que vient faire ici :
        With Range("K2")
        .FormulaR1C1 = "=RC[-5]"
        End With
        Ce bout de code dit simplement que dans K2 il doit inscrire la formule =F2........
        Pas de rapport avec la choucoute!!
    2. j'ai deux question
      tout d'abord à quoi sert de faire deux inputbox si ensuite tu dit range 1=range 2 ??
      ensuite , peut etre qu'il faut un end with après un with (ainsi qu'un décalage )
      with range("K2")
      .formulaR1C1 = "=RC[-5]
      end with
      1. le but et de creer un tableau dynamique, moi je sais changer les parametre de la macro via l editeur mais pour mes collegues ... du coup j essaye
        ben parce que en range1 il y a un titre normalement vu qu il s agit de liste par exemple prix et en range2 il copie juste ke titre..... c est vrai que je peux faire plus simple tien

        le probleme est la

        With Range("K2")
        .FormulaR1C1 = "=RC[-5]"
        .AutoFill Destination:=Range("K2:K5829")
        End With

        ps: j essaye d adapter ma macro du premier message
        1. j'ai copier la fonction
          With Range("K2")
          .FormulasR1C1 = "=Range("K2:K5829")
          .AutoFill Destination:=Range("K2:K5829")
          End With
          et cela fonctionne parfaitement dans les cases K2 à K5829 il copie la valeur des cases F2 à F5829
          1. oui moi aussi mais le but c est de demande a l utilisateur de choisir vu que aucun tableau n a les mm proportion, etiquette etc

            la macro en elle mm fonctione pafaitement bien mais pour le tableau que j ai joint en exemple
            1. Modérateur
              Salut,
              Sans te mentir, j'ai eu une lueur d'inspiration en me lavant les dents ce matin... Tu vois je pense à toi!!
              En fait, tu copies dans la colonne K les données qui vont te servir à composer ton TCD? Donc tu voudrais que l'utilisateur choisisse une colonne ("I" par exemple) et que en K on y retrouve : en K1 le titre et en dessous de K2 à K40000 les valeurs contenues dans la colonne choisie par l'utilisateur. Est ce bien cela ou faut il que je retourne me laver les dents?
          2. lol en te brossant les dents... je commence a avoir un peu peur la

            c est presque ca, en fait je veux aussi choisir la clolone ous ont copie les connees qui vont servir a composerr le tableau vu que la colone k peut etre utiliste par un tableau de donnee....du coup ici k = range1,

            tu peux arreter de te laver les dents et commencer la fil dentaire....
            1. Modérateur
              la colonne ou sont copiées les données qui vont servir a composer le tableau : Tu veux dire par là la première colonne vide à droite de ta base de données?
          3. me suis mal exprime pardon "c'est presque ca, en fait je veux aussi faire choisir la colone ou sont copie les donnees qui vont servir a composer le TDC vu que la colone k peut etre utiliste"

            mais oui c'est ca, car "il faut que les colonnes-sources du TCD soient jointives (on peut faire autrement mais...) " (cf michel_m)

            dsl pour les accents et autres, clavier qwerty, je suis en ecosse la lol
            1. Modérateur
              Bon voici un petit code construit avec l'aide de https://apprendreexcel.com/
              Il permet de sélectionner les colonnes sources et destinations (F et K dans ton exemple)
              Sub essai()
              Dim Num_col As Integer, Num_col2 As Integer, diff As Integer
              'déclare les variables correspondantes au numéros des colonnes que l'on sélectionne
              Set Range1 = Application.InputBox("Sélectionnez le titre de la premiere variable !", "Sélection de cellules", Type:=8)
              Num_col = Range1.Column
              'on stocke ici le numéro de la colonne sélectionnée
              Set Range2 = Application.InputBox("Sélectionnez la premiere colonne qui touche le tableau !", "Sélection de cellules", Type:=8)
              Num_col2 = Range2.Column
              diff = -(Num_col2 - Num_col) 'ici on fait la différence des numéros de colonne pour inscrire ce résultat dans la formule plus bas Formula RC "diff"
              Lettre_col = Left(Range2.Address(0, 0), (Range2.Column < 27) + 2)
              With Range(Lettre_col & "2")
              .FormulaR1C1 = "=RC[" & diff & "]"
              .AutoFill Destination:=Range(Lettre_col & "2 :" & Lettre_col & "5829")
              End With
              End Sub

              Si tu as besoin de plus d'infos n'hésite pas.
              1. j avoue qu en fait la je commence a etre perdu en fait

                en fait au depart je voulais creer un truc qui assiste pour faire des tdc en demandant de choisir a chaque etape les champs necessaire peu importe la grandeur des donnes (nbrs de lignes)

                pour en revenir, ca bug, j ai une idee d ou ca vient mais aucune idee comment faire, j ai mis les elements qui posent probleme en gras (je pense demqnder a l utilisateur de choisir ) vu que se sont des variables indefinis et que c est a l utilisateur de les specifier

                et j ai souligne un parametre que j arrive pas a virer a savoir le nom du fichier ccm.xls qu il faut remplacer par le nom du fichier qu on utilise c possible que la macro le fasse seule ???

                Sub essai()
                Dim Num_col As Integer, Num_col2 As Integer, diff As Integer
                'déclare les variables correspondantes au numéros des colonnes que l'on sélectionne

                Set Range1 = Application.InputBox("Sélectionnez le titre de la premiere variable !", "Sélection de cellules", Type:=8)
                Num_col = Range1.Column
                'on stocke ici le numéro de la colonne sélectionnée

                Set Range2 = Application.InputBox("Sélectionnez la premiere colonne qui touche le tableau !", "Sélection de cellules", Type:=8)
                Num_col2 = Range2.Column
                diff = -(Num_col2 - Num_col) 'ici on fait la différence des numéros de colonne pour inscrire ce résultat dans la formule plus bas Formula RC "diff"
                Lettre_col = Left(Range2.Address(0, 0), (Range2.Column < 27) + 2)
                With Range(Lettre_col & "2")
                .FormulaR1C1 = "=RC[" & diff & "]"
                .AutoFill Destination:=Range(Lettre_col & "2 :" & Lettre_col & "10 000")

                End With

                ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
                "Sheet1!R1C10:R5829C11").CreatePivotTable TableDestination:= _
                "'[ccm.xls]Sheet1'!R2C13", TableName:= _
                "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
                ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:= _
                "Employee Name", ColumnFields:="Price"
                With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Price")
                .Orientation = xlDataField
                .Caption = "Nombre de Price" ----------------- ici je pense mettre ColumnFields a la palce
                .Function = xlCount
                End With
                ActiveWorkbook.ShowPivotTableFieldList = True
                ActiveWorkbook.ShowPivotTableFieldList = False
                Columns("K:K").ClearContents-------------------ici je pense mettre Range2 a la place de K:K

                End Sub
                1. pou l'enregistrement de ton fichier :
                  ActiveWorkbook.SaveAs Filename:= ThePath & TheFile

                  (tu peut préciser d'autre parametres pour la fonction SaveAs comme un mot de passe ...)
                  où ThePath est le chemin du répertoire cible (" c:\windows.....\")
                  et TheFile le nom de ton fichier que tu veut ex ("ccm.xls")

                  après pour les paramètres qui posent problème j'ai pas d'idée
                  1. ok je vais chercher un peu plus faire des test melanger les adn et me brosser les dents sait on jamais lol ? et des que j ai un bout de soluce je passe par ici

                    merci
                    1. Modérateur
                      Arrrghhhhh!!! Je déteste les TCD!!!

                      Voici pour toi un code fonctionnel :

                      Sub essai()
                      Dim Num_col As Integer, Num_col2 As Integer, Num_col3 As Integer, diff As Integer
                      'déclare les variables correspondantes au numéros des colonnes que l'on sélectionne

                      Set Range1 = Application.InputBox("Sélectionnez le titre de la premiere variable !", "Sélection de cellules", Type:=8)
                      Num_col = Range1.Column
                      'on stocke ici le numéro de la colonne sélectionnée
                      Set Range2 = Application.InputBox("Sélectionnez la premiere colonne qui touche le tableau !", "Sélection de cellules", Type:=8)
                      Num_col2 = Range2.Column
                      diff = -(Num_col2 - Num_col) 'ici on fait la différence des numéros de colonne pour inscrire ce résultat dans la formule plus bas Formula RC "diff"
                      Lettre_col = Left(Range2.Address(0, 0), (Range2.Column < 27) + 2)
                      With Range(Lettre_col & "1")
                      .FormulaR1C1 = "=RC[" & diff & "]"
                      .AutoFill Destination:=Range(Lettre_col & "1 :" & Lettre_col & "10000")
                      End With
                      Num_col3 = Num_col2 - 1
                      ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
                      "Sheet1!R1C" & Num_col3 & ":R5829C" & Num_col2).CreatePivotTable TableDestination:="Sheet1!R2C13", TableName:="Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
                      ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:="Employee Name", ColumnFields:=Range1
                      With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields(CStr(Range1))
                      .Orientation = xlDataField
                      .Function = xlCount
                      End With
                      ActiveWorkbook.ShowPivotTableFieldList = True
                      ActiveWorkbook.ShowPivotTableFieldList = False
                      Columns(Lettre_col).ClearContents
                      End Sub

                      Reste à faire une macro effaçant les TCD au fur et à mesure de l'utilisation.......
                      1. merci a vous deux ca avamce grave on touche presque au but.
                        Pikaju tu m as vachement avancer maintenant je vais essayer que rowfirels soit choisis par l utilisateur en gras

                        ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
                        "Sheet1!R1C" & Num_col3 & ":R5829C" & Num_col2).CreatePivotTable TableDestination:="Sheet1!R2C13", TableName:="Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
                        ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:="Employee Name", ColumnFields:=Range1
                        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields(CStr(Range1))
                        .Orientation = xlDataField
                        .Function = xlCount
                        End With
                        ActiveWorkbook.ShowPivotTableFieldList = True
                        ActiveWorkbook.ShowPivotTableFieldList = False
                        Columns(Lettre_col).ClearContents
                        End Sub

                        et j ai une erreur a cette ligne
                        ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:="Employee Name", ColumnFields:=Range1

                        mais je sais pas pourquoi
                        1. Modérateur
                          je vais essayer que rowfirels soit choisis par l utilisateur Ah ben non!!!
                          On a fait en sorte que l'utilisateur choisisse une colonne, que cette colonne soit collée en K (par exemple) pour pouvoir faire un TCD avec J. Je pensais que "Employee Name" faisait obligatoirement partie du TCD...
                          Tu veux donc que l'utilisateur choisisse 2 colonnes de données et que celles ci se "collent" à la droite de ta base pour réaliser un TCD à partir de ces 2 colonnes? C'est bien ça cette fois?

                          et j ai une erreur a cette ligne
                          ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:="Employee Name", ColumnFields:=Range1
                          Peut être n'as tu pas effacé un précédent TCD...
                      2. c est exactement ca, en fait comme j ai des feuilles de donnee differente a chaque fois avec plus ou moins de colone je voulais automatiser la macro et pour que les autres puissent l utiliser qu il demande a chaque etape quoi utiliser

                        et je ne pense pas pour l erreur, car je test a chaque fois sur un nouveau fichier
                        1. Modérateur
                          Essaye ceci :

                          Sub essai()
                          Dim Num_col As Integer, Num_col2 As Integer, Num_col3 As Integer, Num_col4 As Integer, diff As Integer
                          Set Range1 = Application.InputBox("Sélectionnez le titre de la premiere variable !", "Sélection de cellules", Type:=8)
                          Set Range3 = Application.InputBox("Sélectionnez le titre de la deuxième variable !", "Sélection de cellules", Type:=8)
                          Num_col = Range1.Column
                          Set Range2 = Application.InputBox("Sélectionnez la premiere colonne qui touche le tableau !", "Sélection de cellules", Type:=8)
                          Num_col2 = Range2.Column
                          diff = -(Num_col2 - Num_col)
                          Lettre_col = Left(Range2.Address(0, 0), (Range2.Column < 27) + 2)
                          With Range(Lettre_col & "1")
                          .FormulaR1C1 = "=RC[" & diff & "]"
                          .AutoFill Destination:=Range(Lettre_col & "1 :" & Lettre_col & "10000")
                          End With

                          Num_col3 = Range3.Column
                          diff = -((Num_col2 + 1) - Num_col3)
                          Lettre_col = Left(Range2.Offset(0, 1).Address(0, 0), (Range2.Offset(0, 1).Column < 27) + 2)
                          With Range(Lettre_col & "1")
                          .FormulaR1C1 = "=RC[" & diff & "]"
                          .AutoFill Destination:=Range(Lettre_col & "1 :" & Lettre_col & "10000")
                          End With
                          Num_col3 = Num_col2 + 1
                          Num_col4 = Num_col3 + 2
                          ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
                          "Sheet1!R1C" & Num_col2 & ":R5829C" & Num_col3).CreatePivotTable TableDestination:="Sheet1!R2C" & Num_col4, TableName:="Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
                          ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:=Range3, ColumnFields:=Range1
                          With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields(CStr(Range1))
                          .Orientation = xlDataField
                          .Function = xlCount
                          End With
                          ActiveWorkbook.ShowPivotTableFieldList = True
                          ActiveWorkbook.ShowPivotTableFieldList = False
                          Columns(Lettre_col).ClearContents
                          Lettre_col = Range2.Column
                          Columns(Lettre_col).ClearContents
                          End Sub

                          Ca fonctionne parfaitement :
                          1ère boite de dial : sélection 1ère source de données
                          2ème boite de dial : sélection 2ème source de données
                          3ème boite de dial : sélection de la 1ère colonne à droite du tableau
                          et pif paf pouf...
                      3. c est parfait pijapija t es le meilleur dompteur de macro lol

                        une derniere chose ici "Sheet1!R1C" & Num_col2 & ":R5829C" & Num_col3).CreatePivotTable je peux mettre une fonction pour selectionner la plage ou pas ?
                        1. toujour le meme principe il suffit de crée un variable , de lui affecter inputbox un peut comme avec le range 1
                          num_ligne=inputbox...
                          num_ligne=num_ligne.row '(je suis pas sur de ca mais ca devrai le faire pour la fonction row)

                          ensuite tu remplace le 5829C par num_ligne
                          ex :"Sheet1!R1C" & Num_col2 & ":R" & num_ligne & "C" & Num_col3).CreatePivotTable
                          1. salut a tous dsl du retard mais j ai plus internet a la maison
                            je rectifie mon code et vous le soumet pour d eventuelle correction
                            merci a tous
                            1. coucou c est encore moi

                              alors voila ce que j ai fait mais ca ne marche pas , ca ne creait pas le tableau ou je veux
                              Sub essai()

                              Dim Num_col As Integer, Num_col2 As Integer, Num_col3 As Integer, Num_col4 As Integer, diff As Integer
                              Set Range1 = Application.InputBox("Sélectionnez le titre de la premiere variable !", "Sélection de cellules", Type:=8)
                              Set Range3 = Application.InputBox("Sélectionnez le titre de la deuxième variable !", "Sélection de cellules", Type:=8)
                              Num_col = Range1.Column
                              Set Range2 = Application.InputBox("Sélectionnez la premiere colonne qui touche le tableau !", "Sélection de cellules", Type:=8)
                              Num_col2 = Range2.Column
                              diff = -(Num_col2 - Num_col)
                              Lettre_col = Left(Range2.Address(0, 0), (Range2.Column < 27) + 2)
                              Set Num_ligne = Application.InputBox("Sélectionnez eau !", "Sélection de cellules", Type:=8)
                              Num_ligne = Num_ligne.Row
                              With Range(Lettre_col & "1")
                              .FormulaR1C1 = "=RC[" & diff & "]"
                              .AutoFill Destination:=Range(Lettre_col & "1 :" & Lettre_col & "10000")
                              End With

                              Num_col3 = Range3.Column
                              diff = -((Num_col2 + 1) - Num_col3)
                              Lettre_col = Left(Range2.Offset(0, 1).Address(0, 0), (Range2.Offset(0, 1).Column < 27) + 2)
                              With Range(Lettre_col & "1")
                              .FormulaR1C1 = "=RC[" & diff & "]"
                              .AutoFill Destination:=Range(Lettre_col & "1 :" & Lettre_col & "10000")
                              End With
                              Num_col3 = Num_col2 + 1
                              Num_col4 = Num_col3 + 2
                              ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
                              "Sheet1!R1C" & Num_col2 & ":R" & Num_ligne & "C" & Num_col3).CreatePivotTable TableDestination:="Sheet1!R2C" & Num_col4, TableName:="Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
                              ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:=Range3, ColumnFields:=Range1
                              With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields(CStr(Range1))
                              .Orientation = xlDataField
                              .Function = xlCount
                              End With
                              ActiveWorkbook.ShowPivotTableFieldList = True
                              ActiveWorkbook.ShowPivotTableFieldList = False
                              Columns(Lettre_col).ClearContents
                              Lettre_col = Range2.Column
                              Columns(Lettre_col).ClearContents
                              End Sub

                              une iodee quelqu un
                              • 1
                              • 2