Excel VBA将数据导出到MS Access表 - 扩展

时间:2015-04-20 15:44:17

标签: excel vba excel-vba ms-access-2010

我试图使用我在stackoverflow here上发布的其他一个线程中描述的方法。

当使用该线程中描述的方法(得到绿色检查)时,我在运行代码时遇到错误。该错误弹出一个没有内容的空白消息框。

有几件事需要提及:

(1)我确保在Excel中选择并激活Microsoft Access 14.0对象库。

(2)我正在Excel中的数据库工作表中运行子过程。

(3)然后我在我的代码程序中从Excel中的向导工作表(单独的工作表)中运行AccImport过程。


EXCEL SPREADSHEET SETUP

我不能使用屏幕截图,因为我是社区新手,但数据库工作表字段范围设置如下。

B1(发生日期),C1(机器),D2(单元),E2(状态),F2(发行),G2(预防/纠正),H2(指定)

B2(15-APR-2015),C2(机器1),D2(单元1),E2(0),F2(测试),G2(校正),H2(名称示例1)


访问数据库表如下设置:

表名:MaintenanceDatabase

ID,发生日期,机器,单元格,状态,问题,预防/纠正分配给

以下是我在Excel中的数据库工作表中运行的代码:

Sub AccImport()

    Dim acc As New Access.Application
    acc.OpenCurrentDatabase "C:\Users\brad.edgar\Desktop\DASHBOARDS\MAINTENANCE\MaintenanceDatbase.accdb"
    acc.DoCmd.TransferSpreadsheet _
        TransferType:=acImport, _
        SpreadsheetType:=acSpreadsheetTypeExcel12Xml, _
        TableName:="MaintenanceDatabase", _
        Filename:=Application.ActiveWorkbook.FullName, _
        HasFieldNames:=True, _
        Range:="Database$B1:H2"
    acc.CloseCurrentDatabase
    acc.Quit
    Set acc = Nothing

End Sub

运行AccImport的其他工作表对象的代码片段:

Public Sub DeleteSelectedRecord()
    Dim CurrentSelectedIndex    As Integer

    ' Assign the currently selected index to CurrentSelectedIndex
    CurrentSelectedIndex = [Database.CurrentIndex]

    ' Move the ListBox Selector
    If [Database.CurrentIndex].Value = [Database.RecordCount] Then    
'Last item on the list
        [Database.CurrentIndex].Value = [Database.CurrentIndex].Value - 1
    End If

    'Copy to Access Database

    Database.AccImport

    ' Delete the entry
    Database.ListObjects("Database").ListRows(CurrentSelectedIndex).Delete

End Sub

希望有人可以解释为什么我会收到错误。

提前感谢您的帮助。

干杯,

布拉德

1 个答案:

答案 0 :(得分:0)

我从来没有尝试过以你提到的方式从excel写入。以下是我的首选方法。您需要使用Microsoft DAO对象库,但使用DAO对象,您可以执行更新,插入,拉取,以及您需要完成的任何事情。

 Sub SaveCustomer_Defaults()

 Dim strSQL As Variant
 Dim accApp As Object
 Dim srcs As Variant
 Dim msg1 As Variant

 Sheets("Lists").Visible = True
 Sheets("Lists").Select
     Range("T6").Select
     x = Range("T500000").End(xlUp).Row

 For i = 6 To x
     Cells(i, 20).Select
     If Environ("USERNAME") = Cells(i, 23).Value Then
      'location of the access db   
      srcs = "C:\\user\desktop\Detail_1.accdb"  ''' Live location '''

    Set accApp = GetObject(srcs, "access.Application")

    'write your sql to pull the table along with the cell values
    strSQL = "Select * from US_CustomID "
    strSQL = strSQL & " where( [AssignedTo] = '" & Sheets("Lists").Cells(i, 21)
    strSQL = strSQL & "' and [Tab] = '" & Sheets("Lists").Cells(i, 24)
    strSQL = strSQL & "' and [RepID] = '" & Sheets("Lists").Cells(i, 23)
    strSQL = strSQL & "');"

    Set db = DAO.OpenDatabase(srcs)
    Set rs = db.OpenRecordset(strSQL)

    On Error Resume Next
    rs.Edit


    rs![Occurrence Date] = Sheets("Lists").Cells(i, 25)
    rs![Machine] = Sheets("Lists").Cells(i, 26)
    rs![Cell] = Sheets("Lists").Cells(i, 27)
    rs![Status] = Sheets("Lists").Cells(i, 28)
    rs![Issue] = Sheets("Lists").Cells(i, 29)
    rs![Preventative/Corrective] = Sheets("Lists").Cells(i, 30)
    rs![Assigned To] = Sheets("Lists").Cells(i, 31)

    rs.Update

    If Not rs Is Nothing Then rs.Close

    Set rs = Nothing
    Set db = Nothing

    accApp.DoCmd.RunSQL strSQL
    accApp.Application.Quit
        End If
    Next i

    Sheets("Lists").Visible = False

    End Sub