Modification macro

Résolu/Fermé
Vivi76 - 17 juil. 2017 à 15:56
 Vivi76 - 24 juil. 2017 à 11:24
Bonjour, j'ai un petit problème de macro, je m'explique, j'ai réussi à trouver un bout de macro que j'ai modifié :

Dim i As Integer
Dim istart, imax As Integer
Dim istep As Integer
Dim r1, tout As Range

Set tout = Nothing
i = 0
istart = 6
imax = 1331
istep = 4

Application.ScreenUpdating = False

For i = istart To imax Step istep
Set r1 = Range(i & ":" & i)
If tout Is Nothing Then
Set tout = r1
Else
Set tout = Union(tout, r1)
End If
Next

tout.Select

Application.ScreenUpdating = True
' option
'Range("a" & i - istep).Activate



End Sub

Cette maccro me permet de sélection toutes les 6 lignes, la même ligne dans mon fichier pour créer le graphique. Or mon problème désormais est de faire la même chose en sélection une cellule précise, toutes les 6 lignes. Je me doute que je dois gérer en Range, mais étant encore débutant en maccro je suis perdu...
A voir également:

7 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
17 juil. 2017 à 16:29
bonjour, prenant la colonne K comme exemple, je suggère d'essayer ceci:
Set r1 = Range( "K" & i) 

0
Merci pour la réponse, cela fonctionne !
Maintenant je cherche à créer un graphique à partir de cette sélection, mais je n'arrive pas à coder mon graphique pour cette même sélection. j'ai essaie plusieurs choses mais sans grands résultats...Voici le programme actuel :

Dim i As Integer
Dim istart, imax As Integer
Dim istep As Integer
Dim r1, tout As Range
Dim MonGraphe As Chart, MaPlage As Range
Sub Selection()



Set tout = Nothing
i = 0
istart = 6
imax = 26
istep = 4

Application.ScreenUpdating = False

For i = istart To imax Step istep
Set r1 = Range("C" & i)
If tout Is Nothing Then
Set tout = r1
Else
Set tout = Union(tout, r1)
End If
Next

tout.Select



Set MaPlage = Worksheets("Détails DI").Range(tout).Select
Set MonGraphe = ThisWorkbook.Charts.Add
MonGraphe.ChartType = xlColumnStacked100
MonGraphe.SetSourceData MaPlage, xlColumns
With MonGraphe.SeriesCollection(5)
.ChartType = xlXYScatterSmoothNoMarkers
.AxisGroup = 2
With .Border
.Weight = xlMedium
.LineStyle = xlAutomatic
.ColorIndex = 4
End With
End With
With MonGraphe
.HasTitle = True
With .ChartTitle
.Characters.Text = "Tech1"
.Shadow = True
.Border.Weight = xlHairline
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Characters.Text = "Pourcentage"
End With
With .Axes(xlValue, xlSecondary)
.HasTitle = True
.AxisTitle.Characters.Text = "Total (hrs)"
End With
End With


End Sub



Le but n'est pas que vous fassiez mon programme à ma place, mais pouvez vous m'expliquer les différentes étapes à effectuer, que je puisse à l'avenir le faire de moi même ?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
18 juil. 2017 à 16:59
au lieu de:
tout.Select 
Set MaPlage = Worksheets("Détails DI").Range(tout).Select

je suggère:
Set MaPlage = tout

Ou bien, encore plus simple, utiliser "tout" au lieu de "MaPlage"
je te recommande d'éviter les
.Select
autant que possible: ils sont presque toujours inutiles, et souvent sources de confusion et d'ennuis.
connais-tu l'enregistreur de macros? il peut t'aider à comprendre comment automatiser des actions.
0
Oui j'avais essayé par cette méthode, la programmation qui en découle est plutôt "basique" et ne permets pas de faire ce que je souhaite ^^
Je vais essayer comme ça
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
18 juil. 2017 à 19:16
L'enregistreur de macro est pratique pour découvrir les objets à manipuler. Les programmes générés ainsi sont horribles, bien d'accord.
0
J'ai suivi votre conseil, à première vue, il me créé bien la graphique avec les données que je souhaite, mais il me reste deux problèmes :
- j'obtiens un graphique en histogramme, mais je souhaite en courbe
- les noms d'axes et de titres ne s'affichent pas
0
de plus, en abscisse de mon graphique je dois mettre des dates à la colonnes A, faut t'ile que je modifie mon code en conséquence avec quelque chose du genre ? :

Sub Selection()



Set tout = Nothing
i = 0
istart = 6
imax = 26
istep = 4

Application.ScreenUpdating = False

For i = istart To imax Step istep
Set r1 = Range("C" & i)
Set r2 = Range("A" & i)
If tout Is Nothing Then
Set tout = r1 + r2
Else
Set tout = Union(tout, r1, r2)
End If
Next

tout.Selec
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
19 juil. 2017 à 18:34
Je suggère de commencer par ton point #7, et de faire le #6 ensuite.
Afin de découvrir comment programmer cela, je te suggère de faire les changements à la main, pendant que tu enregistres une macro. Cela te permettra de comprendre comment changer les attributs de ton graphe par VBA.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ca a pas mal avancé..

Dim Emplacement As Range
Dim Grph As ChartObject
Sub Test()

Call Selection

