Как программно заморозить верхнюю строку листа Excel в Excel 2007 VBA? - PullRequest
37 голосов
/ 13 июля 2010

Я хочу программно заморозить верхнюю строку листа Excel из VBA.Конечная цель состоит в том, чтобы создать тот же эффект, что и команда View > Freeze Panes > Freeze Top Row в Excel 2007, чтобы верхний ряд рабочего листа был заморожен, и пользователи могли видеть верхний ряд рабочего листа даже при прокрутке данных.

Ответы [ 6 ]

39 голосов
/ 13 июля 2010
Rows("2:2").Select
ActiveWindow.FreezePanes = True

Выберите другой диапазон для другого эффекта, почти так же, как вы сделали бы вручную.«Freeze Top Row» на самом деле просто ярлык, новый в Excel 2007 (и выше), он не содержит дополнительных функций по сравнению с предыдущими версиями Excel.

17 голосов
/ 13 июля 2010

Томалак уже дал вам правильный ответ, но я хотел бы добавить, что в большинстве случаев, когда вы хотите знать код VBA, необходимый для выполнения определенного действия в пользовательском интерфейсе, рекомендуется записать макрос.

В этом случае нажмите Запись макроса на вкладке разработчика ленты, остановите верхний ряд и остановите запись.В Excel будет записан следующий макрос, который также выполняет эту работу:

With ActiveWindow
    .SplitColumn = 0
    .SplitRow = 1
End With
ActiveWindow.FreezePanes = True
13 голосов
/ 13 июля 2012

Проблема с записанным макросом такая же, как и проблема со встроенным действием: 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 
8 голосов
/ 14 октября 2013

Просто нажмите на ту же проблему ... По какой-то причине команда freezepanes просто привела к появлению перекрестия в центре экрана.Оказывается, я выключил ScreenUpdating!Решено с помощью следующего кода:

Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True

Теперь все работает нормально.

6 голосов
/ 29 июля 2015

Чтобы расширить этот вопрос в области использования за пределами Excel Для собственного VBA свойство ActiveWindow должно рассматриваться как дочерний элемент объекта Excel.Application .

.

Пример создания книги Excel из Access:

Использование объекта Excel.Application в проекте 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, он должен быть напрямую переведен на другие языки и платформы.

3 голосов
/ 28 июля 2015
Rows("2:2").Select
ActiveWindow.FreezePanes = True

Это самый простой способ заморозить верхний ряд. Правило FreezePanes гласит, что верхний левый угол будет зафиксирован в выбранной вами ячейке. Например, если вы выделите C10, он будет зависать между столбцами B и C, строками 9 и 10. Поэтому, когда вы выделяете строку 2, он фактически останавливается между строками 1 и 2, которая является верхней строкой.

Кроме того, .SplitColumn или .SplitRow разделит ваше окно, как только вы разморозите его, что мне не нравится.

...