Подтвердить что ты не робот

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

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

4b9b3361

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