[VBA][Excel]definir la selection dans une macro [resolu]

definir la selection dans une macro [resolu] [VBA][Excel] - VB/VBA/VBS - Programmation

Marsh Posté le 13-01-2004 à 16:46:15    

Salut,
 
Je veux ecrire une macro qui me fera un joli graphe avec des titres, etc. Ca c'est facile, surtotu avec l'enregistreur.
 
Mais mon workbook contient plein de sheets.
 
Comment commencer ma macro pour que la source des donnees soit la selection courante ? (i.e. dans la page courante, quel que soit son nom)
 
Grosso modo, pour le moment j'ai ca :

Code :
  1. Range("B6:F9" ).Select
  2. '    Application.CutCopyMode = False
  3. '    Charts.Add
  4. '    ActiveChart.ChartType = xlColumnClustered
  5. '    ActiveChart.SetSourceData Source:=Sheets("Sheet3" ).Range("B6:F9" ), PlotBy:= _
  6. '        xlRows
  7. '    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet3"


 
je veux que toutes les refs relatives a B6:F9 et Sheet3 deviennent un truc du style CurrentRange et CurrentSheet.
 
Apres, je me debrouillerai. A noter que j'ai a cote de moi Office 97 VB programmer's guide, et que ca n'est mentionne nulle part (et j'ai ausi cherche dans des tutoriaux sur le net, mais j'ai rien trouve...)
 
Merci beaucoup de votre aide.


Message édité par Oliver The Great le 20-01-2004 à 09:51:17

---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 16:46:15   

Reply

Marsh Posté le 13-01-2004 à 17:02:36    

heu, c'est pas directement 'Selection' l'objet que tu cherches ??
 
exemple: je sélectionne une zone de ma feuille,
je lance l'enregistrement de ma macro
j'applique une modif bidon (ici la couleur des cellules)
j'arrete l'enregistrement et j'ai la macro suivante
 

Code :
  1. Sub Macro2()
  2.     With Selection.Interior
  3.         .ColorIndex = 6
  4.         .Pattern = xlSolid
  5.     End With
  6. End Sub


 
c'est ça que tu cherches ?


Message édité par dalcap le 13-01-2004 à 17:03:10
Reply

Marsh Posté le 13-01-2004 à 17:13:30    

Oui, ca serait bon, mais comment on remplace ca dans les refs au milieu des fonctions ? (chart, table, etc.) ?
 
Par exemple, dans
 
ActiveChart.SetSourceData Source:=Sheets("Sheet3" ).Range "B6:F9" ), PlotBy:= _xlRows
 
je remplace alors sheets et range par quoi ?
 
Merci
 


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 17:42:21    

pourrais-tu essayer cela

Code :
  1. ActiveChart.SetSourceData Source:=Selection

??

Reply

Marsh Posté le 13-01-2004 à 17:45:06    

J'ai essaye, ca reste en jaune, il aime pas... :(


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 17:59:36    

ok, ok,
 
ça marcherait si l'on peut donner un nom à ta sélection

Code :
  1. ActiveChart.SetSourceData Source:=Range("Ma_Selection" ), PlotBy _        :=xlColumns


 
on peut donner un nom à une zone dynamiquement ?

Reply

Marsh Posté le 13-01-2004 à 18:05:54    

si je fais un set mySelection = Selection.Interior p-e... je regarde ca.


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 18:07:53    

