definir la selection dans une macro [resolu] [VBA][Excel] - VB/VBA/VBS - Programmation
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 :
|
c'est ça que tu cherches ?
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
Marsh Posté le 13-01-2004 à 17:42:21
pourrais-tu essayer cela
Code :
|
??
Marsh Posté le 13-01-2004 à 17:45:06
J'ai essaye, ca reste en jaune, il aime pas...
Marsh Posté le 13-01-2004 à 17:59:36
ok, ok,
ça marcherait si l'on peut donner un nom à ta sélection
Code :
|
on peut donner un nom à une zone dynamiquement ?
Marsh Posté le 13-01-2004 à 18:05:54
si je fais un set mySelection = Selection.Interior p-e... je regarde ca.
Marsh Posté le 13-01-2004 à 18:07:53
method "range" of object "_global" failed
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
Marsh Posté le 13-01-2004 à 18:10:06
idem avec Set dans ou hors du With
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...
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 :
|
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 :
|
ca serait pas mal...
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 |
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
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
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'autres solutions peut-être ?
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
Marsh Posté le 13-01-2004 à 21:29:36
j'ai essaye aussi, ca marche pas non plus. C'est penible
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
Marsh Posté le 14-01-2004 à 00:21:44
Merci, je teste ca...
Ouais, ca a l'air de marcher
Tu peux m'expliquer le principe stp ? (pkoi ca ne peut pas marcher si tu ne fais pas ca...)
En tout cas merci
Marsh Posté le 14-01-2004 à 08:07:23
Oliver The Great a écrit : Merci, je teste ca... |
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.
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)
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
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)
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 |
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 ?
Marsh Posté le 14-01-2004 à 16:20:32
OK...
j'ai un tableau par page, du style
|
Le code approprie devient :
Code :
|
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
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.
Marsh Posté le 19-01-2004 à 15:35:50
Ca s'arrete a :
Code :
|
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
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 ?
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
Marsh Posté le 20-01-2004 à 09:50:26
C'etait ca
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
(Quand meme, ca manque un bon chtit bouquin avec des exemples de ce type)
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 !!!
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 :
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