Страницы: 1
RSS
VBA Обновление данных на листе с паролем
 
Добрый день!

Суть задачи: необходимо по нажатию кнопки снимать пароль с Листа > обновлять всю Книгу (запросы PQ, диаграммы, сводные таблицы и т.д.) > обратно защищать Лист паролем.

Прошу помощи, чтобы разобраться почему не работает кнопочный код VBA :
Код
Sub Обновление()

    'снимаем защиту
    Worksheets("Лист3").Unprotect "1" ' - пароль
    
    'обновляем книгу
    ActiveWorkbook.RefreshAll
    
    'пауза на 10 сек
    Application.Wait (Now() + TimeValue("00:00:10"))
    
    'устанавливаем защиту
    Worksheets("Лист3").Protect "1"

    MsgBox "Данные обновлены"

End Sub

Делал проверку F8 - код работает отлично, но при нажатии кнопки "Обновить данные" на Листе - процесс начинает выполняться и в конце выдает ошибку "Ячейка или диаграмма, которую вы пытаетесь изменить, находится на защищенном листе..." и данные не обновляются. Поставил даже паузу, чтобы файл мог спокойно обновиться.

Находил похожие темы, но именно подобную ошибку не встречал... Буду благодарен если отправите или наставите на путь истинный.
 
Добрый день. Попробуйте в свойствах подключения (Данные -> Подключения -> Запрос PQ) снять галочку Фоновое обновление
 
Stanislavsky7, можете попробовать так
Код
Sub ОбновлениеRun()
    Обновление 1
End Sub

Sub Обновление(Optional Refr&)
    If Refr = 1 Then
        'снимаем защиту
'        Worksheets("Лист3").Unprotect "1" ' - пароль
         
        'обновляем книгу
        ActiveWorkbook.RefreshAll
         
        'пауза на 10 сек
        Application.OnTime Now() + TimeValue("00:00:10"), "Обновление"
    Else
       
       'устанавливаем защиту
'       Worksheets("Лист3").Protect "1"
    
       MsgBox "Данные обновлены"
    End If
End Sub
Изменено: testuser - 05.05.2023 15:52:43
 
Спасибо большое, webley  - ваше решение помогло!

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

Возможно ли как-то добавить в код макроса отключение фонового обновления всех запросов в Книге? Не нашел пока такого решения, но зато нашел, что можно заменить паузу Application.Wait на Application.CalculateUntilAsyncQueriesDone, чтобы макрос дожидался обновления всей Книги и только после этого шел дальше по шагам.
Код
Sub Обновление()

    'снимаем защиту
    Worksheets("Лист3").Unprotect "1" 'цифры - это пароль
    
    'обновляем книгу
    ActiveWorkbook.RefreshAll
    
    'дожидаемся завершения обновления
    Application.CalculateUntilAsyncQueriesDone
    
    'устанавливаем защиту
    Worksheets("Лист3").Protect "1"
    
    MsgBox "Данные обновлены"


End Sub
 
testuser, я в VBA не очень силен, но ваш код выдает ошибку...  
 
Цитата
написал:
добавить в код макроса отключение фонового обновления всех запросов
Думаю как-то так:
Код
    Dim cn As WorkbookConnection
    For Each cn In ThisWorkbook.Connections
        cn.OLEDBConnection.BackgroundQuery = False
    Next cn
 
Цитата
Stanislavsky7 написал:
но ваш код выдает ошибку...  
попробуйте убрать табуляцию
 
Цитата
Stanislavsky7 написал:
чтобы макрос дожидался обновления всей Книги и только после этого шел дальше по шагам.

Спасибо большое, код отлично отрабатывает, но есть вопрос.
Все работает, данные обновляются, но все равно в списке запросов пишет с восклицательным знаком, что Загрузка не была завершена, хотя это не так.
У вас так же?
Изменено: Алексей - 25.05.2024 13:33:05
Страницы: 1
Наверх