【问题标题】:Feeding an Excel QueryTable object from memory从内存中提供 Excel QueryTable 对象
【发布时间】:2010-09-18 18:49:15
【问题描述】:

您好,

下面的 VBA 代码将创建一个 Excel QueryTable 对象并从 Range("D2") 开始显示它。这个目标范围的具体地址无关紧要。

我的问题是——是否可以手动将值输入到内存中的 Recordset,然后从中读取表?换句话说,我想在 VBA 中指定表的列和值,而不是让它们来自数据库或文件。

Public Sub Foo()

    Dim blah As QueryTable
    Dim rngTarget As Range

    Dim strQuery As String

    strQuery = "SELECT * FROM MY_TABLE"
    Set rngTarget = Range("D2")
    Dim qt As QueryTable
    Set qt = rngTarget.Worksheet.QueryTables.Add(Connection:= _
        "ODBC;DRIVER=SQL Server;SERVER=MY_SQL_SERVER;APP=MY_APP;Trusted_Connection=Yes", Destination:=rngTarget)

    With qt
        .CommandText = strQuery
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = False
        .Name = "MY_RANGE_NAME"
        .MaintainConnection = False
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = False
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .Refresh BackgroundQuery:=False
   End With

End Sub

【问题讨论】:

  • 这是我最终使用的,除了它的 Web Query 版本,但据 Excel 所知,它是同一件事。您只需在运行 .Refresh 方法后删除查询表即可。

标签: excel vba


【解决方案1】:

是的,当然。

  Dim vConnection As Variant, vCommandText As Variant
  Dim r As ADODB.Recordset
  Dim i As Long

  'Save query table definition
  vConnection = QueryTable.Connection
  vCommandText = QueryTable.CommandText


  Set r = New ADODB.Recordset
  <populate r>

  Set QueryTable.Recordset = r
  QueryTable.Refresh False

  'Restore Query Table definition
  Set QueryTable.Recordset = Nothing
  QueryTable.Connection = vConnection
  QueryTable.CommandText = vCommandText

【讨论】:

    【解决方案2】:

    来自 Excel VB 帮助 连接参数可以是:

    “ADO 或 DAO 记录集对象。从 ADO 或 DAO 记录集中读取数据。Microsoft Excel 保留记录集,直到删除查询表或更改连接。无法编辑生成的查询表”

    是的,看起来你可以做到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多