Нельзя установить свойство freezepanes в excel

Обновлено: 03.07.2024

Я построил Excel addin, который заполняет лист данными из базы данных. Я также добавляю некоторые стили и блокирую некоторые строки и столбцы с помощью FreezePanes.

все это работало как шарм в excel 2010/2013, но я недавно переключился на excel 2016 (office 365), и с тех пор у меня были проблемы с FreezePanes, когда мой лист excel не находится на переднем плане. Я искал в интернете, и единственное, с чем я сталкиваюсь, это то, что я могу только преформировать FreezePanes на активный лист, я знал это - я уже активировал лист перед установкой морозильных камер. Это работало в excel 2010, хотя физически мой excel не был отправлен на передний план.

Excel из office 365, вероятно, действительно хочет, чтобы мой лист excel физически находился на переднем плане, но worksheet.Activate() не помогло и я также попробовал следующий код:

но это тоже не сработало. Кто-нибудь может мне помочь?

чтобы быть ясным: версия из моего excel 2016 Версия 1611 (Build 7571.2109)

может, worksheet.Application.ActiveWindow не является ли окно, содержащее ваш активный рабочий лист? В предыдущих версиях Excel все книги имели одно и то же окно, но так как Microsoft отбросила MDI для Excel, вы можете внезапно иметь два разных окна, используя тот же код, что и раньше. Смешивание этих окон может привести к проблеме, с которой вы столкнулись.

еще одна вещь, которую вы можете попробовать, - это установить состояние окна в нормальное состояние перед вызовом FreezePane:

и еще одна возможность заключается в том, что это на самом деле ошибка в Excel. Я нашел кого-то еще, у кого была такая же проблема, но неясно, решил ли этот человек проблему или заполнил ошибку доклад:

вы можете подать отчет об ошибке с Microsoft и подождать, чтобы увидеть, могут ли они подтвердить это как ошибку.

есть ли возможность сделать это в VBA?

Если вы хотите проверить, действительно ли лист активен, вы можете сделать:

да! Я исправил это, как Xatoo предложил с добавлением:

важно добавить, что это решение работает только тогда, когда фактически окно свернуто, поэтому вам нужно проверить это.

забавная деталь заключается в том, что это все еще не отправляет окно на передний план.

вы можете установить xlMaximized для лучшей практики. Потому что xlNormal может же xlMinimized, так что получить ошибку снова.

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

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

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

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

Проблема с записанным макросом такая же, как и со встроенным действием: Excel выбирает закрепить верхнюю видимую строку, а не фактическую верхнюю строку, в которой можно найти информацию заголовка.

Я использую Office 2011 для Mac OS X Lion

Обновление (через 2 минуты):

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

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

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

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

Использование объекта Excel.Application в проекте VBA другого приложения Office приведет к требуется добавить библиотеку объектов Microsoft Excel 15.0 (или эквивалентную для вашей собственной версии).

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

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

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

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

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

проблема с записанным макросом такая же, как и проблема со встроенным действием: Excel выбирает замораживание верхнего видимого строка, а не фактическая верхняя строка, в которой можно найти информацию заголовка.

Я использую Office 2011 для Mac OS X Lion

обновление (2 минуты спустя):

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

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

чтобы развернуть этот вопрос в область использования за пределами Excel s собственный VBA,activewindow содержит собственность должно быть адресовано как дитя Excel.Объект приложения.

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

С помощью Excel.Объект приложения в проекте VBA другого приложения Office потребуется добавить библиотеку объектов Microsoft Excel 15.0 (или эквивалент для вашего собственного версия.)

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

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

I have a VBA script in Excel that freezes the panes of an Excel worksheet, but I'm curious to see if this is possible without first selecting a range. Here's by code now which freezes rows 1 through 7:


1,990 3 3 gold badges 13 13 silver badges 19 19 bronze badges


2,526 5 5 gold badges 26 26 silver badges 53 53 bronze badges

9 Answers 9

Record yourself using the View ► Freeze Panes ► Freeze Top Row command and this is what you get for .FreezePanes.

So modifying the .SplitColumn and/or .SplitRow properties should do it for you regardless on what the ActiveCell property is.

Nicely done! For everyone else, note that the SplitColumn/SplitRow values represent the last cell above/left of the split. So to freeze rows 1 through 7 and separate them from rows 8 onward, the code looks like this: With ActiveWindow .SplitColumn = 0 .SplitRow = 7 End With ActiveWindow.FreezePanes = True I was thinking that something like If .FreezePanes Then .FreezePanes = False might be appropriate as the first line inside the With ActiveWindow block. You can avoid using ActiveWindow if you instead access the Window object via Application.Windows("[window name]"), where [window name] is the Workbook.Name Code causes bug, when you try to freeze and are you have a cell activated far away from where you intend to freeze. I intend to freeze the first column and a number of rows and the rows are correctly frozen, but for the columns the first visible column is frozen, which is arbitrary. If I then manually unfreeze, it remains as split screen. I tried to add activate before the code, which had no effect (probably because I turned Screenupdate off to speed up my macro). I then tried the solution posted by z32a7ul and that worked. I guess what makes the difference is the adding of Scroll.

There are many things to get wrong about freezing panes. I add my own answer, so I will find it here, and won't have to reinvent it next time.

  • The input parameter is the top left cell of the bottom right pane; I think this is the most frequent use case: you know the range at which to split and don't care about which workbook / worksheet / window it is in
  • If the input parameter is in the first row / first cell but not A1, then there will be only two panes; A1 is a special case, however, Excel would split the window at center of the current view, I prevented this because I can't think of any case where this would be intended
  • It iterates through all Windows attached to the workbook / worksheet; indexing into Application.Windows ( Windows(Thisworkbook.Name) ) won't cause an error if you have more windows to the same workbook (the name would be "MyWorkbook:1"), or Excel attempted (which usually fails) to repair a workbook after a crash (the name would be "MyWorkbook [Repaired]")
  • It takes into consideration that panes may already be frozen and the user / another macro might have scrolled to a location in the workbook, and the top left cell in the window is not A1


2,824 3 3 gold badges 15 15 silver badges 35 35 bronze badges

I found the previous answers only worked with some sheets when looping through tabs . I found the following code worked on every tab I looped through (target was a single workbook ), despite which workbook was the activeworkbook .

The short of it:

The code as it is in my Sub : (be aware, I do a lot more formatting in this sub, I tried to strip that out and leave just the code needed here)

Hopefully, this will save someone some research time in the future.


I need to be able to properly refreeze panes (when creating new windows, notably) without losing the activecell or messing up the visible range. It took a lot of playing around but I think I have something solid that works:

20.2k 9 9 gold badges 55 55 silver badges 98 98 bronze badges


I know this is old but I came across this tidbit that may be useful. as ChrisB stated, the SplitColumn/SplitRow values represent the last cell above/left of the split BUT of the currently visible window. So if you happen to have code like this:

The split will be between rows 110 and 111 instead of 10 and 11.

edited for clarification and to add more information:
My point is that the values are offsets of the upper left cell, not an address of a cell. Therefore, ChrisB's Dec 4 '15 at 18:34 comment under the main answer only holds if row 1 is visible in the Activewindow.

Читайте также: