[英]Using SQL in VBA to Join Data from two Excel Workbooks (Read-Only error)
[英]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 內置功能進行過濾和排序,而無需建立連接。 請執行下列操作:
有一個代碼示例:
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.