Risolto Deselezionare un foglio grafico con VBA

Markus

Nuovo utente
4 Gennaio 2020
12
1
Excel 2016
0
In riferimento ad example.xlsm:


dove Sheet1 (1) è un Foglio, Plot1 (2) è un Foglio-Grafico e il bottone (3) si riferisce alla seguente Macro:

Visual Basic:
Sub plot()

Dim blue(1 To 5, 1 To 2)
Dim red(1 To 5, 1 To 2)
For i = 1 To 5
    blue(i, 1) = i
    blue(i, 2) = i ^ 2
    red(i, 1) = i + 4
    red(i, 2) = (i + 4) ^ 2
Next i

Sheets("Plot1").Select
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers

ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(1).XValues = Application.Index(blue, , 1)
ActiveChart.FullSeriesCollection(1).Values = Application.Index(blue, , 2)
ActiveChart.FullSeriesCollection(1).Select
Selection.Format.Line.ForeColor.RGB = RGB(0, 0, 255)

ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(2).XValues = Application.Index(red, , 1)
ActiveChart.FullSeriesCollection(2).Values = Application.Index(red, , 2)
ActiveChart.FullSeriesCollection(2).Select
Selection.Format.Line.ForeColor.RGB = RGB(255, 0, 0)

Sheets("Plot1").Protect DrawingObjects:=True, Contents:=False
Sheets("Plot1").Unprotect

End Sub
  • dopo aver aperto example.xlsm, cliccando (3) ottengo:


  • dopo aver aperto example.xlsm, cliccando (2), (1) e (3) ottengo:


Come posso cambiare la Macro in modo da ottenere quest'ultima immagine indipendentemente dalla sequenza di clic?
 

Allegati

Ultima modifica:

Markus

Nuovo utente
4 Gennaio 2020
12
1
Excel 2016
0
ggratis @ggratis : grazie! Ho allegato il file che sopra ho descritto tramite immagini (non avevo notato si potesse allegare il file).
 

ggratis

VBA Expert
Expert
27 Settembre 2015
1.752
65
Lecce - Pisa
Excel 2010
84
A me non si presenta il problema che hai evidenziato, che consiste comunque semplicemente nel fatto che ti rimane selezionata la serie, quindi è sufficiente deselezionarla, ma credo tu debba anche cancellare le serie inserite nel grafico prima di ricrearle, altrimenti non fai altro che aggiungerne due ad ogni click sul pulsante plot.
 

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
6.776
115
76
Catania
Excel2010
264
Ciao
Come potrai notare io ho la vers.2010 e, pertanto ho dovuto eliminare Full in queste righe
ActiveChart.SeriesCollection(1).XValues = Application.Index(blue, , 1)
ActiveChart.SeriesCollection(1).Values = Application.Index(blue, , 2)
ActiveChart.SeriesCollection(1).Select

Confermo che il problema a me non si presenta.

Ha ragione ggratis @ggratis (un saluto) per quanto attiene la "sovrapposizione" dei dati ad ogni click

Ciao,
Mario
 

ggratis

VBA Expert
Expert
27 Settembre 2015
1.752
65
Lecce - Pisa
Excel 2010
84
Marius44 @Marius44 cappello_saluta
Visual Basic:
Sub plot()
Application.ScreenUpdating = False
Dim blue(1 To 5, 1 To 2)
Dim red(1 To 5, 1 To 2)
For i = 1 To 5
    blue(i, 1) = i
    blue(i, 2) = i ^ 2
    red(i, 1) = i + 4
    red(i, 2) = (i + 4) ^ 2
Next i

With Sheets("Plot1")
    .ChartArea.ClearContents
'        For Each s In .SeriesCollection
'            s.Delete
'        Next s
    .ChartType = xlXYScatterSmoothNoMarkers
    .SeriesCollection.NewSeries
    .FullSeriesCollection(1).XValues = Application.Index(blue, , 1)
    .FullSeriesCollection(1).Values = Application.Index(blue, , 2)
    .FullSeriesCollection(1).Format.Line.ForeColor.RGB = RGB(0, 0, 255)
    
    .SeriesCollection.NewSeries
    .FullSeriesCollection(2).XValues = Application.Index(red, , 1)
    .FullSeriesCollection(2).Values = Application.Index(red, , 2)
    .FullSeriesCollection(2).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
End With
Sheets("Plot1").Protect DrawingObjects:=True, Contents:=False
Sheets("Plot1").Unprotect
Application.ScreenUpdating = True
End Sub
 
Ultima modifica:

Markus

