Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果工作表包含下拉列表,则在access中导入excel数据时出现问题_Excel_Vba_Ms Access_Ms Access 2007_Import From Excel - Fatal编程技术网

如果工作表包含下拉列表,则在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

我创建了一个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

但是我在作为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文件就可以进行开发和故障排除,。