ActiveSheet.Shapes.AddChart2(332, xlLineMarkers).Select
ActiveChart.SetSourceData Source:=Range( _
"'Détails DI'!$C$6,'Détails DI'!$A$6,'Détails DI'!$C$10,'Détails DI'!$A$10,'Détails DI'!$C$14,'Détails DI'!$A$14,'Détails DI'!$C$18,'Détails DI'!$A$18,'Détails DI'!$C$22,'Détails DI'!$A$22,'Détails DI'!$C$26,'Détails DI'!$A$26" _
)
ActiveChart.Axes(xlValue).MajorGridlines.Select
ActiveChart.Axes(xlCategory).Select
ActiveChart.Axes(xlCategory).CategoryType = xlCategoryScale

With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Testgraph"

End With
With Grph
With .Axes(xlValue, xlPrimary) 'L'erreur se trouve ici

.HasTitle = True
.AxisTitle.Characters.Text = "Densité d'occurence"
End With

With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Characters.Text = "Taux de rentabilité"

End With

'Définit le premier graphique de la feuille
Set Grph = Feuil1.ChartObjects(1)
'Définit la plage de cellule pour positionner le grpahique
Set Emplacement = Range("A29:I46")

With Grph
.Left = Emplacement.Left
.Top = Emplacement.Top
.Height = Emplacement.Height
.Width = Emplacement.Width
End With
End With
End Sub


Je veux donc créer des noms d'axes, mais l'erreur persiste au niveau de la ligne où j'ai notifié l'erreur
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
20 juil. 2017 à 12:38
il suffit peut-être de déplacer la ligne "set grph" avant la première utilisation de grph (donc avant la première ligne "With Grph").
je te recommande d'éviter les .Select autant que possible: ils sont presque toujours inutiles, et souvent sources de confusion et d'ennuis. également, éviter d'utiliser "active", ActiveSheet, ActiveChart.
0
Vivi76 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
20 juil. 2017 à 14:47
Malheureusement j'ai réussi à faire fonctionner ma macro sans me passer de "active"...
un gros problème subsiste :

ActiveSheet.Shapes.AddChart2(332, xlLineMarkers).Select
ActiveChart.SetSourceData Source:=Range(tout.Select)
ActiveChart.Axes(xlValue).MajorGridlines.Select
ActiveChart.Axes(xlCategory).Select
ActiveChart.Axes(xlCategory).CategoryType = xlCategoryScale


cette liste :
ActiveChart.SetSourceData Source:=Range(tout.Select)


Je cherche à faire appel à ma plage que je sélectionne avec la macro suivante :

Sub Selection()



Set tout = Nothing
i = 0
istart = 6
imax = 26
istep = 4

Application.ScreenUpdating = False

For i = istart To imax Step istep
Set r1 = Range("C" & i)
If tout Is Nothing Then
Set tout = r1
Else
Set tout = Union(tout, r1)
End If



Set r2 = Range("A" & i)
If tout Is Nothing Then
Set tout = r2
Else
Set tout = Union(tout, r2)
End If



Next

tout.Select


End Sub


Mais actuellement, je n'arrive pas en faisant appel à cette macro, à reporter ma plage
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Vivi76
20 juil. 2017 à 15:16
moi, je ferais ainsi (pas testé):
au lieu de
sub selection
,
faire
function obtenirrange () as range

dans la fonction, au lieu de
tout.select
, faire
obtenirrange=tout
(peut-être avec
set
devant)
ensuite, dans sub test,
tu ajoutes
dim donnees as range

au lieu de
call selection
, tu fais
set donnees = obtenirrange()

et au lieu de
ActiveChart.SetSourceData Source:=Range(tout.Select)

tu fais
ActiveChart.SetSourceData Source:=donnees

en passant, tu auras supprimé deux "select"!
0
Merci beaucoup pour votre aide !
Après quelques modifications et grâce à vos conseils, j'ai obtenu ce que je souhaitais. J'aurais quelques améliorations à apporter mais je verrais plus tard.
0
Bonjour,
j'aurais une dernière requête, je cherche à sauvegarder une valeur d'une de mes cellules sur un autre feuille en la copiant sur la dernière cellule vide de ma colonne B.
Cependant le code que j'ai actuellement ne fonctionne pas et m'affiche 0. Je pense comprendre le problème, je voulais donc détourner ce problème en utilisant ce modèle effectué par l'enregistreur de macro :

Selection.PasteSpecial Paste:=xlPasteValues 


Mais je ne sais pas comment l'intégrer dans ma macro actuelle

Sub Save()

Dim Source As String
Dim Cible As String
Dim LigneEncours As Long

'Chargement du nom des feuilles origine et destination
Cible = "feuille1"
Source = "feuille2"
'Calcul de la ligne courante
LigneEncours = Worksheets(Cible).Range("B" & Rows.Count).End(xlUp).Row + 1
'Copie des valeurs
With Worksheets(Cible)


Worksheets(Source).Range("O14").Copy .Range("B" & LigneEncours)

End With
End Sub
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
24 juil. 2017 à 10:02
il suffit peut-être de faire:
Worksheets(Cible).Range("B" & LigneEncours) = Worksheets(Source).Range("O14").Value
0
ça paraît si simple et pourtant j'ai essayer tellement de choses différentes
0