如果工作表包含下拉列表,则在访问中导入 Excel 数据时出现问题

Posted

技术标签:

【中文标题】如果工作表包含下拉列表,则在访问中导入 Excel 数据时出现问题【英文标题】:Issue in importing excel data in access if worksheet contains dropdown list 【发布时间】:2012-09-03 20:27:43 【问题描述】:

我创建了一个 Excel 工作表,用户可以插入一些行(最多 100 行)。

某些字段的值是从下拉列表中选择的。

我将公式放在所有 100 行中。

问题在于,如果用户插入的行数少于 100,则数据不会在 access 中导入。在这种情况下,只有当我从剩余行中删除下拉列表的公式时,才会导入数据。

要在我使用的 access 中导入 excel 数据:

DoCmd.TransferSpreadsheet [Transfer Type], [Spreadsheet Type], [Table Name], [File Name], [Has Field Names], [Range]

我该如何解决这个问题?

编辑

在 Remou 的回答之后,我尝试了:

Private Sub import_Click()

Dim openDialog As FileDialog
Dim FileChosen As Integer

Set openDialog = Application.FileDialog(msoFileDialogFilePicker)
On Error GoTo DoNothing
With openDialog
  .title = "Import"
  .AllowMultiSelect = False
  .Show
End With

filename = openDialog.SelectedItems.Item(1)

Dim xl As Excel.Application
Dim wb As Excel.Workbook
Dim rng As Excel.Range

Set xl = CreateObject("Excel.Application")
xl.Visible = True
Set wb = xl.Workbooks.Open(nomeFile)

c = wb.Worksheets("Sheet1").Range("1:1").end(-4161).Address
r = wb.Worksheets("Sheet1").Range("A:A").end(-4121).Row

ImportRange = "Sheet1!" & "A1:" _
   & Replace(Mid(c, 1, InStrRev(c, "$")) & r, "$", "")

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, _
"ImportTable", filename, True, ImportRange

DoNothing:
    If Err.Number = cdlCANCEL Then
    End If

End Sub

但我在 Dim xl As Excel.Application

上有一个调试错误

【问题讨论】:

我没有发现在我测试的示例中是这种情况。导入的所有行,尽管其中一些是空白的。你使用了 ActiveX 还是表单下拉菜单?你用的公式是什么。 @Remou:我用的是数据校验,列表类型。因此,例如,用户可以在单元格中插入值“valueA”或“valueB”(下拉列表)。此数据验证用于同一列中的所有 100 个单元格。如果用户插入的行数少于 100 行,则 vba 导入(当用户单击掩码按钮、在访问中以及在选择要导入的 excel 文件后调用)不起作用。 【参考方案1】:

注意在使用 Excel 下拉列表和验证下拉列表进行测试后,我发现在未使用范围内使用经过验证的单元格或下拉列表导入数据时没有任何问题,除了导入这些行之外,即使所有其他单元格都是空的。问题可能出在数据类型和导入到现有表中。您可能需要先导入临时表,然后再追加。

我建议您使用自动化来获取使用的范围并将其添加为要导入的范围。

此示例代码使用后期绑定。您可以添加对 Microsoft Excel x.x 对象库的引用,因此我保留了各种定义,但如果您在多台 PC 上使用代码,则后期绑定是最好的。

Dim xl As Object ''Excel.Application
Dim wb As Object ''Excel.Workbook
Dim rng As Object ''Excel.Range

Set xl = CreateObject("Excel.Application")
xl.Visible = True
Set wb = xl.Workbooks.Open("z:\docs\test.xlsx")

'Choosing a column that is fully filled on sheet5
'xldown=-4121,xltoright=-4161
c = wb.Worksheets("Sheet5").Range("1:1").end(-4161).Address
r = wb.Worksheets("Sheet5").Range("A:A").end(-4121).Row

ImportRange = "Sheet5!" & "A1:" _
    & Replace(Mid(c, 1, InStrRev(c, "$")) & r, "$", "")

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _
    "ImportSheet2", "Z:\Docs\csharp.xlsm", True, ImportRange

【讨论】:

用户选择要导入的excel文件后如何获取使用范围? 我在 Dim xl As Excel.Application 上收到一个错误(我用我使用的代码编辑了我的问题)。 抱歉,我忘记删除定义了。通常的规则是早期绑定开发,后期绑定分发。 别担心 :) 谢谢。现在它起作用了。有没有办法在不打开 excel 文件的情况下做同样的事情? 尝试使用带有新表名称的传输电子表格,查看数据是否传输,如果传输,可能可以导入到新表,然后附加到现有表。如果它不起作用,您也可以尝试 ADO 或查询。你甚至可以混搭。使用 ado 或查询获取已使用行的计数,并使用它来创建范围。顺便说一句,您只需要可见的 Excel 文件即可进行开发和故障排除。

以上是关于如果工作表包含下拉列表,则在访问中导入 Excel 数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

访问数据项目在VBA中导入CSV文件

Excel中设置下拉列表的来源怎么选择其他工作表的内容

Microsoft Access 中有没有一种方法可以从具有复合主键的 Excel 文件中导入?

怎么往plsql表中导入excel数据

C# winform 中如何导入Excel

基于下拉值的Excel查找?