记录集中的不连贯范围
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
。如您所料,每个变通办法都有点不妥。
因为要测试性能,所以只能给大家一些测试思路。
使用上面提到的Worksheets.Add
,如果你重复这样做,性能会变慢。
但是,您可以
而不是在每个循环中创建一个 Worksheet
- 创建一个新的
Worksheet
一次,
.UsedRange.Cells.Clear
每次迭代后
.Delete
最后一次。
如果您使用 .CopyFromRecordset
,并以空白 output-sheets 开头,那么
可能会更快
- 在你的输出
Rows(1)
中循环 Cells
- 如果 header 在您的 "unwanted" 列表中,则
.EntireColumn.Delete
我会试一试。
我在 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)
开始的连续范围内将 - 从
.UsedRange
中检索 XML
- 将 XML 读入您的记录集中
.Delete
工作sheet 没有提示- 以
End with
结束
Union
-range-values 输出到那个 sheet
将其放入您的 GetRecordset
-Function,因为它同时解决了两行 header 的问题。如果性能有问题,请考虑将额外的 Boolean
传递给您的函数以确定您的函数是否使用解决方法。
希望对您有所帮助。
编辑: 我们不能只从打开的记录集中删除未使用的Field
。如您所料,每个变通办法都有点不妥。
因为要测试性能,所以只能给大家一些测试思路。
使用上面提到的
Worksheets.Add
,如果你重复这样做,性能会变慢。但是,您可以
而不是在每个循环中创建一个Worksheet
- 创建一个新的
Worksheet
一次, .UsedRange.Cells.Clear
每次迭代后.Delete
最后一次。
- 创建一个新的
如果您使用
可能会更快.CopyFromRecordset
,并以空白 output-sheets 开头,那么- 在你的输出
Rows(1)
中循环Cells
- 如果 header 在您的 "unwanted" 列表中,则
.EntireColumn.Delete
- 在你的输出
我会试一试。