Macro demande selection de plage de donne- vb

Résolu
manautop Messages postés 152 Statut Membre -  
manautop Messages postés 152 Statut Membre -
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

  • 1
  • 2
  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. manautop Messages postés 152 Statut Membre 3
     
    merciiiiii
    0
  3. manautop Messages postés 152 Statut Membre 3
     
    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
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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!!
      0
  4. pou pouille Messages postés 212 Statut Membre 31
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. manautop Messages postés 152 Statut Membre 3
     
    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
    0
  7. pou pouille Messages postés 212 Statut Membre 31
     
    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
    0
  8. manautop Messages postés 152 Statut Membre 3
     
    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
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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?
      0
  9. manautop Messages postés 152 Statut Membre 3
     
    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....
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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?
      0
  10. manautop Messages postés 152 Statut Membre 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
    0
  11. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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.
    0
  12. manautop Messages postés 152 Statut Membre 3
     
    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
    0
  13. pou pouille Messages postés 212 Statut Membre 31
     
    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
    0
  14. manautop Messages postés 152 Statut Membre 3
     
    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
    0
  15. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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.......
    0
  16. manautop Messages postés 152 Statut Membre 3
     
    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
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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...
      0
  17. manautop Messages postés 152 Statut Membre 3
     
    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
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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...
      0
  18. manautop Messages postés 152 Statut Membre 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 ?
    0
  19. pou pouille Messages postés 212 Statut Membre 31
     
    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
    0
  20. manautop Messages postés 152 Statut Membre 3
     
    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
    0
  21. manautop Messages postés 152 Statut Membre 3
     
    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
    0
  • 1
  • 2