Nuovo utente
4 Gennaio 2020
12
1
Excel 2016
0
Innanzitutto grazie per le gentili risposte. Concordo sul fatto che occorra cancellare le serie da una passata all'altra, nel creare l'esempio minimo in questione avevo omesso tale riga. Copia-incollando quest'ultima macro e ripercorrendo i passaggi esposti nel messaggio iniziale, noto che nel primo caso elencato rimane selezionato "il bordo" del grafico, mentre nel secondo caso elencato no. Naturalmente basterebbe cliccare sul bordo grigio della finestra per ovviare a tale fatto, ma mi piacerebbe sapere se fosse possibile farlo in automatico tramite codice VBA (in caso contrario, ovviamente, non muore nessuno). Grazie!
 

ggratis

VBA Expert
Expert
27 Settembre 2015
1.752
65
Lecce - Pisa
Excel 2010
84
mi piacerebbe sapere se fosse possibile farlo in automatico tramite codice VBA (in caso contrario, ovviamente, non muore nessuno). Grazie!
Se ho capito bene a cosa ti riferisci ...
Basta non usare il metodo .select ed operare direttamente sugli oggetti.
Hai provato la sub che ti ho postato?
...non dovrebbe darti il problema e di fatti non usa il metodo .select; nel tuo caso:
ActiveChart.FullSeriesCollection(2).Select.
Qualora tu lo volessi usare comunque, allora dovresti aggiungere una riga per selezionare altro prima di uscire dalla sub, per esempio
Sheets("Plot1").Select
Fai sapere Saluto_saluto
 

Markus

Nuovo utente
4 Gennaio 2020
12
1
Excel 2016
0
Grazie ancora per il gentile supporto ma qui il problema sono io, non so spiegarmi a sufficienza, provo a semplificare ulteriormente.

1. Sovrascrivo alla mia macro quella che gentilmente mi avete fornito.

2. Salvo e chiudo tutto (non so se sia necessario, ma perlomeno sono sicuro funzioni).

3. Riapro example.xlsm e cliccando sul bottone della macro ottengo:



dove noto che i punti del grafico non sono selezionati (ottimo!) ma purtroppo il contorno della finestra risulta selezionato (e questo a me non va giù, anche se capisco essere un "non problema", basta cliccare col mouse sul bordo grigio a sinistra o a destra della finestrella).

4. Non salvo e chiudo tutto (ancora una volta non so se sia necessario, ma perlomeno sono sicuro funzioni).

5. Riapro example.xlsm, clicco sulla linguetta in basso "Plot1", quindi sulla linguetta in basso "Sheet1" e cliccando sul bottone della macro ottengo:



dove noto che i punti del grafico non sono selezionati (ottimo!) e il contorno della finestra non risulta selezionato (ottimo!).

Ebbene, dato che quest'ultima procedura porta al risultato desiderato ho ben pensato di registrarne una macro, ma purtroppo così facendo ottengo una macro contenente solo la riga Sheets("Sheet1").Select, lasciandomi praticamente "a piedi" e senza alcuna idea su come risolvere la problematica (ammesso che sia possibile).
 
Ultima modifica:

ggratis

VBA Expert
Expert
27 Settembre 2015
1.752
65
Lecce - Pisa
Excel 2010
84
Il problema è stato riscontrato anche da altri...
https://stackoverflow.com/questions/29881415/activechart-deselect-doesnt-work
Se il grafico non è selezionato, la macro non usando il metodo select, lo lascia non selezionato al termine dell'esecuzione.
Il problema è che all'apertura del file il grafico si seleziona comunque!!!
potresti usare questo escamotage...
Nella Private Sub Workbook_Open() non ho usato il proteggi e sproteggi foglio, perché sembra non sortire lo stesso effetto della Private Sub Chart_Activate()
Dunque, nel modulo della cartella:
Visual Basic:
Private Sub Workbook_Open()
Sheets("sheet1").Select
End Sub
nel modulo del grafico:
Visual Basic:
Private Sub Chart_Activate()
Sheets("Plot1").Protect DrawingObjects:=True, Contents:=False
Sheets("Plot1").Unprotect
End Sub
nel modulo standard:
Visual Basic:
Sub plot()
Application.ScreenUpdating = False
Dim blue(1 To 5, 1 To 2)
Dim red(1 To 5, 1 To 2)
For i = 1 To 5
    blue(i, 1) = i
    blue(i, 2) = i ^ 2
    red(i, 1) = i + 4
    red(i, 2) = (i + 4) ^ 2
Next i

With Sheets("Plot1")
    .ChartArea.ClearContents
'        For Each s In .SeriesCollection
'            s.Delete
'        Next s
    .ChartType = xlXYScatterSmoothNoMarkers
    .SeriesCollection.NewSeries
    .FullSeriesCollection(1).XValues = Application.Index(blue, , 1)
    .FullSeriesCollection(1).Values = Application.Index(blue, , 2)
    .FullSeriesCollection(1).Format.Line.ForeColor.RGB = RGB(0, 0, 255)
  
    .SeriesCollection.NewSeries
    .FullSeriesCollection(2).XValues = Application.Index(red, , 1)
    .FullSeriesCollection(2).Values = Application.Index(red, , 2)
    .FullSeriesCollection(2).Format.Line.ForeColor.RGB = RGB(255, 0, 0)
