如何在excel vba中使用ADO在.xlsx文件中创建新工作表/表

时间:2018-04-14 13:50:02

标签: excel vba excel-vba xlsx adodb

您好我正在尝试创建一个功能,该功能将存储用户选择的一系列数据以及用户的自定义名称,然后使用ADO将数据存储在新的Excel表格中用户的自定义名称作为工作表名称。到目前为止,我已经获得了ADO连接,并且可以读取和写入.xlsx文件的数据,但是当我尝试通过创建新表创建新工作表时,我得到一个错误,表明我的工作表名称不正确。我使用了testtestName,在挖掘之后我感到难过。这是我的一大块代码:

Sub AddSheet()

    Dim DataName As String, SRange As Variant, qry As String, SCols As Integer, SRows As Integer

    DataName = InputBox("Enter Your Data Name:")
    Set SRange = Application.Selection
    Set SRange = Application.InputBox("Select your data to be saved:", xTitleId, SRange.Address, Type:=8)
    SCols = SRange.Columns.Count 'new
    SRows = SRange.Rows.Count 'new
    'creates the query to create a new sheet/table for the data
    qry = "CREATE TABLE [" & DataName & "$] ("
    For i = 1 To SCols
        qry = qry & "[Col" & i & "] Float"
        If i <> SCols Then
            qry = qry & ", "
        End If
    Next i
    qry = qry + ")"
    SQLUpdateData qry

End Sub

'function that executes the SQL query
Function SQLUpdateData(qry As String) As Variant

    Dim FileName As String, sconnect As String
    Dim cnn As New ADODB.Connection
    Dim objMyCmd As ADODB.Command

    Set cnn = New ADODB.Connection
    Set objMyCmd = New ADODB.Command
    FileName = "c:\Users\" & Environ("Username") & "\AppData\Roaming\Microsoft\AddIns\DataStorage.xlsx"
    sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & FileName & ";HDR=Yes';"
    cnn.Open sconnect
    objMyCmd.CommandType = adCmdText
    objMyCmd.CommandText = qry
    objMyCmd.ActiveConnection = cnn
    MsgBox qry
    objMyCmd.Execute
    Set objMyCmd = Nothing
    Set cnn = Nothing

End Function

到目前为止,我已打印出查询,并且在执行前看起来没问题。例如,如果用户选择名称test,我将获得以下查询输出:

  

CREATE TABLE [test $]([Col1] Float,[Col2] Float)

然后运行时错误说明

  

[Microsoft] [ODBC Excel驱动程序]&#39;测试$&#39;不是有效名称

我也搜索了这个错误,但仍然可以找出为什么这不起作用。任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:2)

以下示例显示如何使用ADOX创建工作簿并添加工作表:

Option Explicit

Sub Test()

    ' Add reference
    ' Microsoft ADO Ext. 6.0 for DDL and Security

    Dim cat As ADOX.Catalog
    Dim tbl As ADOX.Table
    Dim col As ADOX.Column

    Set cat = New ADOX.Catalog
    cat.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\test.xlsx;Extended Properties=Excel 12.0 Xml"
    Set tbl = New ADOX.Table
    tbl.Name = "TestTable"
    Set col = New ADOX.Column
    With col
        .Name = "Col1"
        .Type = adVarWChar
    End With
    tbl.Columns.Append col
    cat.Tables.Append tbl

End Sub

一些有用的链接:

About ADOX

Using ADOX with Excel Data

Microsoft ACE OLEDB 12.0 connection strings