Signaler

Modification macro [Résolu]

Posez votre question Vivi76 - Dernière réponse le 24 juil. 2017 à 11:24 par Vivi76
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...
Utile
+1
plus moins
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 ?
Cette réponse vous a-t-elle aidé ?  
yg_be 3377Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 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.
Répondre
Donnez votre avis
Utile
+0
plus moins
bonjour, prenant la colonne K comme exemple, je suggère d'essayer ceci:
Set r1 = Range( "K" & i) 

Donnez votre avis
Utile
+0
plus moins
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
yg_be 3377Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 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.
Répondre
Donnez votre avis
Utile
+0
plus moins
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
Vivi76- 19 juil. 2017 à 11:42
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
Répondre
yg_be 3377Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 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.
Répondre
Donnez votre avis
Utile
+0
plus moins
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
yg_be 3377Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 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.
Répondre
Vivi76- 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
Répondre
yg_be 3377Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 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"!
Répondre
Donnez votre avis
Utile
+0
plus moins
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.
Donnez votre avis
Utile
+0
plus moins
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
yg_be 3377Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 24 juil. 2017 à 10:02
il suffit peut-être de faire:
Worksheets(Cible).Range("B" & LigneEncours) = Worksheets(Source).Range("O14").Value
Répondre
Vivi76- 24 juil. 2017 à 11:24
ça paraît si simple et pourtant j'ai essayer tellement de choses différentes
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !