Condividi tramite

Button fisso

Anonimo
2017-09-01T15:12:44+00:00

Buonasera,

eccomi all'ennesimo quesito:

ho 3 buttons che lanciano 3 macro.

Avrei l'esigenza che allo scrool del foglio sia top/down che left/right, i tre buttons siano fissi e non seguano lo scorrere del foglio.

Ho provato con: non spostare ne ridimensionare con le celle, ovviamente bloccando il foglio ma non va.

Non so neanche se si possa fare.

Grazie per ci vorrà aiutarmi.

Marco

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2017-09-09T02:26:58+00:00

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

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2017-09-01T23:01:13+00:00

Ciao Marco,

eccomi all'ennesimo quesito:

ho 3 buttons che lanciano 3 macro.

Avrei l'esigenza che allo scrool del foglio sia top/down che left/right, i tre buttons siano fissi e non seguano lo scorrere del foglio.

Ho provato con: non spostare ne ridimensionare con le celle, ovviamente bloccando il foglio ma non va.

Non so neanche se si possa fare.

Supponiamo che i tre pulsanti siano disposti in fila, tipo:

Prova qualcosa del genere:

  • Fai clic dx sulla linguetta del foglio di interesse
  • Seleziona l'opzione Visualizza Codice dal **** menu contestuale risultante
  • Incolla il seguente codice:

'=========>>

Option Explicit

'--------->>

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim rFirstVisbleCell As Range

    Dim arrButtons As Variant

    Dim dLeft As Double

    Dim i As Long

    Const sButton1 As String = "Button 1"             '<<=== Modifica

    Const sButton2 As String = "Button 2"             '<<=== Modifica

    Const sButton3 As String = "Button 3"              '<<=== Modifica

    Const dPosizioneSinistra As Double = 200

    arrButtons = 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 + .Width + 10

            .Left = dLeft

        End With

    Next i

End Sub

'<<=========

  • Alt+Q per chiudere l'editor di VBA e tornare a Excel.
  • Salva il file con l'estensione xlsm.

Con questo codice, independentemene dello scroll, sia verticale o orrizontale, i tre pulsanti saranno visibile, nelle stessa posizione relativa allo schermo, non appena una qualsiasi cella sia selezionata.

Potresti scaricare il mio file di prova Marco20170901.xlsm

In alternativa, senza ricorrere a VBA, un'altra possibilità potrebbe essere la seguente:

  • Posiziona i tre pulsanti nella cella A1 e rendere la colonna A abbastanza ampia da contenere i pulsanti
  • Scheda Visualizza
  • Sceglie Blocca riquadri per bloccare la prima riga e colonna in posizione

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

2 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-09-11T17:24:32+00:00

    Ciao Marco.

    Grazie Norman delle due soluzioni......

    Grazie a te, Marco, per il riscontro fin troppo gentile.

    Alla prossima.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-09-09T07:32:50+00:00

    Grazie Norman delle due soluzioni......

    Ne sono convinto......non sei umano..... :-) :-) :-)

    La risposta è stata utile?

    0 commenti Nessun commento