记录集中的非相干范围

时间:2017-01-13 06:53:39

标签: excel vba excel-vba recordset

我在Excel VBA项目中使用的Recordset出现问题。我正在尝试将某个范围读入Recordset,现在它始终有效。但是这次我想得到一个不连贯的范围,在我的情况下由一个表的列组成,并通过以下函数将此范围赋予记录集(从@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选择范围并且它是我想要的那个但是当调用getRecordset并且之后将数据从记录集中复制出来时我获得的是第一个范围的数据。

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

很高兴你发现它很有用。如果您认为问题已解决,请务必标记有用的答案并关闭打开的主题。

关于主题:

在函数内添加Debug.Print rng.value(xlRangeValueMSPersistXML)以进行调试。你会看到XML只包含你的第一个范围,即使你首先将你的范围与Union联合起来。

Afaik没有解决这个问题。尝试使用连续范围进行修复。

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

  • 使用B
  • 动态创建新工作表
  • With ThisWorkbook.Worksheets.Add
  • 开始的连续范围内将Union - 范围值输出到该工作表
  • 从通过.Cells(1,1)
  • 检索XML
  • 将XML读入您的记录集
  • .UsedRange没有提示的工作表
  • .Delete
  • 结尾

将它放入End with - 函数中,因为它同时解决了两个标题行的问题。如果性能存在问题,请考虑将额外的GetRecordset传递给您的函数,以确定您的函数是否使用了变通方法。

希望有所帮助。

修改:我们不能只从已打开的记录集中删除未使用的Boolean。正如您所料,每个解决方法都有点脏。

由于我必须测试性能,我只能给你一些测试的想法。

  1. 使用上面提到的Field,如果重复执行此操作会导致性能降低。

    但是,不是在每个循环中创建Worksheets.Add,而是

    • 创建一个新的 Worksheet一次,
    • 每次迭代后
    • Worksheet
    • .UsedRange.Cells.Clear一次结束。
  2. 如果您使用.Delete,并以空白输出表开头,则可能更快

    • 在您的输出的.CopyFromRecordset中循环Cells
    • 如果标题位于“不需要的”列表中,则为Rows(1)
  3. 我会试试1.

相关问题