2016-02-17 3 views
2

У меня есть две таблицы, одна со списком городов (мы будем называть этот список городов), а другая с точками данных, соответствующими этим городам (назовите эту таблицу данных). Таблица данных связана с запросом Select, который я создал в MS SQL Server. Этот запрос/таблица данных содержит одно предложение Where, в котором я заменил критерии SQL и заменил ?, чтобы сделать его параметром при подключении к Excel.Обновление таблиц с VBA

Теперь, когда у меня есть это, я объясню, что я пытаюсь выполнить. Я хочу прокрутить список городов и для каждого города в списке, обновить таблицу данных, чтобы отразить точки данных для города. В конечном счете, я хотел бы пройти цикл, и каждый раз, когда таблица данных обновляется, она сохраняет копию книги с этой конкретной таблицей.

Я разместил свой текущий код ниже, но моя проблема заключается в том, что таблица никогда не обновляется с текущими данными, которые соответствуют городу, который в настоящее время выбран через цикл. С учетом сказанного, если я удалю ключ escape, чтобы вырваться из макроса VBA, таблица будет обновляться с каким бы ни был последний город до того, как я остановил макрос.

Код:

Sub Macro1() 
Dim WS As Worksheet 
Dim WS2 As Worksheet 
Dim CT As Variant 
Dim MSG As String 

Set WS = Sheets("Sheet1") 
Set WS2 = Sheets("Sheet2") 
CT = Range("A1").CurrentRegion 
For i = 2 To UBound(CT, 1) 
    MSG = "" 
    For J = 1 To UBound(CT, 2) 
     WS.Range("$D$2").Value = CT(i, J) //Places the city into Cell $D$2 which is where The Data Table looks to for the parameter. 

    Exit For 


    Next J 

     ActiveWorkbook.Connections("Query from Database").Refresh 

      WS2.ListObjects(1).Refresh 

Next i 
End Sub 

Это почти как если бы макрос работает слишком быстро для таблицы, чтобы догнать и обновить. Я попытался добавить несколько кодов ожидания в код, надеясь, что он даст достаточно времени, чтобы обновить таблицу, но это не повлияло. Я также отключил Background Refresh, и это тоже ничего не делает. Сейчас он просто просматривает таблицу города, и каждый город показывает, что запрос обновляется, но после того, как запрос завершен, он переходит в следующий город, не обновляя таблицу данных. ПОМОГИТЕ!

ответ

1

По умолчанию Excel будет «Включить фоновое обновление», что позволит Excel двигаться дальше и продолжать выполнение до того, как обновление запроса будет завершено. Некоторым людям удалось заставить его работать, дважды позвонив по телефону .Refresh, но это довольно случайное/произвольное время.

Там должен быть вариант Excel, чтобы снять в свойствах таблицы данных, или вы могли бы быть в состоянии обновить BackgroundQuery = False свойство из VBA через ссылку на него

Если отключить фон освежать, то ваш код будет сидеть и дождитесь завершения обновления, прежде чем двигаться дальше.

+0

Я тоже это прочитал и даже видел трюк «Два обновления», но, к сожалению, это не сработало. Как я уже говорил выше, я уже снял флажок «Включить обновление фона», и, хотя это замедляет работу и позволяет обновлять запрос, по какой-то причине таблица не обновляется. – Jcmoney1010

3

Есть несколько вещей, которые, я думаю, вам нужно сделать - возможно, вы уже сделали это.

  1. Когда вы настраиваете переменную параметра/привязки (что вы сделали), укажите ее в определенную ячейку. Затем в запросе SQL Server, убедитесь, что параметр связан с этого диапазона каждый раз:

enter image description here

Простите меня, если я преувеличиваю очевидное, но и для тех, кто не знает вас перейдите в этот диалог, щелкнув правой кнопкой мыши таблицу и выбрав «Таблица-> Параметры».

  1. Оттуда, когда вы перебираете свой основной стол (тот, в котором есть города в нем), вы можете просто взять значение из каждой строки в этой таблице и обновить ячейку с помощью параметр привязки.

Что-то, как это должно работать:

Sub RefreshAllCities() 

    Dim ws1, ws2 As Worksheet 
    Dim loCities, loDataTable As ListObject 
    Dim lr As ListRow 

    Set ws1 = ActiveWorkbook.Worksheets("Sheet1") 
    Set ws2 = ActiveWorkbook.Worksheets("Sheet2") 

    Set loCities = ws1.ListObjects("CityList") 
    Set loDataTable = ws2.ListObjects("DataTable") 

    ' get rid of those pesky warnings to overwrite files 
    Application.DisplayAlerts = False 

    For Each lr In loCities.ListRows 
    ws2.Cells(1, 2).Value = lr.Range(1, 1).Value 
    loDataTable.QueryTable.Refresh BackgroundQuery:=False 

    ActiveWorkbook.SaveAs Filename:="C:\temp\" & lr.Range(1, 1).Value & ".xlsx", _ 
     FileFormat:= xlOpenXMLWorkbook 
    Next lr 

    Application.DisplayAlerts = True 
End Sub 

Я предполагаю, что вы хотели .xlsx файлы в этом примере. Это будет зависеть от любого встроенного VBA, что на самом деле является хорошим бонусом, так как получатели фильтрованных наборов данных не должны подвергаться этому. Если вы хотите xlsm или xlsb, это достаточно легко изменить.

+0

Я вижу, что вы обновляете таблицу запросов вместо объекта списка, который, по моему мнению, является решением. –

+0

Спасибо за тщательный ответ, но, к сожалению, это еще не решило мою проблему. При тестировании вашего кода, похоже, просто указывается название города в таблице данных, а не фактически обновляется таблица, основанная на городе. – Jcmoney1010

+0

Я провел некоторое дополнительное тестирование, и я заметил, что если я избавлюсь от циклов и жестких кодов 2 городов в VBA так: 'ws1.Cells (3, 4) .Value =" ARIZONA MESA "' и 'ws1.Cells (3, 4) .Value =" CALIFORNIA CARLSBAD "', с ожиданием посередине, тогда он обновит таблицу данных только по последнему городу. Первый город полностью игнорируется. – Jcmoney1010

Смежные вопросы