记录集中的不连贯范围

Incoherent Range into Recordset

我在 Excel VBA 项目中使用的 Recordset 有问题。我正在尝试将某个范围读入 Recordset,直到现在它始终有效。但是这一次我想得到一个不连贯的范围,在我的例子中它由 table 的列组成,并通过以下函数将这个范围提供给记录集(从@Martin Dreher 获得)

'this is how I set the range
Set SourceRange = ThisWorkbook.Worksheets(1).Range("Tablename[[field1]:[field2]], " & _
    "Tablename[[field3]:[field4]], Tablename[[field5]:[field6]]")

'this is the function I set my recordset with
Function GetRecordset(rng As Range)

    Dim xlXML       As Object
    Dim rst         As Object

    Set rst = CreateObject("ADODB.Recordset")
    Set xlXML = CreateObject("MSXML2.DOMDocument")
    xlXML.LoadXML Replace(rng.Value(xlRangeValueMSPersistXML), "rs:name="" ", "rs:name=""")
    rst.Open xlXML

    Set GetRecordset = rst

End Function

当我通过 VBA select 范围时,它是我想要的范围,但是当调用 getRecordset 和 afterwords 将数据从记录集中复制出来时,我得到的只是第一个范围的数据.

我编辑了变量的名称,因为涉及到一些内部数据。

非常感谢您的帮助!

很高兴您觉得它有用。如果您认为问题已解决,请确保标记有用的答案并关闭打开的线程。

主题:

在您的函数中添加 Debug.Print rng.value(xlRangeValueMSPersistXML) 以进行调试。您会看到 XML 仅包含您的第一个范围,即使您先将范围与 Union 结合。

Afaik 对此没有解决办法。尝试修复连续范围。

但是,如果您绝对需要一个记录集中的两个范围,并且您可以保证它们具有相同的行数并且 A 中的每个 Row(i) 属于 Row(i)B 中,解决方法是

  • 使用 With ThisWorkbook.Worksheets.Add
  • 即时创建一个新的 sheet
  • 在从 .Cells(1,1)
  • 开始的连续范围内将 Union-range-values 输出到那个 sheet
  • .UsedRange
  • 中检索 XML
  • 将 XML 读入您的记录集中
  • .Delete 工作sheet 没有提示
  • End with结束

将其放入您的 GetRecordset-Function,因为它同时解决了两行 header 的问题。如果性能有问题,请考虑将额外的 Boolean 传递给您的函数以确定您的函数是否使用解决方法。

希望对您有所帮助。

编辑: 我们不能只从打开的记录集中删除未使用的Field。如您所料,每个变通办法都有点不妥。

因为要测试性能,所以只能给大家一些测试思路。

  1. 使用上面提到的Worksheets.Add,如果你重复这样做,性能会变慢。

    但是,您可以

    而不是在每个循环中创建一个 Worksheet
    • 创建一个新的 Worksheet一次,
    • .UsedRange.Cells.Clear 每次迭代后
    • .Delete最后一次。
  2. 如果您使用 .CopyFromRecordset,并以空白 output-sheets 开头,那么

    可能会更快
    • 在你的输出 Rows(1) 中循环 Cells
    • 如果 header 在您的 "unwanted" 列表中,则 .EntireColumn.Delete

我会试一试。