Forum > Tematy dowolne > Trochę programowania, ale tym razem w Basicu ;/

Strona 1 z 1 1
skocz

Inferno

Wysłane 2014-09-08 21:19

Nie wiem czemu, ale jak dodam kod: 


Do While Workbook.Connection("SQLQueryTable").ODBConnection.Refreshing = True 
DoEvents 
Loop



Cały czas odświeża mi tabelę z połączeniem. Znaczy się na dole jest napis odświeżanie w tle i to nie znika. 
Odświeżanie natomiast zakończy się, jeżeli tej pętli mieć nie będę. To samo jak debuguję - wciskam F8 i po chwili zakończy odświeżanie, czyli Refreshing będzie na False. 
Tak jakby ta pętla uniemożliwiała zmiany stanu z True na False. 

Excel 2013.

skatan

  • skatan
  • wiadomość Użytkownik

  • 1767 wypowiedzi

Wysłane 2014-09-08 23:16

cos sie liznęło programowania ale
w basicu nie za bardzo

niemniej po co jest refreshing cały czas ? bo na moje to zawsze będzie true jak bedziesz miec połączenie
nieważne co masz w pętli i jako ze basica nie znam to na moje sam tego refresha wywołujesz.

w sumie lepiej napisz co chcesz zrobić dokładnie  ;)

Ryzen 7 9800X3D, MSI MPG X870E CARBON WIFI , Arctic Liquid Freezer III 280, G.Skill Trident Z5 Royal Neo DDR5 32 GB 6400MHz CL30, ASUS TUF 3060Ti, SSD Samsung 980 Pro 2TB, 2x Gigabyte AORUS 2TB, SSeasonic FOCUS GX-850 v4 ATX 3.1 PCIe 5.1 Black Gold 850W

kowgli

  • kowgli
  • wiadomość Użytkownik

  • 4367 wypowiedzi

Wysłane 2014-09-09 09:57 , Edytowane 2014-09-09 09:58

Nie znam się na programowaniu VBA, ale może chodzi o to, że robiąc taką nieskończoną pętlę nie zwalniasz kontekstu (zakładam, że Excel chodzi w jednym wątku), przez co zmienna się nie aktualizuje, bo jest zablokowana.

Pierwsze kilka linków w google (na hasło "ODBConnection.Refreshing wait in loop"), podpowiada np.:

Dodanie opóźnienia do pętli:

Application.Wait DateAdd("s", 1, Now)


Wyłączenia wykonywania w tle:
.ODBConnection.BackgroundQuery = False


Lub wykorzystanie dedykowanego polecenia do odczekania:
Application.CalculateUntilAsyncQueriesDone


Inferno

Wysłane 2014-09-09 12:07


Application.CalculateUntilAsyncQueriesDone

To by było odpowiedzią na postawiony przeze mnie problem. Dzięki. \"\jupi\"

ODBConnection.BackgroundQuery = False

To, jak dobrze pamiętam, bo ostatnio tego nie prześledziłem, spowodowało by odświeżenie jednej tabeli, czekanie aż się zakończy i przejście do drugiej tabeli, odświeżanie jej i czekanie aż się zakończy i tak dalej. Wydłużyło by to czas wykonania. Chociaż, nie wiem jak by się to zachowywało, gdybym, między jednym odświeżaniem, a drugim, kazał obliczyć arkusz, który jest powiązany akurat z tą tabelą. Ale chyba obliczanie by się zatrzymało i czekało aż się tabela odświeży. \"\hmmm\"


Application.Wait DateAdd("s", 1, Now)

To się nie sprawdza. Dałem nawet 5 sekundowe czekanie w pętli, tam gdzie mam wykonywanie zdarzeń i tak musiałem długo czekać i nic. Może jak bym czekał 20 minut by zadziałało, ale to nie miało by wtedy sensu.

kowgli

  • kowgli
  • wiadomość Użytkownik

  • 4367 wypowiedzi

Wysłane 2014-09-09 13:16

No to super, że się udało.

Strona 1 z 1 1
skocz

Kto jest online: 0 użytkowników, 223 gości