Vba excel freezepanes закрепить области

Содержание

  1. VBA — стоп-кадры
  2. Заморозить панели с помощью VBA
  3. Принудительное сохранение рабочей книги без закрепления панелей
  4. Excel VBA freeze panes using FreezePanes property
  5. Freeze Panes in Excel spreadsheet
  6. Freeze Row
  7. Freeze Column
  8. Freeze Row + Column
  9. Freeze Panes in Excel VBA
  10. Freeze Row
  11. Freeze Column
  12. Freeze row + column
  13. Unfreeze Panes
  14. Use Split to freeze Panes in Excel VBA
  15. Vba excel freezepanes закрепить области
  16. Как применить заморозить / разморозить панели сразу к нескольким листам?
  17. Примените Freeze Panes ко всем листам одновременно с кодом VBA
  18. Примените Unfreeze Panes ко всем листам сразу с кодом VBA
  19. Примените замораживание / разморозить панели ко всем рабочим листам сразу одним щелчком мыши с помощью Kutools for Excel
  20. How can I programmatically freeze the top row of an Excel worksheet in Excel 2007 VBA?
  21. 6 Answers 6
  22. VBA – Freeze Panes
  23. Freeze Panes Using VBA
  24. Force Workbook to Save Without Freeze Panes
  25. VBA Coding Made Easy
  26. VBA Code Examples Add-in

VBA — стоп-кадры

Заморозить панели с помощью VBA

Недавно я писал о замораживании панелей в Excel, вот как это можно сделать с помощью VBA:

Заморозить строки

Закрепить столбцы

Закрепить строки и столбцы

Панели UnFreeze

Принудительное сохранение рабочей книги без закрепления панелей

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

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

Итак, в этой статье мы соберем код, который будет проверять, включены ли Freeze Panes, и если да, то файл не будет сохранен. Это означает, что мне нужно сохранить его без замораживания — чтобы мои коллеги были довольны !!

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

Чтобы получить доступ к уровню книги, выполните следующие действия:

1. Щелкните правой кнопкой мыши книгу Excel — просмотрите код:

3. Дважды щелкните «Эта книга», а затем выберите «Рабочая книга» в первом раскрывающемся списке слева:

Мы видим, что значение слева теперь изменилось на «Открыть» — с некоторым кодом для события открытия книги. Этот код позволит нам определить, что происходит, когда книга открывается в первый раз.

Однако мы хотим контролировать, что происходит, когда мы сохраняем книгу. Поэтому измените правое раскрывающееся меню на «Перед сохранением». Экран теперь будет выглядеть так:

Теперь мы вставляем следующий код после объявления:

Итак, теперь полный код выглядит так:

Теперь сохраните файл и ЗАТЕМ активируйте Freeze Panes в любом окне. Затем — ВОССТАНОВИТЕ файл. Появится сообщение о том, что «Freeze Panes» включен — и файл не сохранен.

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

Источник

Excel VBA freeze panes using FreezePanes property

This Excel tutorial explains how to freeze panes in Excel spreadsheet and freeze panes in Excel VBA using FreezePanes property.

Freeze Panes in Excel spreadsheet

To explain how to freeze panes in Excel VBA, first I have to explain how to freeze panes in Excel spreadsheet.

Freeze Row

The most common kind of freeze panes is to freeze the first row as it contains the header of the column. So that when you scroll down the spreadsheet, you can still see the header in row 1.

Highlight row 2, navigate to View > Freeze Panes > Freeze Panes

Similarly, you can freeze row 2 by highlighting row 3 (highlight one row down the frozen row).

Freeze Column

To display data all the time in column A when you scroll to the right of the spreadsheet, highlight column B, , navigate to View > Freeze Panes > Freeze Panes

Similarly, you can freeze column A and B by highlighting column C (highlight the right column of the target frozen column).

Freeze Row + Column

To freeze column A and row 1 at the same time, select column B2, navigate to View > Freeze Panes > Freeze Panes

In the screenshot, I have highlighted the direction of freeze of a selected cell, it is the top row and left column of a selected Cell.

Freeze Panes in Excel VBA

Similar to freeze panes in Excel spreadsheet, to freeze panes in Excel VBA, select a Cell first, then set ActiveWindow.FreezePanes Property to TRUE.

Freeze Row

To freeze row 1, select Row 2. Setting FreezePanes to False is to ensure that we have unfrozen any active freezePanes first. FreezePanes won’t work if there is already a FreezePanes.

Freeze Column

To freeze column A, select column B.

Freeze row + column

To freeze column A and row 1, select Cell B2.

Unfreeze Panes

