2017-01-13 54 views
-1

我遇到了我在Excel VBA項目中使用的Recordset問題。我試圖在Recordset中讀取一定範圍,直到現在一直工作。但是這一次我希望得到一個不連貫的範圍內,這在我的情況下,由一個表的列,並給這個範圍內,通過下面的函數記錄Incoherent Range into Recordset

'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

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

在話題:

添加Debug.Print rng.value(xlRangeValueMSPersistXML)自己的函數中進行調試。您將看到XML僅包含您的第一個範圍,即使您將範圍與第一個範圍結合在一起,也是如此。

Afaik沒有解決這個問題。嘗試修復連續的範圍。

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

  • 創建於.Cells(1,1)
  • 在運行一個新的片材With ThisWorkbook.Worksheets.Add
  • 輸出的Union - 範圍值到片的連續範圍內起價通檢索XML
  • 讀取XML到您的記錄
  • .Delete工作表中沒有提示
  • 結束與End with

將這個到您GetRecordset - 功能,因爲在同一時間,它解決了問題你有兩個標題行。如果性能問題,請考慮將其他Boolean傳遞給您的函數,以確定您的函數是否使用解決方法。

希望有所幫助。

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

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

  1. 與使用上述Worksheets.Add,較慢的性能,如果你反覆做可以預期的。

    然而,而不是創建在每個循環中Worksheet,你可以

    • 創建一個新的 Worksheet一次,
    • .UsedRange.Cells.Clear末每次迭代
    • .Delete一次之後。
  2. 如果使用.CopyFromRecordset,並與空白輸出表開始

    ,很可能更快地只是

    • 循環Cells在你的輸出繼電器
    • Rows(1)如果標題是在你的「無用」 -list然後.EntireColumn.Delete

我會給1.一試。

+0

嘿,首先我該如何標記你的答案有幫助?我試圖按下「upvote」按鈕,但我得到一個消息,由於我的名聲不到15,所以反饋將被計數,但不公開顯示。其次,我怎樣才能關閉一個線程?我無法找到任何相關信息,或者我只需要用-closed-或類似的東西寫一個答案? 要回到主題... 解決方法肯定會適用於我的情況,但正如您在最後一句中所述,性能將受到影響。我會盡快完成並儘快回覆你。謝謝! – Till

+0

我確實寫了解決方法,性能肯定受到嚴重影響。也許如果我把這個問題描述得更清楚或者更加不同,你可以讓我看到另一條路。基本表有25列(不確定),在這種情況下,我要麼只有20列被讀入記錄集或只有20列被複製出來。我希望你能從中得到更好的理解,可能會幫助我一點。 – Till

+0

請參閱**編輯**以瞭解如何加快速度。不知道有這樣做的好方法。 爲了標記回答的問題,您應該能夠檢查up/downvote按鈕下方的灰色複選標記。 –