Страницы: 1
RSS
обновление прикрепленных формул к query с использованием VBA
 
Доброго дня, первый раз на вашем ресурсе(та и в принципе первый раз задаю вопрос на просторах).
вопрос скорее всего тривиальный, но на русскоязычных источниках ответа не нашел,
есть таблица, в которой в одной из вкладок задается месяц отчета, после чего нажимается кнопка Start и как бы пользователь должен облокотится на стул и подождать пару минут. тем временем макрос обновляет sql запросы на трех вкладках (даты в нем), после чего с использованием query обращается в oracle, вытягивает информацию, вставляет ее во вкладки с названием data_..., к которым справа прикреплена формула создающая ключ из нескольких ячеек строки, который в последующем используется для суммесли и впр во вкладке "отчет", которая по итогу вырезается и как значение сохраняется в папке для просмотра правления.
Скрытый текст

проблема возникает на этапе, после выгрузки данных из oracle. прикрепленные формулы не обновляются(следовательно ключ не обновляется), следовательно через суммесли не попадают во вкладку "отчет"
использовал несколько вариантов Calculate и т.д. - не помогло. обновление не происходит. (работаю в office 2007)
в 2003 офисе таких проблем не происходило и нормально обновляло.
подскажите как быть и где я профан))
Изменено: ujin - 05.05.2015 14:45:23
 
вот тут само обновление происходит?
Код
Sub requery_sql(ByVal sql$, r$) 
Worksheets("data_" & r).Select 
With ActiveSheet.ListObjects(1) 
.QueryTable.CommandText = sql 
.Refresh 
End With 

м.б. там не поспевает, попробуйте поставить последней строкой DoEvents
F1 творит чудеса
 
Максим Зеленский,не помогло, не обновляется.:cry:
при чем если после всего макроса просто нажать F9 все красиво заполняется правильными цифрами, но форма то уже была сохранена пустой и отправлена((
 
помню где-то встречалась с такой проблемой, не помню, как обошла... попробуйте в With вынести сам QueryTable, чтобы его рефрешить:
Код
Sub requery_sql(ByVal sql$, r$) 
Worksheets("data_" & r).Select
With ActiveSheet.ListObjects(1).QueryTable
.CommandText = sql 
.Refresh 
End With

или укажите его внутри:
Код
Sub requery_sql(ByVal sql$, r$) 
Worksheets("data_" & r).Select
With ActiveSheet.ListObjects(1) 
.QueryTable.CommandText = sql 
.QueryTable.Refresh 
End With
(иначе пока не вспомню)... но обновляя QueryTable, а не ListObject - у меня обычно ок (насколько помню)... (xl2010)
Изменено: JeyCi - 29.04.2015 13:19:39
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi,Спасибо большое, сейчас попробую
 
JeyCi,к сожалению не помогло((( так надеялся)
а выбить себе 2010 офис очень тяжело(( постоянно колупать мозг всем и несколько месяцев ожидания лицензии
Изменено: ujin - 29.04.2015 14:25:11
 
вы пробовали опцию (после .Refresh)
Код
Application.CalculateUntilAsyncQueriesDone 
?
Изменено: anyarceva - 29.04.2015 14:36:08
 
Цитата
ujin написал: а выбить себе 2010 офис очень тяжело
не надо - они достаточно схожи по части умных таблиц... дело может быть ещё в чём-то... успехов с вариантом поста№7... либо его прикрутите к моему пост№4 (если сработает) ?...
Изменено: JeyCi - 29.04.2015 14:58:48
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
anyarceva,вы чудо, отлично все заработало, без изменения кода, а только с добавлением этой строки) - полтора дня лазил по просторам - только от вас о этой команде узнал. ОГРОМНЕЙШЕЕ СПАСИБО!!!!!
Изменено: ujin - 29.04.2015 15:03:23
 
сама просто не так давно столкнулась с этой проблемой (тут), рада что и вам помогло.
на заметку: работает это начиная с 2007 офиса
 
Если проблема в том, что обновление еще не завершено, а код пошел дальше, то попробуйте снять флажок асинхронности выполнения запроса:
Код
Sub requery_sql(ByVal sql$, r$)
  Worksheets("data_" & r).Select
  With ActiveSheet.ListObjects(1)
    .QueryTable.BackgroundQuery = False ' <-- выполнять не асинхронно
    .QueryTable.CommandText = sql
    .Refresh                            ' <-- теперь код будет ждать завершения обновления
  End With
End Sub

Если же дело в другом, то лучше приложите файл
Изменено: ZVI - 29.04.2015 15:22:43
 
ZVI,проблема уже решена с помощью anyarceva, ответ#7

выглядит теперь так
Скрытый текст

файл приложить не могу - много конфиденциальной информации)) а видоизменять ее - суть будет потеряна)
Изменено: ujin - 29.04.2015 16:08:50
Страницы: 1
Наверх