To unfreeze panes, simply set the FreezePanes Property to False.

Use Split to freeze Panes in Excel VBA

Instead of selecting a Cell to determine the freeze panes, we can also apply Split first, and then Set FreezePanes to TRUE.

Источник

Vba excel freezepanes закрепить области

Как применить заморозить / разморозить панели сразу к нескольким листам?

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

Примените Freeze Panes ко всем листам одновременно с кодом VBA

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

1. Если вы хотите зафиксировать все листы в одном месте, выберите ячейку, которую вы хотите зафиксировать на листе, а затем удерживайте Shift клавишу, чтобы выбрать все вкладки листа.

2. Удерживайте ALT + F11 ключи, и он открывает Окно Microsoft Visual Basic для приложений.

3. Нажмите Вставить > Модулии вставьте следующий код в Окно модуля.

Код VBA: заморозить сразу все листы в Excel

4, Затем нажмите F5 для запуска этого кода, и все рабочие листы были применены с закрепленными панелями в одном и том же положении.

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

Примените Unfreeze Panes ко всем листам сразу с кодом VBA

Если к закрепленным областям в Excel применяется несколько листов, как вы могли бы размораживать их одновременно, кроме как размораживать их по одному?

1. Запустите книгу, листы которой были применены с закрепленными панелями.

2. Удерживайте ALT + F11 ключи, и он открывает Окно Microsoft Visual Basic для приложений.

3. Нажмите Вставить > Модулии вставьте следующий код в Окно модуля.

Код VBA: разблокировать сразу все листы в Excel

4, Затем нажмите F5 ключ для запуска этого кода, и все рабочие листы, которые применялись с закрепленными панелями, были разморожены сразу.

Примените замораживание / разморозить панели ко всем рабочим листам сразу одним щелчком мыши с помощью Kutools for Excel

Если вы не знакомы с кодами VBA, вот мощный инструмент: Kutools for Excel, Его Закрепить области нескольких листов и Разморозить панели нескольких листов Утилиты могут помочь вам заморозить или разморозить сразу все рабочие листы текущей книги.

Примечание: Чтобы применить это Закрепить области нескольких листов, во-первых, вы должны скачать Kutools for Excel, а затем быстро и легко примените эту функцию.

После установки Kutools for Excel, пожалуйста, сделайте так:

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

2. Затем нажмите Кутулс Плюс > Рабочий лист > Закрепить области нескольких листов, см. снимок экрана:

3. И затем ко всем вашим рабочим листам были применены закрепленные области в том же месте ячейки B2.

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

Источник

How can I programmatically freeze the top row of an Excel worksheet in Excel 2007 VBA?

I am looking to programmatically freeze the top row of an Excel worksheet from VBA. The end goal is to produce the same effect as the View > Freeze Panes > Freeze Top Row command in Excel 2007 so that the top row of the worksheet is frozen and users can see the top row of the worksheet even as they scroll through the data.

6 Answers 6

Select a different range for a different effect, much the same way you would do manually. The «Freeze Top Row» really just is a shortcut new in Excel 2007 (and up), it contains no added functionality compared to earlier versions of Excel.

Tomalak already gave you a correct answer, but I would like to add that most of the times when you would like to know the VBA code needed to do a certain action in the user interface it is a good idea to record a macro.

In this case click Record Macro on the developer tab of the Ribbon, freeze the top row and then stop recording. Excel will have the following macro recorded for you which also does the job:

The problem with the recorded macro is the same as the problem with the built-in action: Excel chooses to freeze the top visible row, rather than the actual top row where the header information can be found.

The purpose of a macro in this case is to freeze the actual top row. When I am viewing row #405592 and I need to check the header for the column (because I forgot to freeze rows when I opened the file), I have to scroll to the top, freeze the top row, then find my way back to row #405592 again. Since I believe this is stupid behavior, I want a macro to correct it, but, like I said, the recorded macro just mimics the same stupid behavior.

Источник

VBA – Freeze Panes

In this Article

Freeze Panes Using VBA

I recently posted on Freezing panes in Excel, here’s how you can do it using VBA:

Freeze Rows and Columns

Force Workbook to Save Without Freeze Panes

Excel lets us control things through events. This article isn’t a detail discussion on what events are or their features. Instead it gives an example of a WorkBook Event. These are events that are held at the workbook level rather than a particular worksheet.

Through VBA we can control what happens at certain events such as before printing or before saving. One common problem that I face is that a number of people I work with don’t like files with Freeze Panes on them.

So in this article, we will put together some code that will check if Freeze Panes is on and if so, it won’t save the file. This means that I have to save it without freeze panes – keeping my colleagues happy !!

