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

我有一些简单的代码,将所有的数据从excel工作表加载到数组中,但由于我的源代码表有一些空白列IE:Q到EA是空白列,但我得到错误94正确使用null, A -P和EB-EF有数据。 (可怕的devise为Excel表作为一个表我知道,但我没有这样做)看到因为我不能重新devise表…我怎样才能跳过空白,以避免造成错误,当它们加载到我的arrays?

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()函数返回True或False。 所以把它包含在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 来过滤你的数据,或者直接删除它并循环获取你需要的列。 如果你不知道有多less列,你可以创build一个克隆Recordset并获取列名称和创build你的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 

在你的Statement中使用sHeaders来获取你需要的列。

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