Как программно заморозить верхнюю строку листа 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 разделит ваше окно, как только вы разморозите его, что не так, как мне нравится.