"Но он просто выбирает первую строку столбца, а не перемещает экран для отображения выбора ... "
Выбирает первый столбец дальность цели, центрируясь на дальности. Не обрабатывает замороженные панели.
В модуле
Public Sub SelectColumnAndViewActive(cellrange As Range)
Dim cellrangerow As Long
cellrangerow = cellrange.Row
cellrange.EntireColumn.Select
ActiveWindow.SmallScroll WorksheetFunction.Max(cellrangerow - 1 - Int(ActiveWindow.VisibleRange.Rows.Count / 2)), 0, 0, 0
End Sub
Использование
Call SelectColumnAndViewActive(ActiveCell)
Объяснение
Сначала мы сохраняем номер строки активной ячейки, поскольку она будет потеряна после выбора столбца. Затем мы выбираем первый столбец активной ячейки. Последний автоматически поместит первую строку листа в верхнюю часть активного окна, поэтому нам нужно прокрутить определенное количество строк, чтобы центрировать то, что изначально было активной ячейкой на последнем шаге.
Выбирает только целевой диапазон, центрируясь на нем. Работает ли с замороженными стеклами и прерывистыми диапазонами.
В модуле
Public Sub CenterRange(cellrange As Range)
Dim cellitems() As String, tlrcitems() As String, brrcitems() As String, minrow As Long, mincol As Long, maxrow As Long, maxcol As Long
If cellrange Is Nothing Then Exit Sub
For Each area In cellrange.Areas
cellitems = Split(area.Address(ReferenceStyle:=xlR1C1), ":")
tlrcitems = Split(Mid$(cellitems(0), 2), "C")
If UBound(cellitems) = 1 Then brrcitems = Split(Mid$(cellitems(1), 2), "C") Else brrcitems = tlrcitems
If minrow = 0 Then minrow = tlrcitems(0) Else minrow = WorksheetFunction.Min(minrow, CLng(tlrcitems(0)))
If mincol = 0 Then mincol = tlrcitems(1) Else mincol = WorksheetFunction.Min(mincol, CLng(tlrcitems(1)))
If maxrow = 0 Then maxrow = brrcitems(0) Else maxrow = WorksheetFunction.Max(maxrow, CLng(brrcitems(0)))
If maxcol = 0 Then maxcol = brrcitems(1) Else maxcol = WorksheetFunction.Max(maxcol, CLng(brrcitems(1)))
Next
ActiveWindow.ScrollRow = WorksheetFunction.Max(minrow - (ActiveWindow.VisibleRange.Rows.Count - (maxrow - minrow + 1)) \ 2, 1)
ActiveWindow.ScrollColumn = WorksheetFunction.Max(mincol - (ActiveWindow.VisibleRange.Columns.Count - (maxcol - mincol + 1)) \ 2, 1)
cellrange.Select
End Sub
Использование
Call CenterRange(ActiveCell)
Объяснение
Сначала мы отбрасываем пустые целевые диапазоны. Затем мы перебираем все области прерывистого целевого диапазона, получаем их адреса в формате R1C1 (например, R5C3 для строки 5 и столбца 3), чтобы найти минимальные и максимальные «границы» всего диапазона. Наконец, мы концентрируемся на диапазоне, устанавливая значения для первой строки и первого столбца активного окна равными вычисленным значениям, а затем выбираем целевой диапазон.
Возможно, вы заинтересованы в Первая часть ответа. Конечно, вы можете заменить ActiveCell
любым другим диапазоном, который вам нравится при вызове сабов.
РЕДАКТИРОВАТЬ: Я писал это, когда вы приняли ответ. Я решил опубликовать его в любом случае, так как он также центрируется на соответствующей строке после выбора столбца, и есть также часть, которая может вас заинтересовать, если по какой-то причине ваш диапазон будет прерывистым. И да, я тоже попробовал Application.GoTo
, когда столкнулся с этой проблемой, и быстро заметил ее ограничения.