簡體   English   中英

在Connection.Refresh-Excel之后在VBA中動態調整表的大小

[英]Resize dynamically a table as another in VBA after Connection.Refresh- excel

我正在使用Excel 2007,在同一個WorkSheet中有兩個表,比如tab1tab2 通過與MS-SQL服務器的連接來填充tab1,並且tab2包含一些引用到tab1的某些單元格的公式,我使用它來創建一些對圖形和其他內容有用的值。 問題在於,每次刷新數據連接時, tab1都會更改其行數,並且希望tab2能夠反映此更改。
我試圖使用帶有對tab1的引用的OFFSET函數來聲明tab2的范圍,這在聲明期間起作用,但是當tab1更改時, tab2不會...所以我認為表聲明中指定的范圍無法t動態變化。
由於我刷新了通過VBA填充tab1的連接數據,因此我嘗試使用VBA調整tab2的大小。 我做這樣的事情:

With ActiveWorkbook.Connections("conn_name")
   .OLEDBConnection.CommandText = query 'query previously set
   .Refresh
End With
range_calculated = ....
' MsgBox range_calculated
With ActiveWorkbook.WorkSheets(name_sheet)
   .ListObjects(name_table_to_refresh).Resize Range(range_calculated)
End With

為了找到tab2的最后一行,我使用了類似的方法:

last_row_tab2 = .ListObjects("tab1").range.Rows.Count + .ListObjects("tab1").range.Row - 1

對於第一列,最后一列和第一行,我使用了類似的內容。

現在, Connection.Refresh可以正常工作,因為tab1更改了它的值並且一切正常(表更改了它的行數),但是當我執行Resize方法時,它無法按預期工作。 我放了一個MsgBox來捕獲計算的范圍,我注意到的是,它看起來像Refresh方法或tab1的“ refresh”,導入的新數據是在Sub的末尾執行的,而不是當我觸發Refresh在代碼中。 我懷疑這是因為MsgBox中顯示的范圍始終是Refresh的前一個,因此該范圍反映了Tab1Refresh之前的實際大小。 例如,如果現在tab1在第10行結束,並且我觸發了宏,則MsgBox會向我顯示10,但是刷新后,該表將在第15行結束; 如果我再次觸發該宏,則MsgBox向我顯示15,但刷新后該表將結束於第12行...依此類推。
我想念什么?
這是我想通了調整TAB2相應TAB1的唯一途徑。

編輯:
我還嘗試將“ Resize部分放在另一個“子”中,並在“ Refresh之后調用此子,但沒有任何更改。

任何幫助表示贊賞

埃托爾

最后,我找到了問題,並希望分享解決方案。
實際上,在VBA代碼中觸發時不會執行Refresh ,而是稍后執行,這是因為啟用了選項“ 啟用正在刷新的連接的后台刷新 ”。 禁用此選項將允許VBA代碼立即執行查詢(來自Office支持 ):

啟用后台刷新選中此復選框可在后台運行查詢。 清除此復選框以在您等待時運行查詢。 在后台運行查詢使您可以在查詢運行時使用Excel。

因此,禁用該選項可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM