Я хочу программно заморозить верхнюю строку листа Excel из VBA. Конечной целью является получение того же эффекта, что и команда View > Freeze Panes > Freeze Top Row
в Excel 2007, так что верхняя строка листа замораживается, и пользователи могут видеть верхнюю строку листа, даже когда они просматривают данные.
Как я могу программно заморозить верхнюю строку листа Excel в Excel 2007 VBA?
Ответ 1
Rows("2:2").Select
ActiveWindow.FreezePanes = True
Выберите другой диапазон для другого эффекта, точно так же, как и вручную. "Freeze Top Row" на самом деле просто новый ярлык в Excel 2007 (и выше), он не содержит дополнительных функций по сравнению с более ранними версиями Excel.
Ответ 2
Проблема с записанным макросом такая же, как и проблема со встроенным действием: Excel решает заморозить верхнюю видимую строку, а не фактическую верхнюю строку, где информация заголовка может быть найдена.
Цель макроса в этом случае - заморозить фактическую верхнюю строку. Когда я просматриваю строку # 405592, и мне нужно проверить заголовок для столбца (потому что я забыл заморозить строки при открытии файла), мне нужно прокрутить вверх, заморозить верхнюю строку, а затем найти путь назад строка # 405592 снова. Поскольку я считаю, что это глупое поведение, я хочу, чтобы макрос исправил его, но, как я уже сказал, записанный макрос просто имитирует ту же глупость.
Я использую Office 2011 для Mac OS X Lion
Обновление (2 минуты спустя):
Я нашел решение здесь: http://www.ozgrid.com/forum/showthread.php?t=19692
Dim r As Range
Set r = ActiveCell
Range("A2").Select
With ActiveWindow
.FreezePanes = False
.ScrollRow = 1
.ScrollColumn = 1
.FreezePanes = True
.ScrollRow = r.Row
End With
r.Select
Ответ 3
Tomalak уже дал вам правильный ответ, но я хотел бы добавить, что большую часть времени, когда вы хотели бы знать код VBA, необходимый для выполнения определенного действия в пользовательском интерфейсе, неплохо записать макрос.
В этом случае нажмите "Записать макрос" на вкладке "Разработчик" ленты, заморозите верхнюю строку и затем прекратите запись. Excel будет иметь для вас следующий макрос, который также выполняет задание:
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
Ответ 4
Просто поразите ту же проблему... По какой-то причине команда freezepanes просто заставила перекрестие появиться в центре экрана. Оказывается, я отключил ScreenUpdating! Решено со следующим кодом:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
Теперь он отлично работает.
Ответ 5
Чтобы расширить этот вопрос в области использования вне Excel VBA, свойство ActiveWindow должно быть адресовано как дочерний элемент Excel. Объект приложения.
Пример создания книги Excel из Access:
Используя объект Excel.Application в другом проекте приложения VBA для приложения потребует, чтобы вы добавили библиотеку объектов Microsoft Excel 15.0 (или эквивалентную для своих собственных версия).
Option Explicit
Sub xls_Build__Report()
Dim xlApp As Excel.Application, ws As Worksheet, wb As Workbook
Dim fn As String
Set xlApp = CreateObject("Excel.Application")
xlApp.DisplayAlerts = False
xlApp.Visible = True
Set wb = xlApp.Workbooks.Add
With wb
.Sheets(1).Name = "Report"
With .Sheets("Report")
'report generation here
End With
'This is where the Freeze Pane is dealt with
'Freezes top row
With xlApp.ActiveWindow
.SplitColumn = 0
.SplitRow = 1
.FreezePanes = True
End With
fn = CurrentProject.Path & "\Reports\Report_" & Format(Date, "yyyymmdd") & ".xlsx"
If CBool(Len(Dir(fn, vbNormal))) Then Kill fn
.SaveAs FileName:=fn, FileFormat:=xlOpenXMLWorkbook
End With
Close_and_Quit:
wb.Close False
xlApp.Quit
End Sub
Основной процесс - это просто повторение ранее представленных ответов, но я подумал, что важно продемонстрировать, как работать с ActiveWindow, когда вы не находитесь в собственном VBA Excel. Хотя здесь код VBA, он должен быть непосредственно транскрибируемым для других языков и платформ.
Ответ 6
Rows("2:2").Select
ActiveWindow.FreezePanes = True
Это самый простой способ заморозить верхнюю строку. Правило для FreezePanes
- это заморозить верхний левый угол из выбранной ячейки. Например, если вы выделите C10, он замерзнет между столбцами B и C, строками 9 и 10. Поэтому, когда вы выделяете строку 2, она фактически замирает между строками 1 и 2, которая является верхней строкой.
Кроме того, .SplitColumn
или .SplitRow
разделит ваше окно, как только вы разморозите его, что не так, как мне нравится.