Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA从Excel导出数据以访问_Excel_Ms Access_Vba_Export - Fatal编程技术网

使用VBA从Excel导出数据以访问

使用VBA从Excel导出数据以访问,excel,ms-access,vba,export,Excel,Ms Access,Vba,Export,我在Excel文件中有一个表,其中包含一些数据,我想用VBA代码将这些数据导出到Access上的数据库(在我数据库中的一个名为“水质”的具体表中),以避免每次我想在数据库中引入更多数据时都打开数据库 目前我有这个代码,但它不工作 Sub Button14_Click() ' Macro purpose: To add record to Access database using ADO and SQL ' NOTE: Reference to Microsoft ActiveX Data

我在Excel文件中有一个表,其中包含一些数据,我想用VBA代码将这些数据导出到Access上的数据库(在我数据库中的一个名为“水质”的具体表中),以避免每次我想在数据库中引入更多数据时都打开数据库

目前我有这个代码,但它不工作

Sub Button14_Click()

' Macro purpose: To add record to Access database using ADO and SQL
' NOTE:  Reference to Microsoft ActiveX Data Objects Libary required

' Exports data from the active worksheet to a table in an Access database

'Dim cnt As New ADODB.Connection
'Dim rst As New ADODB.Recordset
Dim cnt As DAO.Database
Dim rst As Recordset
Dim dbPath As String
Dim tblName As String
Dim rngColHeads As Range
Dim rngTblRcds As Range
Dim colHead As String
Dim rcdDetail As String
Dim ch As Integer
Dim cl As Integer
Dim notNull As Boolean
Dim sConnect As String

'Set the string to the path of your database as defined on the worksheet
dbPath = "C:\Documents and Settings\Administrador\Mis documentos\MonEAU\modelEAU Database V.2.accdb"
tblName = "Water Quality"
Set rngColHeads = ActiveSheet.Range("tblHeadings")
Set rngTblRcds = ActiveSheet.Range("tblRecords")

'Set the database connection string here
sConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & dbPath & "';"     'For use with *.accdb files
' sConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath & ";"     'For use with *.mdb files

'Concatenate a string with the names of the column headings
colHead = " ("
For ch = 1 To rngColHeads.Count
    colHead = colHead & rngColHeads.Columns(ch).Value
    Select Case ch
        Case Is = rngColHeads.Count
            colHead = colHead & ")"
        Case Else
            colHead = colHead & ","
    End Select
Next ch

'Open connection to the database
cnt.Open sConnect
'Begin transaction processing
On Error GoTo EndUpdate
cnt.BeginTrans

'Insert records into database from worksheet table
For cl = 1 To rngTblRcds.Rows.Count
    'Assume record is completely Null, and open record string for concatenation
    notNull = False
    rcdDetail = "('"

    'Evaluate field in the record
    For ch = 1 To rngColHeads.Count
        Select Case rngTblRcds.Rows(cl).Columns(ch).Value

                'if empty, append value of null to string
            Case Is = Empty
                Select Case ch
                    Case Is = rngColHeads.Count
                        rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL)"
                    Case Else
                        rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL,'"
                End Select

                'if not empty, set notNull to true, and append value to string
            Case Else
                notNull = True
                Select Case ch
                    Case Is = rngColHeads.Count
                        rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "')"
                    Case Else
                        rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "','"
                End Select
        End Select
    Next ch

    'If record consists of only Null values, do not insert it to table, otherwise
    'insert the record
    Select Case notNull
        Case Is = True
            rst.Open "INSERT INTO " & tblName & colHead & " VALUES " & rcdDetail, cnt
        Case Is = False
            'do not insert record
    End Select
Next cl

EndUpdate:
'Check if error was encounted
If Err.Number <> 0 Then
    'Error encountered.  Rollback transaction and inform user
    On Error Resume Next
    cnt.RollbackTrans
    MsgBox "There was an error.  Update was not succesful!", vbCritical, "Error!"
Else
    On Error Resume Next
    cnt.CommitTrans
End If

'Close the ADO objects
cnt.Close
Set rst = Nothing
Set cnt = Nothing
On Error GoTo 0

