【问题标题】:Importing excel data with SQL-query in VBA jumps over first row在 VBA 中使用 SQL 查询导入 excel 数据会跳过第一行
【发布时间】:2019-03-12 20:37:51
【问题描述】:

我正在尝试将数据从一个 Excel 工作簿复制到另一个。为此,我正在使用 ADODB 连接。通过 SQL 查询,我将所有数据从我想要的工作表复制到另一个工作簿。但是,由于某种原因,它会跳过每张纸的第一行。因此,复制的数据总是从第 2 行开始。 也许你们中的某个人可以发现我的错误或向我解释为什么会发生这种情况?

Sub ImportExcelSQL()

Dim sheetName, sheetNewName, filepath, strConnection, Sql As String
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset

'-------- Close workbook updates ----------
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.AskToUpdateLinks = False
Application.StatusBar = "Importing...."
'------------------------------------------

filepath = Range("filepath")

strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
                  & "DBQ=" + filepath + ";"

' Create the Connection and Recordset objects.
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset

' Open connection
conn.Open strConnection

' Loop through the sheets
Dim i As Integer
i = 1
Do Until IsEmpty(Range("importSheetNames").Offset(i, 0))

    If Range("importSaveSheetFlags").Offset(i, 0).Value = "Y" Then

    ' Get sheet names and input variables"
    sheetName = Range("importSheetNames").Offset(i, 0).Value
    sheetNewName = Range("exportSheetNames").Offset(i, 0).Value
    filepath = Range("filepath")

    ' Clear data sheet
    Sheets(sheetNewName).UsedRange.ClearContents

    ' ----------------------- SQL CODE ----------------------------
    Sql = "SELECT * FROM [" + sheetName + "$A:CA]"
    'Sql = "SELECT * FROM [" + sheetName + "$A1:CA1000]" 'Does not do any difference

    ' Open the connection and execute.
    'conn.Open strConnection
    Set rs = conn.Execute(Sql)

    ' Check we have data.
    If Not rs.EOF Then
       ' Transfer result.
       Sheets(sheetNewName).Range("A1").CopyFromRecordset rs
       ' Close the recordset
       rs.Close
    Else
       MsgBox "Error: No records returned.", vbCritical
    End If

    ' -------------- End of SQL --------------------------------------------

    End If


    i = i + 1
Loop

' Clean up
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rs = Nothing

'-----------------------------------------------
' Turn on automatic updating
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True
Application.StatusBar = "Finished"
'-----------------------------------------------

End Sub

【问题讨论】:

    标签: sql excel vba import adodb


    【解决方案1】:

    问题在于 Excel(或者更准确地说是驱动程序)期望源数据的第一行包含标题行(包含列的名称)。

    理论上,连接字符串中有一个参数,您可以在其中定义是否有标题行,HDR=YES;,但似乎此驱动程序忽略了此参数,而是从注册表中读取了一个值.见https://stackoverflow.com/a/49555650/7599798

    作为替代方案,您可以使用 OLE 驱动程序:尝试

    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filepath _ 
                  & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;"""
    

    这尊重HDR的设置,所以如果你写HDR=NO,它将复制第一行,而HDR=YES跳过它。如果你有一个标题行,你可以在SQL-statement 中通过它们的名字来访问这些列,否则你必须通过列字符来访问它们。

    【讨论】:

    • 非常感谢!确实是驱动因素造成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2020-11-25
    • 2023-03-03
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多