访问VBA期间更改数字值DoCmd.TransferSpreadsheet

时间:2018-04-17 20:55:35

标签: excel import access-vba access

我正在开发一个模块来自动将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,但许多记录都是空白的。见下图:

The following image shows the Excel file (top) against the resulting Access table (bottom).  The example record/row is highlighted.

我试着无济于事:

  • 在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

1 个答案:

答案 0 :(得分:0)

经过大量研究和测试多种策略来解决这个问题,我只是回到我的原始代码,并以某种方式自发地开始正常工作。然而,第二天又恢复了原来的异常行为!

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