Tim ha alcuni fogli di lavoro che hanno due sezioni separate (chiamiamole sezioni superiore e inferiore) che hanno intestazioni di colonna leggermente diverse. Ha congelato la riga superiore per mantenere visibili le intestazioni della sezione superiore durante lo scorrimento verso il basso, ma dopo aver passato un certo punto Tim finisce per guardare i dati della sezione inferiore con le intestazioni della sezione superiore ancora in alto. Vorrebbe sapere se c’è un modo per cambiare quella riga di intestazione congelata per mostrare le intestazioni della sezione inferiore quando scorre verso il basso fino al punto in cui vengono visualizzati solo i dati della sezione inferiore.

Sì, c’è un modo per farlo, ma implica l’uso di macro.

Prima di considerare una soluzione basata su macro, potresti prendere in considerazione la ristrutturazione dei dati in modo che ciascuna delle tue sezioni si trovi su fogli di lavoro diversi. (Dal punto di vista del design, questa sarebbe la soluzione più semplice.) Se ciò non è possibile, è necessario esaminare le macro.

Un approccio semplice consiste nel modificare semplicemente ciò che è memorizzato nella riga superiore (riga 1) del foglio di lavoro, a seconda della riga selezionata. Ad esempio, la seguente macro apporterà modifiche nella riga superiore in base a dove si trova la cella attiva. Se è prima della riga 40, un set di intestazioni viene inserito nella prima riga; se dopo la riga 40 viene riempita un’altra serie di intestazioni.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim iBottomData As Integer

iBottomData = 40

If ActiveCell.Row < iBottomData Then         Cells(1, 1).Value = "Last Name"

Cells(1, 2).Value = "First Name"

Cells(1, 3).Value = "Address"

Cells(1, 4).Value = "Balance"

Else         Cells(1, 1).Value = "Account"

Cells(1, 2).Value = "Sales Rep"

Cells(1, 3).Value = "Status"

Cells(1, 4).Value = ""

End If End Sub

Per utilizzare la macro, assicurati di posizionarla nella finestra del codice per il foglio di lavoro che contiene le due sezioni di dati. È inoltre necessario modificare il valore assegnato alla variabile iBottomData per riflettere il numero di riga del punto in cui inizia la sezione dati inferiore.

Se si desidera effettivamente modificare la riga bloccata mentre si sposta in basso nel foglio di lavoro, la macro deve essere un po ‘più robusta. In realtà, ci sono due macro che seguono (entrambe vanno, di nuovo, nella finestra del codice per il foglio di lavoro) e vengono attivate quando si modifica la cella selezionata e quando si fa clic con il pulsante destro del mouse sul foglio di lavoro.

Private Sub Worksheet_BeforeRightClick(ByVal _   Target As Range, Cancel As Boolean)

Application.ScreenUpdating = False     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.EnableEvents = False     Application.Goto Cells(1, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     Application.Goto Cells(Target.Row - 1, _       Target.Column), scroll:=True     Application.EnableEvents = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(-1, 1 - Target.Column).Select     ' so the right click menu doesn't popup     ' only if this is the second header row.

Cancel = True      Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.ScreenUpdating = False     If Cells(Target.Row, 1).Value <> "title2" Then Exit Sub     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.Goto Cells(Target.Row, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(1, 1 - Target.Column).Select     Application.EnableEvents = True End Sub

Il gestore dell’evento Worksheet_SelectionChange sposta automaticamente la divisione bloccata sotto la seconda riga di intestazioni quando il cursore della cella attiva raggiunge quella riga. Questa riga viene rilevata nell’istruzione If che controlla se la prima cella della riga contiene il testo “titolo2” o meno.

(Ovviamente, questo dovrebbe essere cambiato per riflettere ciò che sarà realmente in quella prima cella.)

Il gestore dell’evento Worksheet_BeforeRightClick sposta la divisione bloccata indietro nel primo set di intestazioni ma lascia la cella attiva nella riga sopra la seconda serie di intestazioni.

Dovresti capire che entrambe le soluzioni macro presentate in questo suggerimento presumono che tu stia effettivamente scorrendo il foglio di lavoro e cambiando la cella selezionata mentre procedi. (In altre parole, stai premendo il tasto Freccia giù per eseguire lo scorrimento.) Se stai semplicemente modificando ciò che viene visualizzato nel foglio di lavoro utilizzando la barra di scorrimento verticale, le intestazioni bloccate non cambieranno perché non stai modificando il cella selezionata e i gestori di eventi non si attivano mai.

La creazione di una soluzione più ampia andrebbe oltre lo scopo di questo suggerimento perché comporterebbe l’interfacciamento con il sistema operativo effettivo.

Se sei interessato a seguire questa strada, tuttavia, un buon punto di partenza potrebbe essere questa pagina sul sito Web di Chip Pearson:

http://www.cpearson.com/excel/DetectScroll.htm

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (11231) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 ed Excel in Office 365. Puoi trovare una versione di questo suggerimento per l’interfaccia del menu precedente di Excel qui: