簡體   English   中英

無論如何,ADO 在保存之前從只讀 excel 文件中讀取更新的數據? (VBA)

[英]Anyway for ADO to read updated data from a read-only excel file before save? (VBA)

我正在使用以下代碼從 SAME Excel 工作表的 Sheet1 中讀取數據。 我將數據加載到返回數組中。 Excel 工作表文件已選中“只讀”,並且始終以“只讀”模式打開。

問題是,如果我更改 Sheet1 上的任何數據,因為文件以“只讀”方式打開,它不會反映在 ADO 查詢中。 ADO 繼續輸出“已保存”文件中的內容,並忽略臨時只讀版本中已更新的內容。 例如,下面從單元格“E6”中提取值“Col5:6”。 如果我將值替換為“test”,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

您無法使用 ADO 從 Excel 工作表中讀取未保存的更改,因為未保存的數據位於內存(RAM,可能還有交換文件)中,而 ADO 旨在連接到數據庫文件或基於服務器的數據庫。

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

  1. 獲取 XML 格式的源范圍值,修復字段名稱。
  2. 創建 XML DOM 文檔並加載 XML 字符串。
  3. 創建 ADO 記錄集並轉換文檔。
  4. 進行必要的過濾和排序。 請注意,過濾條件語法有一些限制
  5. 進一步處理結果記錄集,例如輸出到另一個工作表。

有一個代碼示例:

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上的源數據如下:

源文件

然后我在Sheet2上得到了結果:

結果

暫無
暫無

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

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