The most important thing about workbook events is that they should be saved in the correct place – at the workbook level.

To access the workbook level, follow the steps below:

1. Right click on an Excel workbook – view code:

2. This will bring up:

3. Double click on “This Workbook” and then select “WorkBook” from the first drop down on the left hand side:

We see that the value on the left hand side has now changed to “Open” – with some code for the Workbook Open Event. This code will let us determine what happens when the workbook opens for the first time.

However we want to control what happens when we save the workbook. So change the right hand drop down to “Before Save” . The screen will now look like:

We now insert the following code after the declaration:

So that the complete code now looks like:

Now save the file and THEN activate Freeze Panes in any window. Then – RESAVE the file. A msgbox will appear stating that “Freeze Panes” is on – and the file is not saved.

Indeed the file will not save until Freeze Panes is removed.

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

Источник

0 / 0 / 0

Регистрация: 17.10.2011

Сообщений: 3

1

17.10.2011, 17:48. Показов 24478. Ответов 8


Студворк — интернет-сервис помощи студентам

Подскажите, как с помощью VB установить закрепление областей в Excel.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

17.10.2011, 17:48

8

Tsvet

3 / 3 / 0

Регистрация: 08.09.2011

Сообщений: 111

17.10.2011, 18:14

2

В принципе и макрорекодер может помочь справиться с этой задачей, типа вот так:

Visual Basic
1
2
3
4
5
6
7
8
With ActiveWindow
        .SplitColumn = 5
        .SplitRow = 6
    End With
    ActiveWindow.SplitRow = 14 ' нужное значение
    ActiveWindow.SplitColumn = 3' нужное значение
    ActiveWindow.FreezePanes = True
End Sub

Чтобы снять закрепление — ActiveWindow.FreezePanes = False



0



Tsvet

3 / 3 / 0

Регистрация: 08.09.2011

Сообщений: 111

17.10.2011, 18:33

3

Сорри, не дописал

Visual Basic
1
2
3
4
5
6
Sub снять_закрепление()
With ActiveWindow
        .SplitColumn = 0
        .SplitRow = 0
End With
End Sub



0



0 / 0 / 0

Регистрация: 17.10.2011

Сообщений: 3

17.10.2011, 18:43

 [ТС]

4

спасибо. попробую.



0



Сумрак

17.10.2011, 18:52

5

хех.. нужно явно указывать сколько строк или столбцов.А то она на 4 части экран поделит.

viper-x

65 / 22 / 7

Регистрация: 28.02.2018

Сообщений: 211

21.02.2022, 16:25

6

Сумрак, а как это сделать?
———————————————
Кроме того, мне всегда казалось, что код

Visual Basic
1
2
3
With ActiveWindow
        .SplitColumn = 4
End With

и

Visual Basic
1
ActiveWindow.SplitColumn = 4

делает вроде как одно и то же …или нет?



0



810 / 465 / 180

Регистрация: 09.03.2009

Сообщений: 1,577

21.02.2022, 16:43

7

Код делает одно и то же. With пишется, когда с одним объектом много действий. Меньше писать и выше скорость, потому что эксель уже знает, кого «дергать».



0



viper-x

65 / 22 / 7

Регистрация: 28.02.2018

Сообщений: 211

22.02.2022, 08:46

8

Я пытаюсь закрепить области выше и левее ячейки B2
Код

Visual Basic
1
2
3
4
With ActiveWindow
        .SplitColumn = 1
        .SplitRow = 1
End With

производит разделение экрана в этом месте,
а следующий код убирает его:

Visual Basic
1
2
3
4
With ActiveWindow
        .SplitColumn = 0
        .SplitRow = 0
End With

Код же

Visual Basic
1
2
3
4
[b2].Select
ActiveWindow.FreezePanes = True
'...........
ActiveWindow.FreezePanes = False

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



0



Punkt5

малоболт

1143 / 442 / 193

Регистрация: 30.01.2020

Сообщений: 1,095

22.02.2022, 10:13

9

Цитата
Сообщение от viper-x
Посмотреть сообщение

Можно ли обойтись без лишнего Select?

Можно. Достаточно объединить оба ваших куска кода:

Visual Basic
1
2
3
4
5
6
Sheets(1).Activate 'делаем активным тот лист, который будем разделять
With ActiveWindow
  .SplitColumn = 4
  .SplitRow = 2
  .FreezePanes = True
End With



0



 

Мартын

Пользователь

Сообщений: 282
Регистрация: 22.12.2016

Доброе время всем!
Вопрос простой как три копейки, но ответа пока не нашёл.
Надо закрепить определённую строку (чтобы не прокручивалось всё, что выше её) на НЕактивном листе.
У меня через VBA выводятся таблички на несколько различных листов. У каждой таблички есть «шапка» с автофильтром. Так вот хотелось бы закрепить эти шапки от прокрутки.
Из всего, что нарыл в тырнете, есть только ActiveWindow.FreezePanes=True , но это только для активного окна! А мне кажется очень некрасивым способ мелькать окнами перед носом юзера, переключаясь между листами и фиксируя строки.
Нет ли способа сделать это, не активируя каждый лист?

 

Ivan.kh

Пользователь

Сообщений: 2024
Регистрация: 04.03.2013

Отключите обновление экрана, и ничего мелькать не будет, а в конце вкл. его

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Вместо ActiveWindow ничего писать не пробовали?

FreezePanes работает только с активным листом…

 

Мартын

Пользователь

Сообщений: 282
Регистрация: 22.12.2016

#4

27.09.2017 15:10:11

Цитата
Ivan.kh написал:
Отключите обновление экрана

Была такая мысль, но это-же кривые костыли. Должен быть прямой путь, не могли-же мелкомягкие так «тормознуть».
Ведь как-то где-то же программа запоминает, что на листе1 закрепление есть, а на листе2 его нет. Значит в каком-то месте информация о том, что на листе1 закреплена пятая строка, а на листе2 закреплён шестой столбец хранится! И эта инфа явно привязана к листам. Так неужели не предусмотрен способ эту информацию изменять программно?!?! Как-то это, ИМХО, странно и даже глупо.

Цитата
vikttur написал:
FreezePanes работает только с активным листом

Вот так и умирают мечты….

 

Ivan.kh

Пользователь

Сообщений: 2024
Регистрация: 04.03.2013

#5

27.09.2017 15:15:13

Цитата
Мартын написал:
Была такая мысль, но это-же кривые костыли.

с чего это вдруг.
С такой логикой всякие поделки на VBA- это кривой костыль.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#6

27.09.2017 15:17:47

Цитата
FreezePanes работает только с активным листом

Это только предположение, дополнение к зачеркнутому. Не проверял досконально. Может, и есть решение без активации листа…

Цитата
…где-то же программа запоминает,… неужели не предусмотрен способ эту информацию изменять программно?!?! Как-то это, ИМХО, странно и даже глупо.

Не нужно глупостью называть то, чего не знаете… Возможно, для этого есть свои причины. Ведь не только этот параметр, но и другие нельзя менять без активации листа. И то, что нельзя сделать так, как нужно именно Вам — не глупость.

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

#7

27.09.2017 15:18:36

Цитата
Мартын написал:
не могли-же мелкомягкие так «тормознуть».

— почему? Недооцениваете :)

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#8

27.09.2017 17:32:36

Цитата
Мартын написал:
Ведь как-то где-то же программа запоминает, что на листе1 закрепление есть, а на листе2 его нет. Значит в каком-то месте информация о том, что на листе1 закреплена пятая строка, а на листе2 закреплён шестой столбец хранится!

Да, в XML-схеме файла. Но достучаться до неё при открытом файле невозможно, да и в закрытом я бы не стал туда лезть только для того, чтобы закрепить область.
Но и здесь все не так просто. Перед установкой закрепления необходимо выделить ячейку и сместить лист так, чтобы закрепление было в видимой области. Иначе можно словить такую штуку, как закрепление где-то внизу или вверху, что может привести к невозможности просмотреть нужные данные.
Собственно все эти нюансы и мешают назначить закрепление на неактивном листе — ввиду особенностей объектной модели.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

z-f-s

Пользователь

Сообщений: 20
Регистрация: 03.04.2018

#9

09.04.2020 18:46:01

Да, с закреплением в Excel чудеса! Удалось заставить работать закрепление таким вот странным кодом:

Код
Sub Крепёжжжж()

Application.ScreenUpdating = 0

AC = ActiveCell.Address

  If ActiveWindow.FreezePanes = True Then
     ActiveWindow.FreezePanes = True
     ActiveWindow.FreezePanes = False
  Else
     [CW50].Select
     ActiveWindow.FreezePanes = False
     ActiveWindow.FreezePanes = True
  End If

Range(AC).Select

End Sub

Изменено: z-f-s09.04.2020 18:47:14

 

DAG

Пользователь

Сообщений: 2
Регистрация: 06.06.2018

#10

06.11.2020 22:32:48

Цитата
The_Prist написал:
Собственно все эти нюансы и мешают назначить закрепление на неактивном листе — ввиду особенностей объектной модели.

