避免尝试使用 VBA 和 ADO/SQL 将 NULL 值加载到数组中以从 excel sheet 中提取数据

Avoid trying to load NULL values into array using VBA and ADO/SQL to pull data from excel sheet

我有一些简单的代码可以将 excel sheet 中的所有数据加载到一个数组中,但是由于我的源 sheet 有一些空白列 IE:Q 到 EA 是空白列,但 A -P 和 EB - EF 有数据。 (excel sheet 被用作 table 的糟糕设计我知道,..但我没有这样做) 鉴于我无法重新设计 table.. 我怎样才能跳过空白以避免在将它们加载到我的数组时导致错误?

Dim Conn As New ADODB.Connection
Dim mrs As New ADODB.Recordset
Dim DBPath As String, sconnect As String

DBPath = "\MYPATH\MYFILE.xlsm"
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 [log$]" 


    mrs.Open sSQLSting, Conn
        '=>Load the Data into an array
        ReturnArray = mrs.GetRows

    'Close Recordset
    mrs.Close

'Close Connection
Conn.Close

IsNull()函数returns判断对错。所以将它包含在 Jet/ACE 的条件逻辑函数 IIF()

sSQLString = "SELECT IIF(IsNull(Col1), 0, Col1)," _
              & " IIF(IsNull(Col2), 0, Col2)," _
              & " IIF(IsNull(Col3), 0, Col3)" 
              & " From [log$];" 

@JohnsonJason 为什么在 Array 中需要它?您可以使用 Advanced Filter 过滤您的数据,例如 ,或者只是将其删除并循环以获取您需要的列。如果您不知道有多少列,您可以创建一个克隆 Recordset 并获取列名称并基于此创建您的 Query

克隆体 RecordSet 是这样的:

'' Declare Variables
Dim oRst As ADODB.Recordset, oRstVal As ADODB.Recordset, oStrm As ADODB.Stream  
Dim sHeaders as String 

'' Set Variables
Set oRst = New ADODB.Recordset
Set oRstVal = New ADODB.Recordset
Set oStrm = New ADODB.Stream  

.... [Something else]
'' Save your current Recordset in the Stream
oRst.Save oStrm  

'' Assign your Stream to the new Recordset (oRstVal)
oRstVal.Open oStrm

'' Loop trough your Recorset for Columns Name
'' Use an IF or a Select to filter
For iCol = 0 To oRstVal.Fields.Count - 1 
    sHeaders = sHeaders + "," + oRstVal.Fields(iCol).Name
Next

并在您的语句中使用 sHeaders 来获取您需要的列。

''Instead of Select * From ...
sQuery = "Select " + sHeaders + _
            "From ...."