Нельзя установить свойство freezepanes в excel
Добрый день! Подскажите, пожалуйста, как можно быстро закрепить области на всех листах? Если сгруппировать листы и закрепить область на одном листе, то это закрепление на другие листы не распространяется.
Добрый день! Подскажите, пожалуйста, как можно быстро закрепить области на всех листах? Если сгруппировать листы и закрепить область на одном листе, то это закрепление на другие листы не распространяется. Мурад
Sub freezeAll()
Dim sh0 As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
If Val(sh.Name) > 0 Then
sh.Activate
Set c0 = ActiveCell
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
End If
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
Sub freezeAll()
Dim sh0 As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
If Val(sh.Name) > 0 Then
sh.Activate
Set c0 = ActiveCell
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
End If
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
Sub freezeAll()
Dim sh0 As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
If Val(sh.Name) > 0 Then
sh.Activate
Set c0 = ActiveCell
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
End If
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
AndreTM, вставил, запустил. Ошибок не возникает, но закрепления ни на одном листе не происходит почему-то
AndreTM, вставил, запустил. Ошибок не возникает, но закрепления ни на одном листе не происходит почему-то Мурад
А имена листов у вас точно как в примере - только "числовые"?
Иначе вам надо убрать строчки if и end if, чтобы проверка не выполнялась (или прописать в условие собственную проверку имен листов).
Sub freezeAll()
Dim sh0 As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
' If Val(sh.Name) > 0 Then
sh.Activate
Set c0 = ActiveCell
ActiveWindow.FreezePanes = False
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
' End If
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
Тут ведь как - я предположил, что у вас, кроме этих листов, в книге и другие листы могут быть, которые закреплять не надо.
Ну и да - если у вас 2007/2010, то сохраните файл как файл с макросами (*.xlsm) и разрешите их исполнение.
А имена листов у вас точно как в примере - только "числовые"?
Иначе вам надо убрать строчки if и end if, чтобы проверка не выполнялась (или прописать в условие собственную проверку имен листов).
Sub freezeAll()
Dim sh0 As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
' If Val(sh.Name) > 0 Then
sh.Activate
Set c0 = ActiveCell
ActiveWindow.FreezePanes = False
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
' End If
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
Тут ведь как - я предположил, что у вас, кроме этих листов, в книге и другие листы могут быть, которые закреплять не надо.
Ну и да - если у вас 2007/2010, то сохраните файл как файл с макросами (*.xlsm) и разрешите их исполнение. AndreTM
Skype: andre.tm.007
Donate: Q iwi: 9517375010
Sub freezeAll()
Dim sh0 As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
' If Val(sh.Name) > 0 Then
sh.Activate
Set c0 = ActiveCell
ActiveWindow.FreezePanes = False
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
' End If
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
Тут ведь как - я предположил, что у вас, кроме этих листов, в книге и другие листы могут быть, которые закреплять не надо.
Ну и да - если у вас 2007/2010, то сохраните файл как файл с макросами (*.xlsm) и разрешите их исполнение. Автор - AndreTM
Дата добавления - 25.05.2015 в 11:58
Sub primer()
Application.ScreenUpdating = False
For Each sh In ThisWorkbook.Sheets
sh.Activate
With ActiveWindow
.SplitColumn = 0'номер закрепленного столбца
.SplitRow = 1'номер закрепленной строки
End With
ActiveWindow.FreezePanes = True
Next sh
Application.ScreenUpdating = True
End Sub
Sub primer()
Application.ScreenUpdating = False
For Each sh In ThisWorkbook.Sheets
sh.Activate
With ActiveWindow
.SplitColumn = 0'номер закрепленного столбца
.SplitRow = 1'номер закрепленной строки
End With
ActiveWindow.FreezePanes = True
Next sh
Application.ScreenUpdating = True
End Sub
Sub primer()
Application.ScreenUpdating = False
For Each sh In ThisWorkbook.Sheets
sh.Activate
With ActiveWindow
.SplitColumn = 0'номер закрепленного столбца
.SplitRow = 1'номер закрепленной строки
End With
ActiveWindow.FreezePanes = True
Next sh
Application.ScreenUpdating = True
End Sub
[/vba]
[p.s.]Количество листов сократила, а то файл по размеру не проходит. [/p.s.] Автор - Manyasha
Дата добавления - 25.05.2015 в 12:01
В моей рабочей книге имена листов пронумерованы от 0 до 132. Не думал, что это влияет на работу макроса.
В моей рабочей книге имена листов пронумерованы от 0 до 132. Не думал, что это влияет на работу макроса. Мурад
Sub freezeAll()
Dim sh0 As Worksheet, sh As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
sh.Activate
Set c0 = ActiveCell
ActiveWindow.FreezePanes = False
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
Sub freezeAll()
Dim sh0 As Worksheet, sh As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
sh.Activate
Set c0 = ActiveCell
ActiveWindow.FreezePanes = False
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
С уважением,
Алексей
MS Excel 2003 - the best.
Sub freezeAll()
Dim sh0 As Worksheet, sh As Worksheet, c0 As Range
Application.ScreenUpdating = False
Set sh0 = ActiveSheet
For Each sh In ThisWorkbook.Sheets
sh.Activate
Set c0 = ActiveCell
ActiveWindow.FreezePanes = False
Rows("2:2").Select
ActiveWindow.FreezePanes = True
c0.Select
Next
sh0.Activate
Application.ScreenUpdating = True
End Sub
AndreTM, Вы правы, только что проверила. Закрепление происходит нормально, а вот если его снять вручную, лист остается разделенным.
AndreTM, Вы правы, только что проверила. Закрепление происходит нормально, а вот если его снять вручную, лист остается разделенным. Manyasha
Alex_ST, я открыл файл со 132 листами, вставил Option Explicit, затем сразу под ним код, который Вы написали в своем посте. Запустил - никаких изменений или ошибок, просто частое моргание экрана и все.
Alex_ST, я открыл файл со 132 листами, вставил Option Explicit, затем сразу под ним код, который Вы написали в своем посте. Запустил - никаких изменений или ошибок, просто частое моргание экрана и все. Мурад
Моргание экрана.
Это с чего бы вдруг? Ведь в начале перед циклом стоит Application.ScreenUpdating = False, а по завершении Application.ScreenUpdating = True
Ничего мигать не должно!
Я бы, правда, написАл чуть по-другому - так, чтобы границы закрепления не задавались жёстко 2:2, а определялись по выделенной на активном в момент запуска листе ячейкой (ну не люблю я процедур с прописанными в теле диапазонами), но это сути не меняет.
Код практически точно такой же, как у Андрея (AndreTM):
Sub freezeAll2()
Dim oSh0 As Worksheet, oSh As Worksheet, rCell0 As Range, lRow&, lCol&
Application.ScreenUpdating = False
Set oSh0 = ActiveSheet: lRow = ActiveCell.Row: lCol = ActiveCell.Column
For Each oSh In ThisWorkbook.Worksheets
oSh.Activate
Set rCell0 = ActiveCell
ActiveWindow.FreezePanes = False
Cells(lRow, lCol).Select
ActiveWindow.FreezePanes = True
rCell0.Select
Next
oSh0.Activate
Application.ScreenUpdating = True
End Sub
Моргание экрана.
Это с чего бы вдруг? Ведь в начале перед циклом стоит Application.ScreenUpdating = False, а по завершении Application.ScreenUpdating = True
Ничего мигать не должно!
Я бы, правда, написАл чуть по-другому - так, чтобы границы закрепления не задавались жёстко 2:2, а определялись по выделенной на активном в момент запуска листе ячейкой (ну не люблю я процедур с прописанными в теле диапазонами), но это сути не меняет.
Код практически точно такой же, как у Андрея (AndreTM):
Sub freezeAll2()
Dim oSh0 As Worksheet, oSh As Worksheet, rCell0 As Range, lRow&, lCol&
Application.ScreenUpdating = False
Set oSh0 = ActiveSheet: lRow = ActiveCell.Row: lCol = ActiveCell.Column
For Each oSh In ThisWorkbook.Worksheets
oSh.Activate
Set rCell0 = ActiveCell
ActiveWindow.FreezePanes = False
Cells(lRow, lCol).Select
ActiveWindow.FreezePanes = True
rCell0.Select
Next
oSh0.Activate
Application.ScreenUpdating = True
End Sub
С уважением,
Алексей
MS Excel 2003 - the best.
Моргание экрана.
Это с чего бы вдруг? Ведь в начале перед циклом стоит Application.ScreenUpdating = False, а по завершении Application.ScreenUpdating = True
Ничего мигать не должно!
Я бы, правда, написАл чуть по-другому - так, чтобы границы закрепления не задавались жёстко 2:2, а определялись по выделенной на активном в момент запуска листе ячейкой (ну не люблю я процедур с прописанными в теле диапазонами), но это сути не меняет.
Код практически точно такой же, как у Андрея (AndreTM):
Sub freezeAll2()
Dim oSh0 As Worksheet, oSh As Worksheet, rCell0 As Range, lRow&, lCol&
Application.ScreenUpdating = False
Set oSh0 = ActiveSheet: lRow = ActiveCell.Row: lCol = ActiveCell.Column
For Each oSh In ThisWorkbook.Worksheets
oSh.Activate
Set rCell0 = ActiveCell
ActiveWindow.FreezePanes = False
Cells(lRow, lCol).Select
ActiveWindow.FreezePanes = True
rCell0.Select
Next
oSh0.Activate
Application.ScreenUpdating = True
End Sub
К стати, код Вы поместили в стандартный модуль, надеюсь, а не в модуль листа? Автор - Alex_ST
Дата добавления - 25.05.2015 в 15:04
Я, к сожалению, свой файл-пример с работающим макросом выложить не могу - собаки-сисадмины не дают.
Но у Вас какие-то чудеса.
Попробуйте для начала на новом чистом файле.
А может быть это кто-то из других процедур события смены листов или пересчёт перехватывает?
Попробуйте-ка всё события запретить:
Sub freezeAll3()
Dim oSh0 As Worksheet, oSh As Worksheet, rCell0 As Range, lRow&, lCol&
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
Set oSh0 = ActiveSheet: lRow = ActiveCell.Row: lCol = ActiveCell.Column
For Each oSh In ThisWorkbook.Worksheets
oSh.Activate
Set rCell0 = ActiveCell
ActiveWindow.FreezePanes = False
Cells(lRow, lCol).Select
ActiveWindow.FreezePanes = True
rCell0.Select
Next
oSh0.Activate
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
Я, к сожалению, свой файл-пример с работающим макросом выложить не могу - собаки-сисадмины не дают.
Но у Вас какие-то чудеса.
Попробуйте для начала на новом чистом файле.
А может быть это кто-то из других процедур события смены листов или пересчёт перехватывает?
Попробуйте-ка всё события запретить:
Sub freezeAll3()
Dim oSh0 As Worksheet, oSh As Worksheet, rCell0 As Range, lRow&, lCol&
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
Set oSh0 = ActiveSheet: lRow = ActiveCell.Row: lCol = ActiveCell.Column
For Each oSh In ThisWorkbook.Worksheets
oSh.Activate
Set rCell0 = ActiveCell
ActiveWindow.FreezePanes = False
Cells(lRow, lCol).Select
ActiveWindow.FreezePanes = True
rCell0.Select
Next
oSh0.Activate
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
С уважением,
Алексей
MS Excel 2003 - the best.
Sub freezeAll3()
Dim oSh0 As Worksheet, oSh As Worksheet, rCell0 As Range, lRow&, lCol&
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With
Set oSh0 = ActiveSheet: lRow = ActiveCell.Row: lCol = ActiveCell.Column
For Each oSh In ThisWorkbook.Worksheets
oSh.Activate
Set rCell0 = ActiveCell
ActiveWindow.FreezePanes = False
Cells(lRow, lCol).Select
ActiveWindow.FreezePanes = True
rCell0.Select
Next
oSh0.Activate
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
Я ищу, чтобы программно заморозить верхнюю строку листа 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 разделит ваше окно, как только вы разморозите его, что не так, как мне нравится.
Я построил 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, которая заполняет рабочий лист данными из базы данных. Я также добавляю некоторые стили и блокирую некоторые строки и столбцы с помощью FreezePanes.
В Excel 2010/2013 все это работало как прелесть, но недавно я перешел на Excel 2016 (Office 365), и с тех пор у меня возникли проблемы с FreezePanes, когда мой лист Excel не был на переднем плане. Я искал в Интернете, и единственное, с чем я сталкивался, это то, что я могу только предварительно создать FreezePanes на активном листе, я знал это - я уже активирую лист перед установкой FreezePanes. Это работало в Excel 2010, хотя физически мой Excel не был отправлен на первый план.
Excel из офиса 365, вероятно, действительно хочет, чтобы моя рабочая таблица Excel была физически на переднем плане, но worksheet.Activate() не помогает, и я также попробовал следующий код:
Но это тоже не сработало. Может ли кто-нибудь помочь мне с этим?
Чтобы быть ясным: версия моего Excel является 2016 Версия 1611 (Build 7571.2109)
4 ответа
Да! Я исправил это, как предложил Xatoo, добавив:
Важно добавить, что это решение работает только тогда, когда на самом деле окно свернуто, поэтому вам нужно проверить это.
Забавная деталь в том, что это все еще не отправляет окно на передний план.
Возможно ли, что worksheet.Application.ActiveWindow не является окном, содержащим ваш активный рабочий лист? В предыдущих версиях Excel все книги имели одно и то же окно, но поскольку Microsoft удалила MDI для Excel, у вас могут неожиданно появиться два разных окна, использующих один и тот же код, как и раньше. Смешивание этих окон может привести к проблеме, с которой вы столкнетесь.
Еще одна вещь, которую вы можете попробовать - установить состояние окна в нормальное состояние перед вызовом FreezePane:
И еще одна возможность заключается в том, что это на самом деле ошибка в Excel. Я нашел кого-то, у кого была такая же проблема, но неясно, решил ли этот человек проблему или заполнил отчет об ошибке:
Есть ли возможность сделать это в VBA?
Если вы хотите проверить, действительно ли лист активен, вы можете сделать:
Вы можете установить 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 разделят ваше окно, как только вы его разморозите, что мне не нравится.
Читайте также: