簡體   English   中英

到 Recordset 的不連貫范圍

[英]Incoherent Range into Recordset

我在 Excel VBA 項目中使用的記錄集出現問題。 我正在嘗試將某個范圍讀入 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 和后記將數據從記錄集中復制出來時,我得到的只是第一個范圍的數據。

我編輯了變量的名稱,因為涉及到一些內部數據。

已經感謝您的幫助!

很高興你發現它有用。 如果您認為問題已解決,請確保標記有用的答案並關閉開放線程。

主題:

在您的函數中添加Debug.Print rng.value(xlRangeValueMSPersistXML)以進行調試。 您會看到 XML 只包含您的第一個范圍,即使您將范圍與,好吧, Union優先。

Afaik 沒有辦法解決這個問題。 嘗試使用連續范圍進行修復。

但是,如果你絕對需要兩個范圍的一個記錄,並且可以保證他們有兩個相同的行數和每Row(i)A屬於Row(i)B ,那么解決方法是

  • 使用With ThisWorkbook.Worksheets.Add即時創建新工作表
  • 在從.Cells(1,1)開始的連續范圍內將您的Union范圍值輸出到該工作表
  • 從 pass .UsedRange檢索 XML
  • 將 XML 讀入您的記錄集中
  • .Delete沒有提示的工作表
  • End with

將其放入您的GetRecordset -Function 中,因為它同時解決了您在使用兩個標題行時遇到的問題。 如果性能是一個問題,請考慮向您的函數傳遞一個額外的Boolean ,以確定您的函數是否使用該解決方法。

希望有幫助。

編輯:我們不能只是從打開的記錄集中刪除一個未使用的Field 正如您所料,每個解決方法都有點臟。

由於我要測試性能,我只能給你一些測試的想法。

  1. 使用上面提到的Worksheets.Add ,如果重復執行,性能會降低。

    但是,不是在每個循環中創建一個Worksheet ,您可以

    • 一次創建一個新的Worksheet
    • .UsedRange.Cells.Clear每次迭代后
    • .Delete一次。
  2. 如果您使用.CopyFromRecordset並從空白輸出表開始,則可能會更快

    • 在輸出的Rows(1)中循環Cells
    • 如果標題在您的“不需要的”列表中,則.EntireColumn.Delete

我會給 1. 試一試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM