Закрепление строки excel vba

 

Мартын

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

Сообщений: 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

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

Сообщений: 23252
Регистрация: 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

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

Сообщений: 23252
Регистрация: 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

Владимир

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

6 ответов

Лучший ответ

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

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


45

Tomalak
29 Июл 2015 в 18:11

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


14

Dannid
13 Июл 2012 в 02:05

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

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

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


9

Tom M
14 Окт 2013 в 18:48

Чтобы расширить этот вопрос до области использования за пределами 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 & "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

Основной процесс — это просто повторение ранее представленных ответов, но я подумал, что важно продемонстрировать, как работать с ActiveWindow, когда вы не находитесь в собственном VBA Excel. Хотя здесь используется код VBA, его следует напрямую транслировать на другие языки и платформы.

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

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

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


3

ian0411
23 Авг 2017 в 20:40

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

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

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


22

Dirk Vollmar
13 Июл 2010 в 03:09

0 / 0 / 0

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

Сообщений: 3

1

17.10.2011, 17:48. Показов 24517. Ответов 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



811 / 465 / 181

Регистрация: 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



Karataev Дата: Пятница, 26.06.2015, 22:29 | Сообщение № 2
ikki Дата: Суббота, 27.06.2015, 00:37 | Сообщение № 3

точнее — никаким прокручиванием вообще )

как вариант — можно воспользоваться штатным средством «Представления» (вкладка Вид)
в Вашем файле я создал два представления — с именами «_47» и «3437»
применяете то или другое — закрепленная шапка будет меняться.

точнее — никаким прокручиванием вообще )

как вариант — можно воспользоваться штатным средством «Представления» (вкладка Вид)
в Вашем файле я создал два представления — с именами «_47» и «3437»
применяете то или другое — закрепленная шапка будет меняться. ikki

помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki

Сообщение точнее — никаким прокручиванием вообще )

как вариант — можно воспользоваться штатным средством «Представления» (вкладка Вид)
в Вашем файле я создал два представления — с именами «_47» и «3437»
применяете то или другое — закрепленная шапка будет меняться. Автор — ikki
Дата добавления — 27.06.2015 в 00:37

Источник

Как закрепить ячейки в формулах для большого диапазона ячеек

Описание работы

Если вы читаете эту страницу, то скорее всего знаете что ссылки в формулах бывают как относительные, так и абсолютные. В Excel предусмотрено закрепление строк столбцов или конкретной ячейки в формуле. Однако отсутствует команда, выполняющая эту операцию для большого количества формул или для целой области ячеек с формулами.

С помощью надстройки VBA-Excel вы сможете закрепить ячейки в выбранном диапазоне. Для этого:

  1. Выделите диапазон данных
  2. Перейдите на вкладку меню VBA-Excel
  3. В меню Функции выберите команду Закрепить формулы
  4. В диалоговом Закрепление формул диапазона выберите тип закрепления.
  5. Нажмите кнопку ОК.

Вы можете выбрать 4 варианта закрепления

  1. Закрепление столбцов.
  2. Закрепление строк.
  3. Закрепление одновременно и строк и столбцов
  4. Снятие закрепления ячеек.

Источник

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

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

6 ответов

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

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

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

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

целью макроса в этом случае является замораживание фактической верхней строки. Когда я просматриваю строку #405592 и мне нужно проверить заголовок столбца (потому что я забыл заморозить строки, когда я открыл файл), мне нужно прокрутить наверх, заморозить верхний гребите, затем найдите мой путь обратно к строке #405592 снова. Поскольку я считаю, что это глупое поведение, я хочу, чтобы макрос исправил его, но, как я уже сказал, записанный макрос просто имитирует то же самое глупое поведение.

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

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

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

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

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

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

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

основной процесс-это просто повторение ранее представленных ответов, но я подумал, что важно продемонстрировать, как обращаться с ActiveWindow, когда вы не находитесь в собственном VBA Excel. А вот код на VBA, оно должно быть напрямую transcribable на другие языки и платформы.

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

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

Источник

Excel vba закрепление областей

Модератор форума: китин, _Boroda_

Мир MS Excel » Вопросы и решения » Вопросы по VBA » Закрепление области с применением SmallScroll (Макросы/Sub)

Закрепление области с применением SmallScroll

rever27 Дата: Пятница, 26.06.2015, 15:31 | Сообщение № 1
Karataev Дата: Пятница, 26.06.2015, 22:29 | Сообщение № 2
ikki Дата: Суббота, 27.06.2015, 00:37 | Сообщение № 3

точнее — никаким прокручиванием вообще )

как вариант — можно воспользоваться штатным средством «Представления» (вкладка Вид)
в Вашем файле я создал два представления — с именами «_47» и «3437»
применяете то или другое — закрепленная шапка будет меняться.

точнее — никаким прокручиванием вообще )

как вариант — можно воспользоваться штатным средством «Представления» (вкладка Вид)
в Вашем файле я создал два представления — с именами «_47» и «3437»
применяете то или другое — закрепленная шапка будет меняться. ikki

помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki

Сообщение точнее — никаким прокручиванием вообще )

как вариант — можно воспользоваться штатным средством «Представления» (вкладка Вид)
в Вашем файле я создал два представления — с именами «_47» и «3437»
применяете то или другое — закрепленная шапка будет меняться. Автор — ikki
Дата добавления — 27.06.2015 в 00:37

Источник

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

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

6 ответов

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

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

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

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

целью макроса в этом случае является замораживание фактической верхней строки. Когда я просматриваю строку #405592 и мне нужно проверить заголовок столбца (потому что я забыл заморозить строки, когда я открыл файл), мне нужно прокрутить наверх, заморозить верхний гребите, затем найдите мой путь обратно к строке #405592 снова. Поскольку я считаю, что это глупое поведение, я хочу, чтобы макрос исправил его, но, как я уже сказал, записанный макрос просто имитирует то же самое глупое поведение.

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

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

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

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

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

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

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

основной процесс-это просто повторение ранее представленных ответов, но я подумал, что важно продемонстрировать, как обращаться с ActiveWindow, когда вы не находитесь в собственном VBA Excel. А вот код на VBA, оно должно быть напрямую transcribable на другие языки и платформы.

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

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

Источник

Adblock
detector

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

Мурад

Дата: Понедельник, 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

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

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Закрепление строк в таблице excel
  • Закрепление столбца в excel формула
  • Закрепление рисунка в word
  • Закрепление прокрутки в excel
  • Закрепление области строк в excel