Добрый день! Весьма вероятно что это так.
Однако остается вопрос — а почему нельзя снять разделение областей на неактивных листах? В этом случае вроде бы не возникает проблема отображаемой ячейки  — нужно просто сделать .FreezePanes = False. У меня изредка возникает задача пробежаться по всем или избранным рабочим листам и, упрощенно выражаясь, сбросить все структурные и оформительские настройки — обесцветить ярлычок, отобразить все данные (или скрыть ярлыки автофильтра), удалить сценарии, ….. и многое другое…. Практически все делается методами объекта Worksheet или присвоением нужных значений его свойствам или свойствам внутренних объектов, а вот для снятия разделения окна почему-то приходится с отключенным обновлением экрана активировать этот рабочий лист и делать через ActiveWindow. Может есть способ обойтись без активации окна?

 

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

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

Изменено: Ігор Гончаренко06.11.2020 23:34:54

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

#12

07.11.2020 10:44:23

Кстати вот тоже вспомнил, что работает только через ActiveWindow:
чтобы изменять положение разрывов печати нужно перейти в страничный режим путем

Код
ActiveWindow.View = xlPageBreakPreview
 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

#13

07.11.2020 13:00:55

Цитата
DAG написал:
пробежаться по всем или избранным рабочим листам

Свойство FreezePanes относится к окну, а не к рабочему листу. Если Вы откроете книгу, состоящую из двух (видимых) листов, то книга будет иметь одно окно:

Код
 Debug.Print ActiveWorkbook.Windows.Count

Если через Меню/Вид/Новое окно добавить второе окно и отображать в окнах разные листы, то тогда можно управлять свойствами  FreezePanes этих окон без предварительного активирования.

Изменено: sokol9207.11.2020 13:04:47

Владимир

Закрепление областей на всех листах

Мурад

Дата: Понедельник, 25.05.2015, 11:19 |
Сообщение № 1

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

Добрый день! Подскажите, пожалуйста, как можно быстро закрепить области на всех листах? Если сгруппировать листы и закрепить область на одном листе, то это закрепление на другие листы не распространяется.

К сообщению приложен файл:

8663169.xlsx
(64.7 Kb)

 

Ответить

AndreTM

Дата: Понедельник, 25.05.2015, 11:47 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Попробуйте, например, такой процедурой (вставить в общий модуль):
[vba]

Код

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

[/vba]


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 11:53 |
Сообщение № 3

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

AndreTM, вставил, запустил. Ошибок не возникает, но закрепления ни на одном листе не происходит почему-то :(

 

Ответить

AndreTM

Дата: Понедельник, 25.05.2015, 11:58 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

А имена листов у вас точно как в примере — только «числовые»?
Иначе вам надо убрать строчки if и end if, чтобы проверка не выполнялась (или прописать в условие собственную проверку имен листов).
Тут ведь как — я предположил, что у вас, кроме этих листов, в книге и другие листы могут быть, которые закреплять не надо.

Ну и да — если у вас 2007/2010, то сохраните файл как файл с макросами (*.xlsm) и разрешите их исполнение…


Skype: andre.tm.007
Donate: Qiwi: 9517375010

Сообщение отредактировал AndreTMПонедельник, 25.05.2015, 12:09

 

Ответить

Manyasha

Дата: Понедельник, 25.05.2015, 12:01 |
Сообщение № 5

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

Вот еще пример:[vba]

Код

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.]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 12:04 |
Сообщение № 6

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

В моей рабочей книге имена листов пронумерованы от 0 до 132. Не думал, что это влияет на работу макроса.

 

Ответить

AndreTM

Дата: Понедельник, 25.05.2015, 12:06 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Manyasha, ActiveWindow.Split* поделит само окно на части, а не закрепит области…


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 12:25 |
Сообщение № 8

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

AndreTM, ваш второй вариант у меня также не срабатывает. Никаких изменений на листах

 

Ответить

Alex_ST

Дата: Понедельник, 25.05.2015, 12:37 |
Сообщение № 9

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Всё работает.
Только надо Option Explicit использовать и все переменные «обзывать»



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STПонедельник, 25.05.2015, 16:52

 

Ответить

Manyasha

Дата: Понедельник, 25.05.2015, 12:41 |
Сообщение № 10

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

AndreTM, Вы правы, только что проверила. Закрепление происходит нормально, а вот если его снять вручную, лист остается разделенным.


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 14:14 |
Сообщение № 11

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

Alex_ST, я открыл файл со 132 листами, вставил Option Explicit, затем сразу под ним код, который Вы написали в своем посте. Запустил — никаких изменений или ошибок, просто частое моргание экрана и все.

 

