【问题标题】:Numeric Values Change During Access VBA DoCmd.TransferSpreadsheet访问 VBA DoCmd.TransferSpreadsheet 期间数值更改
【发布时间】:2018-09-27 23:12:09
【问题描述】:

我正在开发一个自动将 Excel 工作表导入 Access 表的模块。导入的工作表的设计是相同的。使用 DoCmd.TransferSpreadsheets 可以很好地导入 A-O 列(文本和数字数据的混合),但是 P-AD 列的值有问题...

列 P 和 Q 表示开始和结束的里程表值,R 表示经过的距离。例如,在工作表上,车辆 OHS-11 报告为从 154952 开始,在 155636 结束,经过的距离为 684。导入的记录显示为开始和结束于 155636,经过的距离为 0。

列 S-AA 完全拒绝导入。 AB 列为所有记录导入 0,包括具有合法值的记录(即非空)。 AC-AD 列偶尔会导入一个 0,但许多记录是空白的。见下图:

我试过没用:

  • 在 Access 中设置字段类型
  • 让 Access 从头开始​​创建表
  • DoCmd.RunSavedImport 并不理想,因为源电子表格具有不同的名称
  • SELECT * INTO 将为每个工作表创建一个新表,我需要将所有电子表格中的数据合并到一个表中

在没有创建传输错误表的情况下导入成功但值被忽略/交换是很奇怪的。如果有关系,E-P、R 和 AB-AD 列中的单元格是公式。

我在 Windows 10 平板电脑系统上使用 Excel 2016 和 Access 2016。代码如下:

Option Compare Database

Sub Import_New_WS()
'--- Import new worksheets to temporary table

    Dim dbAC As Database
    Dim rsList, rsMonth, rsXfer As Recordset
    Dim strDestPath, strFilePath, strMFRSheetNo, strRange As String

    Set dbAC = CurrentDb()
    Set rsList = dbAC.OpenRecordset("SELECT * FROM [XFER_LIST_ONLY_LATEST_MFR]")
    Set rsMonth = dbAC.OpenRecordset("SELECT * FROM [FP_MO_CAL_MO]")
    'Set rsXfer = dbAC.OpenRecordset("SELECT * FROM [XFER_WS]")

    If rsList.EOF = True Then Exit Sub  'Checks that there are worksheets to process

'--- Delete existing records from MFR consolidation table
    'DoCmd.SetWarnings False
    'DoCmd.RunSQL "DELETE * FROM [XFER_WS];"
    'DoCmd.SetWarnings True

'--- Import worksheets into consolidation table
    rsList.MoveFirst
    strMFRSheetNo = Right(CStr(rsList.Fields("MFR_LAST_FP")), 2)
    Do Until rsList.EOF

        rsMonth.FindFirst "FISCAL_MO = " & strMFRSheetNo
        strRange = rsMonth.Fields("WS_NAME") & "!A2:AD" & Format(rsList.Fields("NO_ROWS") + 1, "0")
        strFilePath = rsList.Fields("FILE_PATH")
        DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, "XFER_WS", strFilePath, False, strRange
        strDestPath = "I:\Dept\DCS\MPOOL\Fleet Management Data\MFR\MFR FY " & Mid(CStr(rsList.Fields("MFR_LAST_FP")), 3, 2) & _
            "\" & Mid(strFilePath, 81, Len(strFilePath))
        Debug.Print strDestPath
        'FileCopy strFilePath, strDestPath
        'Kill strFilePath
        rsList.MoveNext

    Loop

    Set dbAC = Nothing
    Set rsList = Nothing
    Set rsXfer = Nothing
    Set rsMonth = Nothing
    DeleteImportErrorTables

End Sub

【问题讨论】:

  • 不知道这是否与您的问题有关,但Dim rsList, rsMonth, rsXfer As Recordset 只有rsXferRecordset;其他一切都是Variant。你想要的是Dim rsList as Recordset, rsMonth as Recordset, ...
  • @xidgel:这表明你可以教老狗新把戏。唉,这并没有影响问题,但是错误地声明变量是没有意义的。谢谢。

标签: excel vba ms-access import


【解决方案1】:

经过大量研究和测试解决此问题的多种策略后,我只是回到了我的原始代码,不知何故它自发地开始正常工作。然而第二天,它又恢复了原来的异常行为!

通过将工作表另存为逗号分隔值 (.csv) 文件并改用 DoCmd.TransferText,无法找到解决问题的方法。该策略规避了 Access 的数据类型猜测,并快速将数据导入表中。 (顺便说一句,DoCmd.TransferText 不喜欢包含多个句点的文件名。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多