Страницы: 1
RSS
Добавить лист не отвлекая пользователя
 
Здравствуйте
У меня стоит задача программно добавить несколько листов, но это надо сделать не  отвлекая пользователя, т.е. что бы excel не переключался на добавляемый лист
Делаю это таким кодом
Код
   Application.ScreenUpdating = False
   Application.EnableEvents = False
   Set wks = ThisWorkbook.Sheets.Add(, Worksheets(Worksheets.count), 1, XlSheetType.xlWorksheet)
   With wks
      .Name = psName
      .Range("A1:S1").Interior.Color = rgbGold
   End With
   Application.EnableEvents = True
   Application.ScreenUpdating = True
Но Excel все равно переключается на новый лист
Подскажите пожалуйста. Может есть способ запретить это?
Во вложении пример
 
Код
   Dim wks As Worksheet, aWs As Worksheet
   Application.ScreenUpdating = False
   Application.EnableEvents = False
   Set aWs = ActiveSheet
   Set wks = ThisWorkbook.Sheets.Add(, Worksheets(Worksheets.Count), 1, XlSheetType.xlWorksheet)
   With wks
      .Name = psName
      .Range("A1:S1").Interior.Color = rgbGold
   End With
   aWs.Activate
   Application.EnableEvents = True
   Application.ScreenUpdating = True
   Set GetTracerSheet = wks
Согласие есть продукт при полном непротивлении сторон
 
Sanja спасибо. Я уже к этому тоже пришел. Но это не решает моей задачи. Т.к. я добавляю сразу несколько листов (количество будет определяться действиями пользователя). Хотел избежать мерцания экрана.
 
Цитата
Anatoliy Pychev написал: Но это не решает моей задачи
Ту задачу, которую Вы описали в стартовом сообщении - решает. И никакого мерцания не наблюдается. Кликнул десять раз подряд на Вашу кнопку, добавилось десять листов, проблем не увидел
Согласие есть продукт при полном непротивлении сторон
 
Код
    Set wksAct = ActiveSheet
    Set wks = ThisWorkbook.Sheets.Add(, Worksheets(Worksheets.Count), 1, XlSheetType.xlWorksheet)
    wksAct.Activate

Не забывайте в конце процедуры освобождать память:
Код
Set wks = Nothing: Set wksAct = Nothing


P.S. Прочитал сообщение "не работает", а в код в сообщении № 2 не глянул :)
 
Sanja Спасибо большое

Задача состояла в том, что бы excel не переключался, а он переключается между листами
Возможно у Вас компьютер быстрый и вы видите только одно моргание. Но если между добавлениями листов будет работать какой-то код, тогда переключение будет визуально длинным и будет выглядеть как мерцание.
Изменено: Anatoliy Pychev - 05.05.2018 13:11:17
 
Цитата
vikttur написал:
Не забывайте в конце процедуры освобождать память:
За это отдельное спасибо
Прочитал и сказал себе: "В конце процедуры все локальные переменные освобождаются" , а потом спохватился, привязанные не освобождаются
Надо прошустрить код
 
Цитата
Anatoliy Pychev написал: Но если...
А если покажете файл, более приближенный к боевому и к основной задаче, то решение, возможно, будет другим. Может всю логику лучше перестроить?
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Anatoliy Pychev написал: переключение будет визуально длинным и будет выглядеть как мерцание.
???
похоже, логика работы хромает
 
Цитата
vikttur написал:
похоже, логика работы хромает
??? Возможно , ведь я могу сначала по добавлять все нужные листы, а потом делать необходимое заполнение в фоне. И тогда будет только одно моргание.
Спасибо. Так и поступим.
Я так понял другого варианта кроме сохранять и активировать активный лист, нет

Всем спасибо большое
 
Цитата
vikttur написал:
похоже, логика работы хромает
Однозначно!
Anatoliy Pychev!
Очень жаль Ваших пользователей!
Это уже не Автоматизация, а просто не Эффективная Автоматизация!  :D  
 
Еще вариант (для полноты освещения вопроса)
НЕ отключать обработку событий в GetTracerSheet, а в модуль Книги вставить следующий код
Код
Private Sub Workbook_NewSheet(ByVal Sh As Object)
    Worksheets("Лист1").Activate
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Anatoliy Pychev, Application.ScreenUpdating = False - это что? И почему у Вас моргает, непонятно.
 
Цитата
vikttur написал: И почему у Вас моргает,
Это нервное :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
vikttur написал: Application.ScreenUpdating = False - это что?
Если я правильно понимаю это отключение обновления экрана. Но на команду добавления листа это не работает.
Добился одного моргания (см вложение).
Специально в коде добавления оставил одну команду  заливки, для визуального эффекта. Но и без нее одно моргание существует. Можно сравнить добавление и удаление (во вложенном файле).  Удаление происходит без моргания

Считаю задачу решенной. Всем большое спасибо
 
Вопрос, конечно, не по теме, но все-же - Вам точно нужно такое количество листов? Подозреваю, что на них будет храниться однотипная информация но разным признакам, я прав?
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
Подозреваю, что на них будет храниться однотипная информация
Да однотипная и на время сеанса работы будут постоянно добавляться строки в разные листы
За определенное время будут отслеживаться изменения данных и вноситься в определенные листы. Пользователь будет подключать маркеры к слежению и отключать на одном главном листе. Соответственно что бы не плодить ненужное количество листов сразу (когда известно общее количество маркеров, может быть до 800), было принято решение добавлять лист только в случае подключения маркера  или нескольких маркеров к слежению. Конечно я поставлю ограничение на количество одновременно отслеживаемых маркеров. Но в зависимости от мощности компьютера это ограничение должно регулироваться.
Почему все не на одном листе? Потому, что так потом удобнее пользоваться данными (фильтровать, сортировать). Я так думаю.
 
Я конечно не знаю всей задачи, но думаю, что Вы не сможете ОДНОВРЕМЕННО смотреть на 800 листов (даже на 2 листа  ;) ), поэтому, как вариант, выбирать из основного листа данные соответствующие определенному маркеру/маркерам на данный конкретный момент и переносить/копировать их на ЕДИНСТВЕННЫЙ лист, который уже и анализировать. Это упрощенный алгоритм  
Изменено: Sanja - 05.05.2018 14:22:07
Согласие есть продукт при полном непротивлении сторон
 
А если хотите уточнений по такому решению - не в этой теме
Страницы: 1
Наверх