Marius ha scritto:So che Anthony storcerà il naso ( a ragione ) ma volevo sapere se è quello che vuoi fare
Il mio motto e' "Se funziona allora e' perfetto così"
Pero', indipendentemente dalla risposta di W&G, il naso stavolta lo arriccio perche' la tua tecnica di arrotondare al 10 inferiore non garantisce il risultato, nel caso che i valori Min di X o Y avessero dei decimali.
Basterebbe dimensionare MN1 e MN2 come Long oppure Integer, ma il metodo migliore e' usare la funzione FLOOR (ARROTONDA.DIFETTO); es:
- Codice: Seleziona tutto
mn11 = Application.WorksheetFunction.Floor(mn1, 10)
Oppure alternative logiche quali:
- Codice: Seleziona tutto
mn11 = Int(mn1/10) * 10
W&G ha scritto:[Non va bene usare l'opzione Griglia principale] perché se il valore dell'origine per x è 1045 metterà la prima riga verticale a 1055, non a 1050.
Per averne una a 1050 dovrei impostare unità principale su 5, ma poi avrei una nuova riga a 1055, che non voglio.
Oppure dovrei estendere il valore minimo a 1040, tenendo unità 10, ampliando però troppo il grafico.
Allora dovrebbe andare bene il tuo modo di calcolare le coordinate della "griglia"; oppure porti tutto nel vba.
Ad esempio, partendo dal tuo file iniziale (quindi senza le celle che calcolano Min, Max e Medie), la seguente macro imposta i limiti degli assi x e y e aggiunge una nuova serie con i punti necessari a creare la "croce centrale" (anzi, al primo "valore tondo" delle X):
- Codice: Seleziona tutto
Sub Set2Grafico()
Dim ShLine As Boolean, dSmall As Long, dStd As Long, mSize As Long, I As Long
Dim fFrame As Long, NSColl 'As SeriesCollection
Dim minX As Long, minY As Long, maxX As Long, maxY As Long
'
dSmall = 2 '<<< La dimensione dei "dots" degli assi centrali
dStd = 5 '<<< La dimensione standard dei dots
fFrame = 3 '<<< La "cornice" attorno ai Min e Max
'
'Calcola min e max degli assi:
minX = Application.WorksheetFunction.Min(Range("A1:A1000")) - fFrame
minY = Application.WorksheetFunction.Min(Range("B1:B1000")) - fFrame
maxX = Application.WorksheetFunction.Max(Range("A1:A1000")) + fFrame
maxY = Application.WorksheetFunction.Max(Range("B1:B1000")) + fFrame
'
ActiveSheet.ChartObjects("Grafico 1").Activate '<<< Il grafico da "lavorare"
On Error Resume Next 'Rimuove la "croce"
ActiveChart.SeriesCollection("cross").Points(1).Delete
On Error GoTo 0
'Imposta min e max degli assi:
ActiveChart.Axes(xlCategory).MinimumScale = minX
ActiveChart.Axes(xlCategory).MaximumScale = maxX
ActiveChart.Axes(xlValue).MinimumScale = minY
ActiveChart.Axes(xlValue).MaximumScale = maxY
'
'Aggiunge i punti della "croce centrale":
xval = Array(Int(minX / 10 + 1) * 10, Int(minX / 10 + 1) * 10, minX, maxX)
yval = Array(minY, maxY, Int(minY / 10 + 1) * 10, Int(minY / 10 + 1) * 10)
Set NSColl = ActiveChart.SeriesCollection.NewSeries
With NSColl
.XValues = xval
.Values = yval
.Name = "cross"
.MarkerSize = dSmall
End With
'Imposta le linee e le opzioni:
ActiveChart.SeriesCollection("cross").Points(2).Format.Line.Visible = True
ActiveChart.SeriesCollection("cross").Points(4).Format.Line.Visible = True
ActiveChart.SeriesCollection("cross").Points(2).Format.Line.Weight = 0.75 'Spessore
ActiveChart.SeriesCollection("cross").Points(4).Format.Line.Weight = 0.75
ActiveChart.SeriesCollection("cross").Points(1).ApplyDataLabels 'Coordinata
ActiveChart.SeriesCollection("cross").Points(3).ApplyDataLabels
'Prudenziale:
For I = 1 To ActiveChart.FullSeriesCollection(1).Points.Count
ActiveChart.FullSeriesCollection(1).Points(I).Format.Line.Visible = False
ActiveChart.FullSeriesCollection(1).Points(I).MarkerSize = dStd
Next I
ActiveWindow.RangeSelection.Select
End Sub
Il tutto e' dimostrato sul file scaricabile qui:
https://www.dropbox.com/s/h9xev4gney71c ... .xlsm?dl=0Ciao a tutti