End Sub
子按钮14\u单击()
'宏用途:使用ADO和SQL将记录添加到Access数据库
'注意:需要引用Microsoft ActiveX数据对象库
'将数据从活动工作表导出到Access数据库中的表
'作为新ADODB.Connection的Dim cnt
'将rst设置为新ADODB.Recordset
Dim cnt作为DAO.Database
将rst设置为记录集
将dbPath设置为字符串
作为字符串的Dim tblName
变暗RNG磁头作为范围
变暗RNGTBLRCD作为范围
像线一样暗的黑头
Dim rcdDetail作为字符串
Dim ch As Integer
作为整数的Dim cl
Dim notNull作为布尔值
暗连接为字符串
'将字符串设置为工作表上定义的数据库路径
dbPath=“C:\Documents and Settings\Administrador\Mis documentos\MonEAU\modelEAU Database V.2.accdb”
tblName=“水质”
设置rngColHeads=ActiveSheet.Range(“TBL标题”)
设置rngTblRcds=ActiveSheet.Range(“tblRecords”)
'在此处设置数据库连接字符串
sConnect=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=”&dbPath&“;”,用于*.accdb文件
'sConnect=“Provider=Microsoft.Jet.OLEDB.4.0;数据源=“&dbPath&”;”,用于*.mdb文件
'将字符串与列标题的名称连接起来
colHead=“(”
对于ch=1到rngColHeads.Count
colHead=colHead&rngColHeads.Columns(ch).Value
选择案例ch
Case Is=rngColHeads.Count
colHead=colHead&“.”
其他情况
colHead=colHead&“
结束选择
下一个ch
'打开与数据库的连接
cnt.开放式连接
'开始事务处理
转到EndUpdate时出错
cnt.beginters
'将记录从工作表表插入数据库
对于cl=1到rngTblRcds.Rows.Count
'假定记录完全为空,并打开记录字符串进行连接
notNull=False
rcdDetail=“(”)
'记录中的评估字段
对于ch=1到rngColHeads.Count
选择Case rngTblRcds.Rows(cl).Columns(ch).Value
'如果为空,则将null值附加到字符串
箱子是空的
选择案例ch
Case Is=rngColHeads.Count
rcdDetail=Left(rcdDetail,Len(rcdDetail)-1)和“NULL”)
其他情况
rcdDetail=Left(rcdDetail,Len(rcdDetail)-1)和“NULL,”
结束选择
'如果不为空,请将notNull设置为true,并将值附加到字符串
其他情况
notNull=True
选择案例ch
Case Is=rngColHeads.Count
rcdDetail=rcdDetail&rngTblRcds.Rows(cl.Columns(ch.Value&“)”
其他情况
rcddeail=rcddeail&rngTblRcds.Rows(cl).Columns(ch).Value&“,”
结束选择
结束选择
下一个ch
'若记录只包含空值,则不要将其插入表,否则
'插入记录
选择大小写notNull
Case=True
rst.打开“插入到”&tblName&colHead&“值”&rcdDetail,cnt
Case=False
'不插入记录
结束选择
下一个cl
结束更新:
'检查是否遇到错误
如果错误号为0,则
'遇到错误。回滚事务并通知用户
出错时继续下一步
cnt.RollbackTrans
MsgBox“出现错误。更新未成功!”,vbCritical,“错误!”
其他的
出错时继续下一步
cnt.CommitTrans
如果结束
'关闭ADO对象
cnt.关闭
设置rst=无
设置cnt=Nothing
错误转到0
端接头
目前的问题是,当我调试代码时,在函数“cnt.Open sConnect”上出现编译错误:“Method or data member not found”

如果这是可能的,任何帮助将不胜感激


注意:我使用的是Office 2010。

我只有打开excel文件的Access数据库(而不是相反的方式),但是通过查看我的代码,我认为您应该直接转到以下内容:

`Set cnt = OpenDatabase_
       (dbPath, False, True, "Access 8.0;")
我也发现了这个


这有帮助吗?

编译错误是由以下两行引起的:

Dim cnt As DAO.Database
cnt.Open sConnect
DAO.Database
对象没有
.Open
方法,该方法解释了“未找到方法或数据成员”。错误消息往往有些含糊不清,只是没有多大帮助。然而,在这种情况下,我想不出错误信息是如何变得更加清晰的

还有一件事我不明白
sConnect
看起来像一个ADO连接字符串。但是
cnt
是一个DAO(数据库)对象。不能在一条语句中混搭这两个对象模型

在活动变量声明之前有以下内容:

'Dim cnt As New ADODB.Connection
然后在随后的程序中,您有:

'Close the ADO objects
cnt.Close
因此,可能您最初打算将
cnt
作为
ADO.Connection
对象,而在将其切换为
DAO.Database
对象后,没有调整其余代码


我建议您修改您的代码,以解决DAO与ADO之间的混淆,然后如果您还有任何问题,请向我们展示新代码。请仅向我们展示再现您希望解决的问题所需的最低测试代码。TIA供您考虑。

现在,当我调试代码时,错误出现在那一行:新的KeybordThanks的使用无效!我可以解决这个问题。。。正如你所说,DAO和ADO之间存在混淆。现在还有其他的问题,首先我必须检查哪些地方出了问题。