End With
Application.ScreenUpdating = True
End Sub
Saluto_saluto
 

Allegati

Ultima modifica:

Markus

Nuovo utente
4 Gennaio 2020
12
1
Excel 2016
0
ggratis @ggratis : è esattamente quel problema lì! Avevo letto anche quella discussione ma non ci avevo capito molto, proprio per quello ho deciso di iscrivermi a questo fantastico forum e a quanto pare ne è valsa la pena! Grazie mille ancora a tutti, ora credo di aver risolto, ma prima di chiudere il topic vorrei prendermi almeno un giorno di tempo per rifletterci bene e fare alcune prove, perché questo è solo un esempio minimo, il codice a cui sto lavorando ha più di 1000 righe, quindi molto più complicato da gestire.

P.S.: Bruno @Bruno : ho provato anche Deselect ma non porta a quanto desiderato (seppur mi sembri una buona via).
 

Markus

Nuovo utente
4 Gennaio 2020
12
1
Excel 2016
0
Bruno @Bruno : perdonami ma non capisco cosa tu abbia trovato, intendi che hai un modo alternativo per risolvere la cosa? Se sì sono lieto di leggerlo, sto imparando più in questi semplici scambi di messaggi che dopo mesi di full immersion. Grazie!
 

Bruno

Utente assiduo
Expert
13 Settembre 2015
1.650
115
Italy
365/64 Bit W10
203
Ciao

Prima ti avevo suggerito:
ActiveChart.Deselect

E nelle prove che stavo facendo ottenevo il risultato corretto.
Quando hai detto che non avevi risolto ho provato e con sorpresa non ottenevo sempre lo stesso risultato.

Penso che il problema sia causato dal codice:
Visual Basic:
Sheets("Plot1").Select
Il foglio non sempre ha completato la procedura di attivazione e per dare modo a Windows di completarla
ho aggiunto:
Visual Basic:
DoEvents
Ecco il codice completo.

Visual Basic:
Sub plot()
Dim blue(1 To 5, 1 To 2)
Dim red(1 To 5, 1 To 2)
For i = 1 To 5
    blue(i, 1) = i
    blue(i, 2) = i ^ 2
    red(i, 1) = i + 4
    red(i, 2) = (i + 4) ^ 2
Next i

Sheets("Plot1").Select
DoEvents
ActiveChart.ChartType = xlXYScatterSmoothNoMarkers

ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(1).XValues = Application.Index(blue, , 1)
ActiveChart.FullSeriesCollection(1).Values = Application.Index(blue, , 2)
ActiveChart.FullSeriesCollection(1).Select
Selection.Format.Line.ForeColor.RGB = RGB(0, 0, 255)

ActiveChart.SeriesCollection.NewSeries
ActiveChart.FullSeriesCollection(2).XValues = Application.Index(red, , 1)
ActiveChart.FullSeriesCollection(2).Values = Application.Index(red, , 2)
ActiveChart.FullSeriesCollection(2).Select
Selection.Format.Line.ForeColor.RGB = RGB(255, 0, 0)

Sheets("Plot1").Protect DrawingObjects:=True, Contents:=False
Sheets("Plot1").Unprotect
ActiveChart.Deselect
End Sub
 

Markus

Nuovo utente
4 Gennaio 2020
12
1
Excel 2016
0
Eccomi! Devo dire che sono stato davvero sorpreso dalla soluzione di Bruno, con una "parola" ha risolto quasi tutto, quasi in quanto nel mio obiettivo iniziale c'era la prerogativa di evitare la selezione del riquadro anche all'apertura del file, che suppongo sia possibile solamente tramite una "private macro" del tipo indicata da "ggratis". Solo per questo motivo, non per demeriti, premio la risposta di "ggratis". Vi ringrazio ancora tanto e vi auguro una buona Epifania. Ciao!
 

ggratis

VBA Expert
Expert
27 Settembre 2015
1.752
65
Lecce - Pisa
Excel 2010
84
Intanto saluto Bruno @Bruno (cappello_saluta) e ringrazio M @Markus per il riscontro, ma ...
...non capisco cosa risolva
DoEvents
...e credo che sia superflua l'istruzione
ActiveChart.Deselect
...le seguenti istruzioni, di protezione e rimozione della protezione del foglio-grafico, sono quelle che fanno il lavoro di rimozione di tutte le selezioni.
Visual Basic:
Sheets("Plot1").Protect 
Sheets("Plot1").Unprotect
...non mi spiego come mai non sortiscano lo stesso effetto se inserite nell'evento open del workbook, da cui la necessità dell'escamotage.
Visual Basic:
Private Sub Workbook_Open()
    Sheets("Plot1").Protect
    Sheets("Plot1").Unprotect
End Sub
...ad ogni modo, magari fossero questi i problemi...
';)Saluto_salutocappello_saluta
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!