如果工作表包含下拉列表,则在access中导入excel数据时出现问题
我创建了一个excel工作表,用户可以插入一些行(最多100行) 某些字段的值从下拉列表中选择 我把公式放在所有100行上 问题是,如果用户插入的行少于100行,则数据不会在access中导入。在这种情况下,仅当我从其余行中删除下拉列表的公式时,才会导入数据 要在access中导入excel数据,我使用:如果工作表包含下拉列表,则在access中导入excel数据时出现问题,excel,vba,ms-access,ms-access-2007,import-from-excel,Excel,Vba,Ms Access,Ms Access 2007,Import From Excel,我创建了一个excel工作表,用户可以插入一些行(最多100行) 某些字段的值从下拉列表中选择 我把公式放在所有100行上 问题是,如果用户插入的行少于100行,则数据不会在access中导入。在这种情况下,仅当我从其余行中删除下拉列表的公式时,才会导入数据 要在access中导入excel数据,我使用: DoCmd.TransferSpreadsheet [Transfer Type], [Spreadsheet Type], [Table Name], [File Name], [Has F
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
但是我在作为Excel的Dim xl上有一个调试错误。应用程序注意:在使用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
在我测试的示例中,我没有发现这种情况。导入的所有行,尽管其中一些为空。您是否使用ActiveX或窗体下拉列表?您使用的公式是什么。@Remou:我使用数据验证,列表类型。因此,例如,用户可以在单元格中插入值“valueA”或“valueB”(下拉列表)。此数据验证用于同一列中的所有100个单元格。如果用户插入的行数少于100行,vba导入(当用户在access中单击遮罩按钮并选择要导入的excel文件后调用)将不起作用。在用户选择要导入的excel文件后,如何获取使用的范围?我在Dim xl上获得了一个错误作为excel.Application(我用我使用的代码编辑了我的问题)。抱歉,我忘了删除定义。通常的规则是使用早期绑定开发,使用后期绑定分发。不要担心:)谢谢。现在它起作用了。有没有办法在不打开excel文件的情况下执行相同的操作?尝试使用带有新表名称的transferspreadsheet,查看数据是否传输,如果传输,则可以导入到新表,然后附加到现有表中。如果不起作用,您也可以尝试ADO或查询。你甚至可以混搭。使用ado或查询获取已使用行的计数,并使用该计数创建范围。另外,您只需要Excel文件就可以进行开发和故障排除,。