代码之家  ›  专栏  ›  技术社区  ›  PalimPalim

通过SQL提取Excel数据;日期列不工作

  •  0
  • PalimPalim  · 技术社区  · 6 年前

    我正在使用下面的函数从另一个工作簿中提取数据。它适用于非日期列,但不适用于保留日期的列

    工作表看起来像

    如果是 而不是日期列,则工作。

    debug.print getsheetsql(workbookpath,“select columna from[sheet$]”)(1)(“columna”)
    < /代码> 
    
    

    -->返回“palim”

    如果a是“日期”列,则不起作用

    < /代码> 
    
    

    -->不返回任何内容

    函数getsheetsql(path as string,sqlstr as string)as collection
    
    管,管,管
    '打开ADOB连接并通过SQL查询
    '连接字符串是标准的,并且
    取自:
    'https://www.connectionstrings.com/microsoft-jet-ole-db-4-0/standard-excel/
    
    Dim对象连接为对象
    Dim对象记录集为对象
    set objconnection=createObject(“adodb.connection”)。
    set objrecordset=createObject(“adodb.recordset”)。
    
    常量adopenstatic=3
    常量adlockoptimatic=3
    const adCmdText=&h1
    
    objConnection.open“provider=microsoft.jet.oledb.4.0;data source=”&path&“;extended properties='excel 8.0;hdr=yes”“”
    
    objrecordset.open sqlstr,objconnection,adopenstatic,adlockoptimatic,adcmdtext
    管,管,管
    '遍历查询的表
    '表是一个集合,表中每行有一行
    '行是以表标题为键的字典,返回相应的值
    将表变暗为集合
    set table=新集合
    将行变暗为对象
    模糊FLD
    '循环访问记录集行
    直到objrecordset.eof
    带对象记录集
    设置row=createObject(“scripting.dictionary”)。
    
    对于每个fld in.字段
    行.添加fld.名称,fld.值
    下一个FLD
    
    添加行
    
    MOVENEXT
    
    以结束
    回路
    
    设置getSheetSQL=表
    
    '关闭连接;将错误处理重置为默认值
    对象连接。关闭
    关于错误GOTO 0
    退出函数
    ErrorCloseConn:
    对象连接。关闭
    关于错误GOTO 0
    简历
    端函数
    < /代码> <

    工作表看起来像

    enter image description here

    如果是作品不是日期列:

    Debug.Print GetSheetSQL(workbookPath, "Select columna from [sheet$]")(1)("columna")
    

    -->返回“palim”

    如果a是a,则不工作日期栏

    Debug.Print GetSheetSQL(workbookPath, "Select columnb from [sheet$]")(1)("columnb")
    

    -->不返回任何内容

    Function GetSheetSQL(path As String, sqlStr As String) As Collection
    
    '''''''''''''''''''''''''''''''''''''''
    'Open ADOB Connection and query via sql
    '   Connection string is standard and
    '   taken from:
    '        https://www.connectionstrings.com/microsoft-jet-ole-db-4-0/standard-excel/
    
    Dim objConnection As Object
    Dim objRecordSet As Object
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")
    
    Const adOpenStatic = 3
    Const adLockOptimistic = 3
    Const adCmdText = &H1
    
    objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path & ";Extended Properties=""Excel 8.0;HDR=Yes"""
    
    objRecordSet.Open sqlStr, objConnection, adOpenStatic, adLockOptimistic, adCmdText
    '''''''''''''''''''''''''''''''''''''''
    'Iterate through queried table
    '   table is a collection with a row per row in the table
    '   row is a dictionary with table headings as key, returning the corresponding value
    Dim table As Collection
    Set table = New Collection
    Dim row As Object
    Dim fld
    'iterate through recordset rows
    Do Until objRecordSet.EOF
        With objRecordSet
            Set row = CreateObject("Scripting.Dictionary")
    
            For Each fld In .Fields
                row.Add fld.Name, fld.Value
            Next fld
    
            table.Add row
    
            .MoveNext
    
        End With
    Loop
    
    Set GetSheetSQL = table
    
    'Close Connection; reset Error Handling to default
    objConnection.Close
    On Error GoTo 0
    Exit Function
    ErrorCloseConn:
        objConnection.Close
        On Error GoTo 0
        Resume
    End Function
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   PalimPalim    6 年前

    我可以重新提出这个问题,也许这是有帮助的

    这看起来不错,但我把第一个单元格改成了文本日期。调试代码将使您

    因此,ADODB需要日期,类型为addate,并将文本转换为空字符串。

    < Buff行情>

    以下更新最终解决了问题

    < /块引用>

    update it may help to change the connection string to

    objconnection.open“provider=microsoft.jet.oledb.4.0;data source=”&path&“;extended properties=”“Excel 8.0;hdr=yes;imex=1”“”
    < /代码> 
    
    

    有关更多信息,请访问

    这看起来不错,但我把第一个单元格改成了文本日期。调试代码将使您

    enter image description here

    因此,ADODB需要一个日期,类型是addate,并将文本转换为空字符串。

    下面的更新最终解决了这个问题

    更新将连接字符串更改为

    objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""
    

    更多信息,请查看here