2016-03-21 198 views
1

我正在使用以下代碼從Sheet1的Sheet讀取數據。我將數據加載到返回數組中。 Excel工作表文件具有「只讀」選中狀態並始終以「只讀」模式打開。無論如何讓ADO在保存之前從只讀excel文件讀取更新的數據? (VBA)

問題是如果我更改Sheet1上的任何數據,因爲該文件打開爲「只讀」,它不會反映在ADO查詢中。 ADO繼續輸出「已保存」文件中的內容,並忽略在臨時只讀版本中更新的內容。 例如,下面從單元格「E6」中拉取值「Col5:6」。如果我將值替換爲「測試」,ADO仍輸出「Col5:6」

如何讓ADO讀取Sheet1上的當前數據而不必「另存爲」?

Sub sbADO() 
    Dim sSQLSting As String 
    Dim Conn As New ADODB.Connection 
    Dim mrs As New ADODB.Recordset 
    Dim DBPath As String, sconnect As String 
    Dim returnArray 

    DBPath = ThisWorkbook.FullName 
    sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBPath _ 
    & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";" 

    Conn.Open sconnect 
    sSQLSting = "SELECT * From [Sheet1$] " 

    mrs.Open sSQLSting, Conn 

    returnArray = mrs.GetRows 

    mrs.Close 
    Conn.Close 

    Debug.Print returnArray(4, 4) '>> "Col5:6" 

End Sub 
+1

我會使用一個公共變量,blnWorksheetDirty作爲布爾值,然後在工作表中更改事件,如果發生更改,那麼將其設置爲true,那麼如果存在,則保存臨時副本並查詢,如果不是,則使用您的有。 –

+0

是不是有一種方法可以指示ADO讀取只讀版本中的臨時數據?還是必須始終從最後保存的版本中讀取? –

+0

爲什麼要使用ADODB?當它似乎要求您先將文件保存在某個位置(您想要避免的位置)?爲什麼不直接將數據「抓」到數組中並跳過ADO連接?這只是兩行VBA代碼:http://stackoverflow.com/questions/18000617/how-to-copy-selected-range-into-given-array/18000989#18000989如果這不是一個選項,那麼如何使用不同的像數據庫服務器的後端數據? – Ralph

回答

1

你不能用ADO讀取Excel工作表中未保存的更改,因爲未保存的數據位於內存(RAM,並可能交換文件),和ADO設計用於連接到DB 文件或服務器基於數據庫。

如果您認爲SQL是唯一的方法,並且您的WHERE子句非常簡單,那麼您可以使用內置的ADO Recordset功能進行篩選和排序,而無需建立連接。執行以下操作:

  1. 以XML格式獲取源範圍的值,修復字段名稱。
  2. 創建XML DOM文檔並加載XML字符串。
  3. 創建ADO記錄集並轉換文檔。
  4. 進行必要的篩選和排序。請注意,有some limitations on filter criteria語法。
  5. 進一步處理結果記錄集,例如, G。輸出到另一個工作表。

有代碼的一個例子:

Option Explicit 

Sub FilterSortRecordset() 
    Dim arrHead 
    Dim strXML As String 
    Dim i As Long 
    Dim objXMLDoc As Object 
    Dim objRecordSet As Object 
    Dim arrRows 

    ' get source in XML format 
    With Sheets("Sheet1") 
     arrHead = Application.Index(.Range("A1:G1").Value, 1, 0) 
     strXML = .Range("A2:G92").Value(xlRangeValueMSPersistXML) 
    End With 

    ' fix field names 
    For i = 1 To UBound(arrHead) 
     strXML = Replace(strXML, "rs:name=""Field" & i & """", "rs:name=""" & arrHead(i) & """", 1) 
    Next 

    ' load source XML into XML DOM Document 
    Set objXMLDoc = CreateObject("MSXML2.DOMDocument") 
    objXMLDoc.LoadXML strXML 

    ' convert the document to recordset 
    Set objRecordSet = CreateObject("ADODB.Recordset") 
    objRecordSet.Open objXMLDoc 

    ' filtering and sorting 
    objRecordSet.Filter = "City='London' OR City='Paris'" 
    objRecordSet.Sort = "ContactName ASC" 

    ' populate another sheet with resulting recordset 
    arrRows = Application.Transpose(objRecordSet.GetRows) 
    With Sheets("Sheet2") 
     .Cells.Delete 
     .Cells.NumberFormat = "@" 
     For i = 1 To objRecordSet.Fields.Count 
      .Cells(1, i).Value = objRecordSet.Fields(i - 1).Name 
     Next 
     .Cells(2, 1).Resize(UBound(arrRows, 1), UBound(arrRows, 2)).Value = arrRows 
     .Columns.AutoFit 
    End With 
End Sub 

Sheet1的SOURSE數據如下:

src

然後我上Sheet2結果:

result