Ответить

AndreTM

Дата: Понедельник, 25.05.2015, 14:58 |
Сообщение № 12

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Ну непонятливость можнопростить. Но неумение читать…


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

Alex_ST

Дата: Понедельник, 25.05.2015, 15:04 |
Сообщение № 13

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Моргание экрана???
Это с чего бы вдруг? Ведь в начале перед циклом стоит Application.ScreenUpdating = False, а по завершении Application.ScreenUpdating = True
Ничего мигать не должно!
Я бы, правда, написАл чуть по-другому — так, чтобы границы закрепления не задавались жёстко 2:2, а определялись по выделенной на активном в момент запуска листе ячейкой (ну не люблю я процедур с прописанными в теле диапазонами), но это сути не меняет.
Код практически точно такой же, как у Андрея (AndreTM):

К стати, код Вы поместили в стандартный модуль, надеюсь, а не в модуль листа?



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STПонедельник, 25.05.2015, 15:23

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 15:11 |
Сообщение № 14

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

Вот скриншот вставки кода и его размещения в VBA:

Сообщение отредактировал МурадПонедельник, 25.05.2015, 15:12

 

Ответить

Alex_ST

Дата: Понедельник, 25.05.2015, 15:20 |
Сообщение № 15

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Я, к сожалению, свой файл-пример с работающим макросом выложить не могу — собаки-сисадмины не дают.
Но у Вас какие-то чудеса…
Попробуйте для начала на новом чистом файле.
А может быть это кто-то из других процедур события смены листов или пересчёт перехватывает?
Попробуйте-ка всё события запретить:



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STПонедельник, 25.05.2015, 15:25

 

Ответить

nilem

Дата: Понедельник, 25.05.2015, 15:33 |
Сообщение № 16

Группа: Авторы

Ранг: Старожил

Сообщений: 1612


Репутация:

563

±

Замечаний:
0% ±


Excel 2013, 2016

Мурад, похоже вставил код в Персонал. Можно и так, но тогда замените ThisWorkbook на ActiveWorkbook


Яндекс.Деньги 4100159601573

 

Ответить

Manyasha

Дата: Понедельник, 25.05.2015, 15:37 |
Сообщение № 17

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

Мурад, PERSONAL.XLSB?
Зачем туда? Вам листы Вашей книги нужно обрабатывать, вставлять код нужно в проект Вашей книги «1.ВПО.xslx».


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 15:39 |
Сообщение № 18

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

Спасибо, nilem!!! Заменил This на Active и заработало :)

Сообщение отредактировал МурадПонедельник, 25.05.2015, 15:40

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 15:44 |
Сообщение № 19

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007


Так я ведь чайник :)

Сообщение отредактировал МурадПонедельник, 25.05.2015, 15:44

 

Ответить

Мурад

Дата: Понедельник, 25.05.2015, 15:46 |
Сообщение № 20

Группа: Проверенные

Ранг: Ветеран

Сообщений: 509


Репутация:

17

±

Замечаний:
0% ±


Excel 2007

Спасибо огромное за терпение и старания всем! Отдельный плюс Андрею!

 

Ответить

This Excel tutorial explains how to freeze panes in Excel spreadsheet and freeze panes in Excel VBA using FreezePanes property.

Freeze Panes in Excel spreadsheet

To explain how to freeze panes in Excel VBA, first I have to explain how to freeze panes in Excel spreadsheet.

Freeze Row

The most common kind of freeze panes is to freeze the first row as it contains the header of the column. So that when you scroll down the spreadsheet, you can still see the header in row 1.

Highlight row 2, navigate to View > Freeze Panes > Freeze Panes

Similarly, you can freeze row 2 by highlighting row 3 (highlight one row down the frozen row).

Freeze Column

To display data all the time in column A when you scroll to the right of the spreadsheet, highlight column B, , navigate to View > Freeze Panes > Freeze Panes

Similarly, you can freeze column A and B by highlighting column C (highlight the right column of the target frozen column).

Freeze Row + Column

To freeze column A and row 1 at the same time, select column B2, navigate to View > Freeze Panes > Freeze Panes

In the screenshot, I have highlighted the direction of freeze of a selected cell, it is the top row and left column of a selected Cell.

Similar to freeze panes in Excel spreadsheet, to freeze panes in Excel VBA, select a Cell first, then set ActiveWindow.FreezePanes Property to TRUE.

Freeze Row

To freeze row 1, select Row 2. Setting FreezePanes to False is to ensure that we have unfrozen any active freezePanes first. FreezePanes won’t work if there is already a FreezePanes.

