从新数据连接重新创建表时,在另一个工作表中维护Excel动态表引用

时间:2014-12-23 20:53:24

标签: sql-server excel vba excel-vba

在Excel中,我有一个表从另一个选项卡中的SQL Server查询填充。当我更改查询时,我希望能够在保持对该表的单元格引用的同时更新数据表。

我能够根据其他选项卡中的查询更改表内容的唯一方法是重新创建表。问题是当我重新创建表时,我在其他工作表中放松了对该表的所有动态单元格引用。

此子例程使用名为Query的选项卡中的SQL查询填充我需要的数据的空工作簿:

Sub PopulateTable_GLP()

Set cSQL = ThisWorkbook.Sheets("Query").Range("B2")  '  Sets cSQL to the SQL query
    nWhen = 0
    cWhen = ""
    cConn = "ODBC;DSN=GLP"


    With Sheets("GLP_Results").ListObjects.Add(SourceType:=0, Source:= _
        "ODBC;DSN=GLP;Description=GLP;DATABASE=GLP" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandText = cSQL
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Table_GLP"
        .Refresh BackgroundQuery:=False
    End With

End Sub

此功能在填充表格之前创建工作表(如果表格不存在)并在填充之前清除工作表(如果存在):

Sub Create_GL_Results()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

    On Error GoTo ErrorHandler
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "GLP_Results"
    Range("A1").Select

    Call PopulateTable_GLP


ErrorHandler:

    Sheets("GLP_Results").Cells.Clear
    Sheets("GLP_Results").Select

    Call PopulateTable_GLP

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

我试图关闭屏幕更新和自动计算,同时停止其他工作表用#REF替换所有动态参考!但这似乎没有帮助。

我不需要重新创建表,但我需要能够更改底层连接中的查询,而不会丢失我的动态引用。我引用的列名称在更新查询时不会发生变化,但填充这些列的方式可能会发生。

1 个答案:

答案 0 :(得分:0)

您可以包含以下声明:

ActiveWorkbook.RefreshAll

如果这是太多的茶点,你可以拉出有问题的表并刷新它。