Страницы: 1
RSS
Как программно закрепить определённую строку.
 
Доброе время всем!
Вопрос простой как три копейки, но ответа пока не нашёл.
Надо закрепить определённую строку (чтобы не прокручивалось всё, что выше её) на НЕактивном листе.
У меня через VBA выводятся таблички на несколько различных листов. У каждой таблички есть "шапка" с автофильтром. Так вот хотелось бы закрепить эти шапки от прокрутки.
Из всего, что нарыл в тырнете, есть только ActiveWindow.FreezePanes=True , но это только для активного окна! А мне кажется очень некрасивым способ мелькать окнами перед носом юзера, переключаясь между листами и фиксируя строки.
Нет ли способа сделать это, не активируя каждый лист?
 
Отключите обновление экрана, и ничего мелькать не будет, а в конце вкл. его
 
Вместо ActiveWindow ничего писать не пробовали?
FreezePanes работает только с активным листом...
 
Цитата
Ivan.kh написал:
Отключите обновление экрана
Была такая мысль, но это-же кривые костыли. Должен быть прямой путь, не могли-же мелкомягкие так "тормознуть".
Ведь как-то где-то же программа запоминает, что на листе1 закрепление есть, а на листе2 его нет. Значит в каком-то месте информация о том, что на листе1 закреплена пятая строка, а на листе2 закреплён шестой столбец хранится! И эта инфа явно привязана к листам. Так неужели не предусмотрен способ эту информацию изменять программно?!?! Как-то это, ИМХО, странно и даже глупо.

Цитата
vikttur написал:
FreezePanes работает только с активным листом
Вот так и умирают мечты....
 
Цитата
Мартын написал:
Была такая мысль, но это-же кривые костыли.
с чего это вдруг.
С такой логикой всякие поделки на VBA- это кривой костыль.
 
Цитата
FreezePanes работает только с активным листом
Это только предположение, дополнение к зачеркнутому. Не проверял досконально. Может, и есть решение без активации листа...
Цитата
...где-то же программа запоминает,... неужели не предусмотрен способ эту информацию изменять программно?!?! Как-то это, ИМХО, странно и даже глупо.
Не нужно глупостью называть то, чего не знаете... Возможно, для этого есть свои причины. Ведь не только этот параметр, но и другие нельзя менять без активации листа. И то, что нельзя сделать так, как нужно именно Вам - не глупость.
 
Цитата
Мартын написал:
не могли-же мелкомягкие так "тормознуть".
- почему? Недооцениваете :)
 
Цитата
Мартын написал:
Ведь как-то где-то же программа запоминает, что на листе1 закрепление есть, а на листе2 его нет. Значит в каком-то месте информация о том, что на листе1 закреплена пятая строка, а на листе2 закреплён шестой столбец хранится!
Да, в XML-схеме файла. Но достучаться до неё при открытом файле невозможно, да и в закрытом я бы не стал туда лезть только для того, чтобы закрепить область.
Но и здесь все не так просто. Перед установкой закрепления необходимо выделить ячейку и сместить лист так, чтобы закрепление было в видимой области. Иначе можно словить такую штуку, как закрепление где-то внизу или вверху, что может привести к невозможности просмотреть нужные данные.
Собственно все эти нюансы и мешают назначить закрепление на неактивном листе - ввиду особенностей объектной модели.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да, с закреплением в 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-s - 09.04.2020 18:47:14
 
Цитата
The_Prist написал:
Собственно все эти нюансы и мешают назначить закрепление на неактивном листе - ввиду особенностей объектной модели.
Добрый день! Весьма вероятно что это так.
Однако остается вопрос - а почему нельзя снять разделение областей на неактивных листах? В этом случае вроде бы не возникает проблема отображаемой ячейки  - нужно просто сделать .FreezePanes = False. У меня изредка возникает задача пробежаться по всем или избранным рабочим листам и, упрощенно выражаясь, сбросить все структурные и оформительские настройки - обесцветить ярлычок, отобразить все данные (или скрыть ярлыки автофильтра), удалить сценарии, ..... и многое другое.... Практически все делается методами объекта Worksheet или присвоением нужных значений его свойствам или свойствам внутренних объектов, а вот для снятия разделения окна почему-то приходится с отключенным обновлением экрана активировать этот рабочий лист и делать через ActiveWindow. Может есть способ обойтись без активации окна?
 
все эти вопросы решаются эмпирическим путем
пробуете метод, который кажется логичным и в соответствии с вашими знаниями об Excel должен бы сработать
если оказалось что ваша логика не совпала с возможности обьектной модели Excel
возвращаетесь к изучению возможностей последней и пользуетесь доступными для разработчика методами

или еще метод:
ничего не ищете, ничего не пробуете, а пишете сюда свой вопрос, возможно кто-то уже это пробовал и может поделиться своим опытом, возможно кому-то задача покажется интересной и он не имею четкого представления как это сделать разберется и напишет как сделал
Изменено: Ігор Гончаренко - 06.11.2020 23:34:54
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Кстати вот тоже вспомнил, что работает только через ActiveWindow:
чтобы изменять положение разрывов печати нужно перейти в страничный режим путем
Код
ActiveWindow.View = xlPageBreakPreview
 
Цитата
DAG написал:
пробежаться по всем или избранным рабочим листам
Свойство FreezePanes относится к окну, а не к рабочему листу. Если Вы откроете книгу, состоящую из двух (видимых) листов, то книга будет иметь одно окно:
Код
 Debug.Print ActiveWorkbook.Windows.Count
Если через Меню/Вид/Новое окно добавить второе окно и отображать в окнах разные листы, то тогда можно управлять свойствами  FreezePanes этих окон без предварительного активирования.
Изменено: sokol92 - 07.11.2020 13:04:47
Владимир
Страницы: 1
Наверх