Sub FreezeRow()
   ActiveWindow.FreezePanes = False
   Rows("2:2").Select
   ActiveWindow.FreezePanes = True
End Sub

Freeze Column

To freeze column A, select column B.

Sub FreezeColumn()
   ActiveWindow.FreezePanes = False
   Columns("B:B").Select
   ActiveWindow.FreezePanes = True
End Sub

Freeze row + column

To freeze column A and row 1, select Cell B2.

Sub FreezeCell()
   ActiveWindow.FreezePanes = False
   Range("B2").Select
   ActiveWindow.FreezePanes = True
End Sub

Unfreeze Panes

To unfreeze panes, simply set the FreezePanes Property to False.

   ActiveWindow.FreezePanes = False

Use Split to freeze Panes in Excel VBA

Instead of selecting a Cell to determine the freeze panes, we can also apply Split first, and then Set FreezePanes to TRUE.

For example, in order to freeze column A and row 1, write VBA code to split column 1 Row 1, afterwards set the ActiveWindow.FreezePanes to TRUE.

Sub FreezeCell()
    With ActiveWindow
    .SplitColumn = 1
    .SplitRow = 1
    End With
    ActiveWindow.FreezePanes = True
End Sub

Недавно я писал о замораживании панелей в Excel, вот как это можно сделать с помощью VBA:

Заморозить строки

 Строки ("1: 1"). Выберите ActiveWindow.FreezePanes = True. 

Закрепить столбцы

 Диапазон ("A: A"). Выберите ActiveWindow.FreezePanes = True.

Закрепить строки и столбцы

 Диапазон ("B2"). Выберите ActiveWindow.FreezePanes = True.

Панели UnFreeze

 ActiveWindow.FreezePanes = Ложь 

Принудительное сохранение рабочей книги без закрепления панелей

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

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

Итак, в этой статье мы соберем код, который будет проверять, включены ли Freeze Panes, и если да, то файл не будет сохранен. Это означает, что мне нужно сохранить его без замораживания — чтобы мои коллеги были довольны !!

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

Чтобы получить доступ к уровню книги, выполните следующие действия:

1. Щелкните правой кнопкой мыши книгу Excel — просмотрите код:

2. Это вызовет:

3. Дважды щелкните «Эта книга», а затем выберите «Рабочая книга» в первом раскрывающемся списке слева:

Мы видим, что значение слева теперь изменилось на «Открыть» — с некоторым кодом для события открытия книги. Этот код позволит нам определить, что происходит, когда книга открывается в первый раз.

Однако мы хотим контролировать, что происходит, когда мы сохраняем книгу. Поэтому измените правое раскрывающееся меню на «Перед сохранением». Экран теперь будет выглядеть так:

Теперь мы вставляем следующий код после объявления:

Если ActiveWindow.FreezePanes = True, то MsgBox "Freeze Panes on - File is NOT SAVED" Cancel = True End If

Итак, теперь полный код выглядит так:

Private Sub Workbook_BeforeSave (ByVal SaveAsUI As Boolean, Cancel As Boolean) Если ActiveWindow.FreezePanes = True, то MsgBox "Freeze Panes on - File is NOT SAVED" Cancel = True End If End Sub

Теперь сохраните файл и ЗАТЕМ активируйте Freeze Panes в любом окне. Затем — ВОССТАНОВИТЕ файл. Появится сообщение о том, что «Freeze Panes» включен — и файл не сохранен.

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

Вы поможете развитию сайта, поделившись страницей с друзьями

I am looking to programmatically freeze the top row of an Excel worksheet from VBA. The end goal is to produce the same effect as the View > Freeze Panes > Freeze Top Row command in Excel 2007 so that the top row of the worksheet is frozen and users can see the top row of the worksheet even as they scroll through the data.

ashleedawg's user avatar

ashleedawg

20k8 gold badges73 silver badges104 bronze badges

asked Jul 12, 2010 at 22:56

LJ.'s user avatar

Rows("2:2").Select
ActiveWindow.FreezePanes = True

Select a different range for a different effect, much the same way you would do manually. The «Freeze Top Row» really just is a shortcut new in Excel 2007 (and up), it contains no added functionality compared to earlier versions of Excel.

answered Jul 12, 2010 at 22:57

Tomalak's user avatar

TomalakTomalak

330k66 gold badges523 silver badges623 bronze badges

4

Tomalak already gave you a correct answer, but I would like to add that most of the times when you would like to know the VBA code needed to do a certain action in the user interface it is a good idea to record a macro.

In this case click Record Macro on the developer tab of the Ribbon, freeze the top row and then stop recording. Excel will have the following macro recorded for you which also does the job:

