我在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并且之后将数据从记录集中复制出来时我获得的是第一个范围的数据。
我编辑了变量的名称,因为涉及一些内部数据。
非常感谢您的帮助!
答案 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)
.UsedRange
没有提示的工作表.Delete
将它放入End with
- 函数中,因为它同时解决了两个标题行的问题。如果性能存在问题,请考虑将额外的GetRecordset
传递给您的函数,以确定您的函数是否使用了变通方法。
希望有所帮助。
修改:我们不能只从已打开的记录集中删除未使用的Boolean
。正如您所料,每个解决方法都有点脏。
由于我必须测试性能,我只能给你一些测试的想法。
使用上面提到的Field
,如果重复执行此操作会导致性能降低。
但是,不是在每个循环中创建Worksheets.Add
,而是
Worksheet
一次,Worksheet
.UsedRange.Cells.Clear
一次结束。如果您使用.Delete
,并以空白输出表开头,则可能更快
.CopyFromRecordset
中循环Cells
Rows(1)
我会试试1.