【问题标题】:Export from Excel to Access 2007 using Excel VBA使用 Excel VBA 从 Excel 导出到 Access 2007
【发布时间】:2015-10-15 09:37:01
【问题描述】:

我需要导出工作表的内容以附加到 access 数据库表(均为 2007 年),并且我正在尝试从 Excel 电子表格中的模块运行它。该表有一个主键,它是一个自动编号,我尝试在电子表格中使用和不使用空第一列的情况下运行下面的模块,以将电子表格列与表列匹配。此外,表中的最后一个字段是一个复选框 Y\N,我已将电子表格中的最后一列设为 TRUE 和 FALSE 值。但是当我运行该模块时,我得到了“Finished”消息框,但表格没有更新。电子表格和数据库都在 C: 的位置。我做错了什么?

Private Sub AddData()


Dim strMyPath As String, strDBName As String, strDB As String, strSQL   
 As  String
Dim i As Long, n As Long, lastRow As Long, lFieldCount As Long
Dim adoRecSet As New ADODB.Recordset
Dim connDB As New ADODB.Connection

strDBName = "CMDB.mdb"
strMyPath = ThisWorkbook.Path
strDB = strMyPath & "\" & strDBName

"Microsoft.ACE.OLEDB.12.0". The ACE Provider can be used for both the    
  Access .mdb & .accdb files.
  connDB.Open ConnectionString:="Provider = Microsoft.ACE.OLEDB.12.0;    
  data source=" & strDB


Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(18)

Set adoRecSet = New ADODB.Recordset

strTable = "Asset_Table"
adoRecSet.Open Source:=strTable, ActiveConnection:=connDB,    
CursorType:=adOpenStatic, LockType:=adLockOptimistic


lFieldCount = adoRecSet.Fields.Count
'determine last data row in the worksheet:
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row


For i = 2 To lastRow

   adoRecSet.AddNew

   For n = 0 To lFieldCount - 1
    adoRecSet.Fields(n).Value = ws.Cells(i, n + 1)
   Next n

   adoRecSet.Update

Next i



adoRecSet.Close
connDB.Close
Set adoRecSet = Nothing
Set connDB = Nothing

MsgBox "Finished"

End Sub

编辑:下面 Evans 和 ChipsLetten 的建议得到了帮助,我已经解决了这个问题。我更改了行数计算并添加了一个 If 来处理自动编号,因为 Chips 建议如下。

Dim b As Long  
b = ws.UsedRange.Rows.Count

For i = 2 To b - 1
 adoRecSet.AddNew
  For n = 0 To lFieldCount - 1
    If Not adoRecSet.Fields(n).Properties("ISAUTOINCREMENT") Then    
     adoRecSet.Fields(n).Value = ws.Cells(i, n + 1).Value
   End If

 Next n
adoRecSet.Update

Next i

【问题讨论】:

  • 您是否尝试过使用调试器单步执行您的代码以查看是否进入了循环并按预期进行迭代?您可以尝试执行 SQL 查询来追加数据,而不是使用记录集。
  • @Evan 感谢您的回复。抱歉回复晚了,但那是周末。我会尝试你的建议
  • @Evan 谢谢。我已经解决了这个问题。你的建议奏效了,因为我发现这是一个愚蠢的错误,我计算最后一行的代码返回值 1,因此外部 for 循环甚至没有运行一次。

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


【解决方案1】:

在尝试向其写入值之前,您可以测试该字段以查看它是否为自动递增字段。试试下面对我来说没问题的代码(Excel 2007 但 Access 2010)

For i = 2 To lastRow

    adoRecSet.AddNew

    For n = 0 To lFieldCount - 1
        If Not adoRecSet.Fields(n).Properties("ISAUTOINCREMENT") Then
            adoRecSet.Fields(n).Value = ws.Cells(i, n + 1).Value
        End If
    Next n

    adoRecSet.Update

Next i

对 Excel 工作表的最后一列使用 TRUE/FALSE 对我来说效果很好。

【讨论】:

  • 谢谢。抱歉回复晚了,但那是周末。我已经尝试了你的建议,但结果是一样的
  • 谢谢。我已经解决了这个问题。我计算最后一行的代码是错误的,因此外部 for 循环没有运行一次。您的“ISAUTOINCREMENT”也有帮助,因为它现在也可以很好地处理自动编号。我将更新问题以显示我的更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2018-08-08
相关资源
最近更新 更多