Dave ha bisogno di un modo, in una macro, per determinare quante colonne sono visibili nella finestra o nel riquadro corrente.

Questo in realtà è abbastanza facile da realizzare. Il trucco sta nel ricordare che è necessario lavorare con l’oggetto VisibleRange, che appartiene all’oggetto ActiveSheet. È possibile utilizzare la raccolta .Columns per l’oggetto VisibleRange e quindi utilizzare il metodo .Count per quella raccolta. Quello che ottieni è il numero di colonne, in questo modo:

Sub VisibleColCount()

Dim sTemp As String

sTemp = "There are "

sTemp = sTemp & ActiveWindow.VisibleRange.Columns.Count     sTemp = sTemp & " columns visible."

MsgBox sTemp End Sub

Sembra semplice, vero? Il problema è che il metodo .Count restituisce il numero di colonne nella raccolta indipendentemente dal fatto che siano nascoste o meno. Ad esempio, diciamo che guardi lo schermo e vedi che mostra le colonne da C a H. Ciò significa che vengono visualizzate 6 colonne, ed è ciò che il metodo .Count restituisce nella macro sopra. Se poi nascondi la colonna F, ora vengono visualizzate le colonne dalla C alla I. Invece di .Count che restituisce ancora 6 (che rappresentano le colonne C, D, E, G, H e I), ora restituisce 7, che include la colonna nascosta, anche se non è visibile.

La soluzione a questa situazione è controllare la proprietà .Hidden di ogni colonna nell’insieme .Columns. Solo se la proprietà .Hidden è False la colonna deve essere considerata visibile, in questo modo:

Sub VisibleColCount()

Dim c As Range     Dim iCount As Integer     Dim sTemp As String

iCount = 0     For Each c In ActiveWindow.VisibleRange.Columns         If Not c.Hidden Then iCount = iCount + 1     Next c

sTemp = "The active window includes "

sTemp = sTemp & ActiveWindow.VisibleRange.Columns.Count     sTemp = sTemp & " columns. Of those columns, "

If iCount = ActiveWindow.VisibleRange.Columns.Count Then         sTemp = sTemp & "all "

Else         sTemp = sTemp & "only "

End If     sTemp = sTemp & iCount & " are visible."

MsgBox sTemp End Sub

C’è un altro trucco con questo approccio: per quanto riguarda VBA, una colonna viene considerata visibile fintanto che viene mostrata solo una parte di quella colonna. Inoltre, se prevedi di utilizzare i riquadri nella visualizzazione di Excel, potresti prendere in considerazione l’aggiunta dell’oggetto ActivePane nel mix. Fondamentalmente, ci vuole un semplice cambiamento nelle macro precedenti:

Ovunque vediate l’oggetto ActiveWindow, seguitelo con ActivePane, simile a questo:

For Each c In ActiveWindow.ActivePane.VisibleRange.Columns

Ciò garantisce che la macro guardi solo il riquadro corrente nella finestra quando esegue il conteggio.

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

Questo suggerimento (617) si applica a Microsoft Excel 2007, 2010, 2013 e 2016.