With ActiveWindow
    .SplitColumn = 0
    .SplitRow = 1
End With
ActiveWindow.FreezePanes = True

answered Jul 12, 2010 at 23:09

Dirk Vollmar's user avatar

Dirk VollmarDirk Vollmar

171k53 gold badges256 silver badges313 bronze badges

5

The problem with the recorded macro is the same as the problem with the built-in action: Excel chooses to freeze the top visible row, rather than the actual top row where the header information can be found.

The purpose of a macro in this case is to freeze the actual top row. When I am viewing row #405592 and I need to check the header for the column (because I forgot to freeze rows when I opened the file), I have to scroll to the top, freeze the top row, then find my way back to row #405592 again. Since I believe this is stupid behavior, I want a macro to correct it, but, like I said, the recorded macro just mimics the same stupid behavior.

I am using Office 2011 for Mac OS X Lion

Update (2 minutes later):

I found a solution here: 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 

answered Jul 12, 2012 at 22:05

Dannid's user avatar

DannidDannid

1,4491 gold badge19 silver badges17 bronze badges

2

Just hit the same problem…
For some reason, the freezepanes command just caused crosshairs to appear in the centre of the screen. It turns oout I had switched ScreenUpdating off!
Solved with the following code:

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

Now it works fine.

answered Oct 14, 2013 at 14:48

Tom M's user avatar

Tom MTom M

911 silver badge1 bronze badge

0

To expand this question into the realm of use outside of Excel
s own VBA, the ActiveWindow property must be addressed as a child of the Excel.Application object.

Example for creating an Excel workbook from Access:

Using the Excel.Application object in another Office application’s VBA project will require you to add Microsoft Excel 15.0 Object library (or equivalent for your own version).

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 & "ReportsReport_" & 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

The core process is really just a reiteration of previously submitted answers but I thought it was important to demonstrate how to deal with ActiveWindow when you are not within Excel’s own VBA. While the code here is VBA, it should be directly transcribable to other languages and platforms.

answered Jul 29, 2015 at 14:59

1

Rows("2:2").Select
ActiveWindow.FreezePanes = True

This is the easiest way to freeze the top row. The rule for FreezePanes is it will freeze the upper left corner from the cell you selected. For example, if you highlight C10, it will freeze between columns B and C, rows 9 and 10. So when you highlight Row 2, it actually freeze between Rows 1 and 2 which is the top row.

Also, the .SplitColumn or .SplitRow will split your window once you unfreeze it which is not the way I like.

answered Jul 28, 2015 at 16:18

ian0411's user avatar

ian0411ian0411

4,0753 gold badges25 silver badges33 bronze badges

0

Формулировка задачи:

Добрый день. возможно легкий вопрос, но все же спрошу.
как закрепить область без предварительного выбора нужной ячейки?
т.е. у меня есть отрывок из макроса:

хочу его записать без выбора ячейки, но у меня это не получается:

как же правильно это сделать?

Код к задаче: «Закрепить область без выбора ячейки (FreezePanes без Select)»

textual

Sub Freeze()
    With ActiveWorkbook.Windows(1)
      .SplitColumn = 5
      .SplitRow = 5
      .FreezePanes = True
    End With
End Sub

Полезно ли:

14   голосов , оценка 4.500 из 5

Модератор:Naeel Maqsudov

Sergey2006

Сообщения:2
Зарегистрирован:14 окт 2006, 11:37

Привет всем.

Подскажите пожалуйста, как можно программно сделать закрепление областей в Excel

pashulka

Сообщения:831
Зарегистрирован:24 ноя 2004, 03:46
Контактная информация:

14 окт 2006, 15:40

Для активного рабочего листа :

Код: Выделить всё

ActiveWindow.FreezePanes = False
Application.Rows("2:2").Select
ActiveWindow.FreezePanes = True

Код: Выделить всё

ActiveWindow.FreezePanes = False
Application.Columns("F:F").Select
ActiveWindow.FreezePanes = True

Код: Выделить всё

ActiveWindow.FreezePanes = False
Application.Range("E5").Select
ActiveWindow.FreezePanes = True

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

15 окт 2006, 05:42

перед закреплением обычно требуется привести лист в некоторое начальное положение,
я бы сказал — какая ячейка должна быть в левом углу перед закреплением…

посмотрите…
Excel. Пара задачек и решений
forum/viewtopic.php?t=6947

Понравилась статья? Поделить с друзьями:
  • Vba excel formula как
  • Vba excel formatting columns
  • Vba excel format time
  • Vba excel format now
  • Vba excel in list список