Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Marco,
Ho ricevuto la tua email e ho scaricato il tuo file.
Anche se ho capito la logica della tua routine, non riesco ad integrarla nel mio foglio.
Per mantenere la spaziatura esistente dei tuoi tre pulsanti, e per rendere tutti e tre pulsanti sempre visibili, independentemente dello scroll, sia orrizontale che verticale, ho modificato il codice nel seguente modo:
'=========>>
Option Explicit
'--------->>
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rFirstVisbleCell As Range
Dim arrButtons As Variant
Dim dLeft As Double
Dim dGap As Double, dGap2 As Double
Dim arrGaps As Variant
Dim i As Long
Const sButton1 As String = "Button 7" '<<=== Modifica
Const sButton2 As String = "Button 2" '<<=== Modifica
Const sButton3 As String = "Button 4" '<<=== Modifica
Const dPosizioneSinistra As Double = 30
With Me
dGap = .Buttons(sButton2).Left - .Buttons(sButton1).Left
dGap2 = .Buttons(sButton3).Left - .Buttons(sButton2).Left
End With
arrGaps = VBA.Array(0, dGap, dGap2)
arrButtons = VBA.Array(sButton1, sButton2, sButton3)
With ActiveWindow.VisibleRange
Set rFirstVisbleCell = Me.Cells(.Row, .Column)
dLeft = rFirstVisbleCell.Left + dPosizioneSinistra
End With
For i = LBound(arrButtons) To UBound(arrButtons)
With Me.Buttons(arrButtons(i))
.Top = rFirstVisbleCell.Top
dLeft = dLeft + arrGaps(i)
.Left = dLeft
End With
Next i
End Sub
'<<=========
Come avviene nel caso del codice che ho pubblicato in precedenza, alla selezione di qualsiasi cella, i pulsanti saranno sempre visibile in cima allo schermo:
Quindi, prima di uno scroll orizintale o verticale si vedrebbe:
e, dopo uno scroll orizontale, si vedrebbe:
In modo analogo, per uno scroll verticale, si vedrebbe
Comunque, se fosse per me, non vorrei che, dopo uno scroll verticale, i dati nelle prime due righe in cima potessero essere sovrapposti dai pulsanti. Inoltre, non vorrei che, in attesa della selezione di una cella, si potesse temporaneamente vedere uno schermo del genere:
anche se, facendo clic su qualsiasi celle, i pulsanti si troverebbero di nuovo in cima allo schermo.
Pertanto, ho modificato il codice qui sopra per gestire solo lo scroll orrizontale, e ho sfruttato il mio secondo suggerimento originario: ho allargato l'altezza della prima riga per comprendere i pulsanti e ho poi utilizzato lo strumento Blocca i riquadri per bloccare questa prima riga.
In tal modo, i tre pulsanti saranno sempre disposti sopra la prima riga, la quale sarà sempre visibile in cima allo schermo e, nel caso dello scroll orizontale, la visibilità dei pulsanti sarà controllata dal codice.
Credo che questo approccio fornisca una soluzione che a noi si chiederebbe the best of both worlds, ossia il meglio possibile da entrambi.
Il codice per quest'ultimo approccio diventa:
'=========>>
Option Explicit
'--------->>
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rFirstVisbleCell As Range
Dim arrButtons As Variant
Dim dLeft As Double
Dim dGap As Double, dGap2 As Double
Dim arrGaps As Variant
Dim i As Long
Const sButton1 As String = "Button 7" '<<=== Modifica
Const sButton2 As String = "Button 2" '<<=== Modifica
Const sButton3 As String = "Button 4" '<<=== Modifica
Const dPosizioneSinistra As Double = 30
With Me
dGap = .Buttons(sButton2).Left - .Buttons(sButton1).Left
dGap2 = .Buttons(sButton3).Left - .Buttons(sButton2).Left
End With
arrGaps = VBA.Array(0, dGap, dGap2)
arrButtons = VBA.Array(sButton1, sButton2, sButton3)
With ActiveWindow.VisibleRange
Set rFirstVisbleCell = Me.Cells(.Row, .Column)
dLeft = rFirstVisbleCell.Left + dPosizioneSinistra
End With
For i = LBound(arrButtons) To UBound(arrButtons)
With Me.Buttons(arrButtons(i))
.Top = rFirstVisbleCell.Top
dLeft = dLeft + arrGaps(i)
.Left = dLeft
End With
Next i
End Sub
'<<=========
Per consentirti di confrontare le due possibile soluzioni, ti ho inviato il tuo file, dopo averlo aggiornato per dimostrare il secondo approccio sul Foglio1 a il primo suggerimento sul Foglio2.
===
Regards,
Norman