Как программно заморозить верхнюю строку листа Excel в Excel 2007 VBA?
Я ищу, чтобы программно заморозить верхнюю строку листа Excel из VBA. Конечная цель состоит в том, чтобы произвести тот же эффект, что и View > Freeze Panes > Freeze Top Row
команда в Excel 2007, чтобы верхняя строка листа была заморожена, и пользователи могли видеть верхнюю строку листа даже при прокрутке данных.
6 ответов
Rows("2:2").Select
ActiveWindow.FreezePanes = True
выберите другой диапазон для другого эффекта, почти так же, как вы сделали бы вручную. "Замораживание верхней строки" действительно просто ярлык новый в Excel 2007 (и выше), он не содержит никаких дополнительных функций по сравнению с более ранними версиями Excel.
Tomalak уже дал вам правильный ответ, но я хотел бы добавить, что в большинстве случаев, когда вы хотели бы знать код VBA, необходимый для выполнения определенного действия в пользовательском интерфейсе, это хорошая идея записать макрос.
в этом случае Нажмите кнопку Записать Макрос на вкладке разработчик ленты, заморозить верхнюю строку, а затем остановить запись. Excel будет иметь следующий макрос, записанный для вас, который также выполняет эту работу:
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
проблема с записанным макросом такая же, как и проблема со встроенным действием: 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
просто попал в ту же проблему... По какой-то причине команда freezepanes просто заставила перекрестие появиться в центре экрана. Получается oout я перешел свойство screenupdating прочь! Решается со следующим кодом:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
теперь он работает нормально.
чтобы развернуть этот вопрос в область использования за пределами Excel s собственный VBA,activewindow содержит собственность должно быть адресовано как дитя Excel.Объект приложения.
пример создания книги Excel из Access:
С помощью Excel.Объект приложения в проекте VBA другого приложения Office потребуется добавить библиотеку объектов 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, оно должно быть напрямую transcribable на другие языки и платформы.
Rows("2:2").Select
ActiveWindow.FreezePanes = True
Это самый простой способ заморозить верхнем ряду. Правило для FreezePanes
это заморозит верхний левый угол из выбранной ячейки. Например, если вы выделите C10, он замерзнет между столбцами B и C, строками 9 и 10. Поэтому, когда вы выделяете строку 2, она фактически замерзает между строками 1 и 2, которые являются верхней строкой.
и .SplitColumn
или .SplitRow
разделит ваше окно, как только вы разморозите его, что не так, как мне нравится.