method "range" of object "_global" failed :(


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 18:08:30    

au fait, ce n'est peut-être pas la seule solution de nommer la sélection, t'imagines si tu exécutes plusieurs fois la macro, il faut qu'à chaque fin de traitement tu détruises (?) le nom de la sélection qui doit être unique dans excel je crois
il ya peut-être un autre moyen...
up :bounce:

Reply

Marsh Posté le 13-01-2004 à 18:10:06    

idem avec Set dans ou hors du With


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 18:10:06   

Reply

Marsh Posté le 13-01-2004 à 18:12:44    

toutes ces infos sont dans un bouquin precis ? Je ne trouve que des machins qui traitent d'objets, de methodes, rien qui parte de la base, ou qui ait une liste des fonctions avec les arguments
 
C'est vraiment du B-a-ba il me semble, mais dur a trouver...


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 18:15:52    

Oliver The Great a écrit :

method "range" of object "_global" failed :(


heu  :??:  
 
voici le code que m'a généré l'enregistreur de macro
j'ai rempli quelques lignes:
1   10
2   20
3   10
4   15
je sélectionne ces 8 cellules, je les nomme 'Ma_Selection', je lance l'enregistreur

Code :
  1. Sub Macro1()
  2. '
  3.     With Selection.Interior
  4.         .ColorIndex = 6
  5.         .Pattern = xlSolid
  6.     End With
  7.     Charts.Add
  8.     ActiveChart.ChartType = xlColumnClustered
  9.     ActiveChart.SetSourceData Source:=Range("Ma_Selection" ), PlotBy _
  10.         :=xlColumns
  11.     ActiveChart.Location Where:=xlLocationAsObject, Name:="Feuil1"
  12.     With ActiveChart
  13.         .HasTitle = False
  14.         .Axes(xlCategory, xlPrimary).HasTitle = False
  15.         .Axes(xlValue, xlPrimary).HasTitle = False
  16.     End With
  17. End Sub


 
ca me fait mon tableau.
 
bon, je suis d'accord que cela ne se réfère plus à la sélection pointée à la souris mais à celle nommée, mais, bon, si l'on peut faire un truc du genre

Code :
  1. ActiveWorkbook.Names.Add Name:="Ma_selection2", RefersToR1C1:= _
  2.         Selection


ca serait pas mal...

Reply

Marsh Posté le 13-01-2004 à 18:20:16    

Oliver The Great a écrit :

toutes ces infos sont dans un bouquin precis ? Je ne trouve que des machins qui traitent d'objets, de methodes, rien qui parte de la base, ou qui ait une liste des fonctions avec les arguments
 
C'est vraiment du B-a-ba il me semble, mais dur a trouver...


 
Heu, je ne sais pas, pour le peu que je me sers d'excel, j'ai commencé par l'enregistreur de macro. je le lance, j'essaye plein de trucs, et je regarde le résultat dans le code...
après on m'avait montrer l'explorateur d'objets, qui peut être lui aussi très pratique pour voir ce que l'on peut faire...
t'as regardé du côté de ActiveCell ? La première chose que je vois c'est

Citation :

Property ActiveCell As Range


si cela peut sélectionner plusieurs cellules, c bon :)

Reply

Marsh Posté le 13-01-2004 à 18:25:41    

ben nommer une plage, c'est pas cool, parce que le but c'est d'utiliser une macro tout simplememt sur une selection (OK, tu pensais p-e a faire 2 subs en meme temps ?)
 
MDR, en mettant ActiveCell au lieu de Selection, ca a plante Excel.exe :D


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 18:25:41    

dsl pour le plantage,  
chez moi, cela a mis le meme message sur global machin...
je pensais nommer la sélection dans la même macro.
en une seule macro je pensais que ct faisable...
mais bon, moi y en a pas etre excel-guru :D
...
d'autres solutions peut-être ?


Message édité par dalcap le 13-01-2004 à 18:27:43
Reply

Marsh Posté le 13-01-2004 à 18:26:56    

Ca l'a plante 2 fois de suite meme... apparememnt il n'aime pas du tout.
 
merci pour ton aide :jap:


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 13-01-2004 à 20:41:21    

Selection.address
peut etre

Reply

Marsh Posté le 13-01-2004 à 21:29:36    

j'ai essaye aussi, ca marche pas non plus. C'est penible :(


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 14-01-2004 à 00:14:00    

Oliver The Great a écrit :

j'ai essaye aussi, ca marche pas non plus. C'est penible :(


 
L'objet que tu cherches à manipuler, c'est pas Selection, mais Selection.Areas(1)
 
Et hop ! Un bout de code qui marche :
 
Sub Macro1()
'
Dim My_Sheet As Object, My_Chart As Object
 
    Set My_Sheet = ActiveSheet
     
    Charts.Add
    Set My_Chart = ActiveChart
     
    My_Chart.ChartType = xlColumnClustered
    My_Sheet.Activate
    My_Chart.SetSourceData Source:=Selection.Areas(1), PlotBy:= _
        xlRows
    My_Chart.Location Where:=xlLocationAsObject, Name:="Feuil1"
 
    Set My_Sheet = Nothing
    Set My_Chart = Nothing
 
End Sub

Reply

Marsh Posté le 14-01-2004 à 00:21:44    

Merci, je teste ca...
 
Ouais, ca a l'air de marcher :bounce:
 
Tu peux m'expliquer le principe stp ? (pkoi ca ne peut pas marcher si tu ne fais pas ca...)
 
En tout cas merci :jap:


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 14-01-2004 à 08:07:23    

Oliver The Great a écrit :

Merci, je teste ca...
 
Ouais, ca a l'air de marcher :bounce:
 
Tu peux m'expliquer le principe stp ? (pkoi ca ne peut pas marcher si tu ne fais pas ca...)
 
En tout cas merci :jap:


 
J'en sais foutrement rien. D'après ce que j'en comprends, Selection ne renvoie pas directement un objet Range. Ca permet manifestement, dans le cas où tu sélectionnes plusieurs plages de cellules (en maintenant Ctrl enfoncé pendant que tu cliques à la souris, par exemple), d'avoir accès à chacune d'entre elles comme un objet en soi. Selection.Areas pointe sur la collection des plages selectionnées, du coup chacune d'entre elles peut être appelée par Selection.Areas(i). Et là i vaut 1, puisque tu n'as qu'une seule plage de cellules dans ta Selection.
 
J'ai le même problème que toi, je suis pas informaticien du tout, et 100% autodidacte du VBA, sauf que ca fait un poil plus longtemps que j'ai commencé à me prendre la tête avec, manifestement... Donc si un informaticien, un vrai, veut se donner la peine de nous faire une explication en bonne et due forme, il est le bienvenu.

Reply

Marsh Posté le 14-01-2004 à 10:37:38    

Il se peut que ca repondre aussi a un pb de tableau que j'avais depuis super longtemps... je regarderai ca plus tard.
 
Je confirmerai dans la journee si ca marche bien dans le cas exact de ce que je veux faire (mais y a pas de raison...)
 
Par contre, ca relance le pb de tutorial VBA, qui est absolument inexistant (en tout cas introuvable). Je pense aussi qu'une liste de fonctions avec la nature de l'argument et la nature de l'output simplifierait la tache, non ? (de meme que des messages d'erreur un peu plus explicites)


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 14-01-2004 à 11:00:54    

Ca marche plus ! :( Ca marchait bien hier sur Excel 2003, mais sur Excel 97 ca marche pas :(
 
Pourtant je fais pareil... :(
 
edit 1: Ouais, je confirme, error 1004 ici alors que ca marche chez moi :cry:
 
edit 2: en fait ca fait le graph (en enlevant My_Chart.Location Where:=xlLocationAsObject), mais ca termine quand meem par une erreur (sasn finir ce que je lui demande avec la serie 3, i.e. un axe secondaire)


Message édité par Oliver The Great le 14-01-2004 à 11:36:48

---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 14-01-2004 à 15:42:18    

Oliver The Great a écrit :

Ca marche plus ! :( Ca marchait bien hier sur Excel 2003, mais sur Excel 97 ca marche pas :(
 
Pourtant je fais pareil... :(
 
edit 1: Ouais, je confirme, error 1004 ici alors que ca marche chez moi :cry:
 
edit 2: en fait ca fait le graph (en enlevant My_Chart.Location Where:=xlLocationAsObject), mais ca termine quand meem par une erreur (sasn finir ce que je lui demande avec la serie 3, i.e. un axe secondaire)


 
Je viens de tester exactement le code que j'ai posté hier soir sur un machine NT4/XL97, ca marche comme chez moi. Tu peux préciser ton histoire d'axe secondaire ? Ou poster le code que tu as en plus ?

Reply

Marsh Posté le 14-01-2004 à 16:20:32    

OK...
 
j'ai un tableau par page, du style


  2002 2003 2004 2005  
m   1   2    3    4
u   5   6    7    8
p   0.1 0.3  0.4  0.8


 
Le code approprie devient :
 

Code :
  1. Sub macro3()
  2. Dim My_Sheet As Object, My_Chart As Object
  3.     Set My_Sheet = ActiveSheet
  4.     Charts.Add
  5.     Set My_Chart = ActiveChart
  6.     My_Chart.ChartType = xlLineMarkers
  7.     My_Sheet.Activate
  8.     My_Chart.SetSourceData Source:=Selection.Areas(1), PlotBy:=xlRows
  9.     With My_Chart
  10.         .HasTitle = True
  11.         .ChartTitle.Characters.Text = "titre a la con"
  12.         .Axes(xlCategory, xlPrimary).HasTitle = True
  13.         .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Year"
  14.         .Axes(xlValue, xlPrimary).HasTitle = True
  15.         .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "unite a la con"
  16.     End With
  17.     My_Chart.HasLegend = True
  18.     My_Chart.Legend.Select
  19.     Selection.Position = xlRight
  20. (a partir d'ici ca n'a pas l'air d'etre execute : la 3e serie n'est pas sur le 2e axe)
  21.     My_Chart.PlotArea.Select
  22.     My_Chart.SeriesCollection(3).Select
  23.     My_Chart.SeriesCollection(3).AxisGroup = 2
  24.     My_Chart.Axes(xlValue, xlSecondary).Select
  25.     With My_Chart.Axes(xlValue, xlSecondary)
  26.         .MinimumScaleIsAuto = True
  27.         .MaximumScale = 1
  28.         .MinorUnitIsAuto = True
  29.         .MajorUnitIsAuto = True
  30.         .Crosses = xlAutomatic
  31.         .ReversePlotOrder = False
  32.         .ScaleType = xlLinear
  33.     End With
  34.     Set My_Sheet = Nothing
  35.     Set My_Chart = Nothing
  36. End Sub


 
Ca me fait le graphe, ca le place sur une feuille independante (la ligne qui le placait en objet deconnait, je l'ai supprimee), puis j'ai un message d'erreur 1004 qui pointe sur My_Chart.Legend.Select et ca s'arrete


Message édité par Oliver The Great le 14-01-2004 à 16:24:48

---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 14-01-2004 à 17:47:35    

Pas eu le temps de le tester sous XL97, celui-là (demain peut-être), mais il marche sous XL2000. Tu devrais l'exécuter pas-à-pas (menu debugger, pas à pas, ou directement F8), pour repérer précisemment où ca plombe.

Reply

Marsh Posté le 19-01-2004 à 15:35:50    

Ca s'arrete a :

Code :
  1. My_Chart.Legend.Select
  2.     Selection.Position = xlRight
  3.     My_Chart.PlotArea.Select
  4.     ActiveChart.SeriesCollection(3).Select
  5.     ActiveChart.SeriesCollection(3).AxisGroup = 2
  6.     ActiveChart.Axes(xlValue, xlSecondary).Select
  7.     With ActiveChart.Axes(xlValue, xlSecondary)
  8.         .MinimumScaleIsAuto = True
  9.         .MaximumScale = 1
  10.         .MinorUnitIsAuto = True
  11.         .MajorUnitIsAuto = True
  12.         .Crosses = xlAutomatic
  13.         .ReversePlotOrder = False
  14.         .ScaleType = xlLinear
  15.     End With
  16. 'end of insert
  17.     Set My_Sheet = Nothing
  18.     Set My_Chart = Nothing
  19. End Sub


Je n'ai pas trouve pourquoi. Il dit "Select method of Legend Class failed".
 
J'ai essaye de remplacer My_Chart par ActiveChart, mais c'est pareil.
J'ai commande un bouquin a la bibliotheque, mais il va mettre pas mal de temps a arriver :(


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 20-01-2004 à 00:15:18    

Je devrais faire un chtit stage VBA le 23/02, j'espere quand meme avoir fini ce truc d'ici la... personne pour me filer un coup de main ? :(


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 20-01-2004 à 04:59:59    

Bonjour,
 
Essayes ce code:
 
  Sub macro3()
  Dim My_Sheet As Object, My_Chart As Object, depart As Range
   
'Definit la selection
  Set depart = Range(Selection.Address)
 
  Set My_Sheet = ActiveSheet
      Charts.Add
  Set My_Chart = ActiveChart
 
  My_Chart.ChartType = xlLineMarkers
 
  My_Sheet.Activate
  My_Chart.SetSourceData Source:=depart, PlotBy:=xlRows
   
      With My_Chart
          .HasTitle = True
          .ChartTitle.Characters.Text = "titre a la con"
          .Axes(xlCategory, xlPrimary).HasTitle = True
          .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Year"
          .Axes(xlValue, xlPrimary).HasTitle = True
          .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "unite a la con"
      End With
   
      My_Chart.HasLegend = True
      My_Chart.Legend.Position = xlRight
       
      My_Chart.SeriesCollection(3).AxisGroup = 2
   
      With My_Chart.Axes(xlValue, xlSecondary)
          .MinimumScaleIsAuto = True
          .MaximumScale = 1
          .MinorUnitIsAuto = True
          .MajorUnitIsAuto = True
          .Crosses = xlAutomatic
          .ReversePlotOrder = False
          .ScaleType = xlLinear
      End With
   
      Set My_Sheet = Nothing
      Set My_Chart = Nothing
      Set depart = Nothing
     
  End Sub
 
J'ai enleve tous les select qui ne servent pas.
Tu definis au debut ta selection, qui va servir ensuite pour creer le graph.
 
Itawa

Reply

Marsh Posté le 20-01-2004 à 09:50:26    

C'etait ca :D
J'avais eu un indice hier soir, en le montrant a un collegue, et en remarquant que la legende "Unite a la con" etait selectionnee.
 
Merci beaucoup de votre aide :jap:
 
(Quand meme, ca manque un bon chtit bouquin avec des exemples de ce type)


---------------
"The two most common elements in the universe are Hydrogen and stupidity." - Harlan Ellison
Reply

Marsh Posté le 20-01-2004 à 12:28:16    

Perso, autodidacte aussi en VBA, et avec les newsgroup de Microsoft (Microsoft.Public.Fr.Excel, excellent, et les participants le sont aussi), les differents sites sur VBA, y a plus besoin de bouquin !!!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed