使用自定义动态范围在Access中导入Excel

时间:2015-05-04 18:45:23

标签: excel vba access-vba

我在导入工作时遇到了一些麻烦:

Function importMetrics() 
Dim strFile As String 
Dim strPath As String 
Dim strWorksheet As String 
Dim strTable As String 

'Excel variables 
Dim xlApp As Excel.Application 
Dim xlFile As Excel.Workbook 
Dim xlSheet As Excel.Worksheet 
Dim xlRange1 As Excel.Range 
Dim xlRange2 As Excel.Range 

Dim r1, r2 As String 
Dim r#, c# 
Dim clVal As String

'Set File Path 
strPath = CurrentProject.Path & "\Data\2015\01 - January" 

'check if directory exists 
If Len(Dir(strPath, vbDirectory)) = 0 Then 
    MsgBox ("File Doesn't exist") 
    End 
End If 

'Import all Files 
strFile = Dir(strPath & "\*.xl*") 

'ID which Sheet to Import 
strWorksheet = "EP & NBO DATA" 

'ID Table to Import To 
strTable = "tbl_MIPData" 

'start loop 
Do While strFile <> "" 
    'Open File 
    'Get the info from Excel: 
    Set xlApp = New Excel.Application 

    Set xlFile = xlApp.Workbooks.Open(strPath & "\" & strFile, False, True) 

    Set xlSheet = xlFile.Sheets(strWorksheet) 

    Set xlRange1 = xlSheet.Range("A1" & xlSheet.Range("A1").End(xlDown).End(xlToRight)).Select 
    Set xlRange2 = xlSheet.Range("N1" & xlSheet.Range("N1").End(xlDown).End(xlToRight)).Select 

    'Import File Range A 

     DoCmd.TransferSpreadsheet _ 
        transfertype:=acImport, _ 
        tablename:=strTable, _ 
        FileName:=strPath & "\" & strFile, _ 
        hasFieldNames:=False, _ 
        Range:=xlRange1 

    'Import File Range B 
    DoCmd.TransferSpreadsheet _ 
        transfertype:=acImport, _ 
        tablename:=strTable, _ 
        FileName:=strPath & strFile, _ 
        hasFieldNames:=False, _ 
        Range:=strWorksheet & "!" & xlRange2 

        'Close Excel File 
        xlApp.Quit 
        Set xlApp = Nothing 
Loop 

End Function 

这是我到目前为止编写的代码。我认为这与我打开Excel文件的方式有关。范围在xlRange1xlRange2上失败。如果我放xlSheet.Select它似乎无法解决它。

我很难过。另外我找不到如何递归遍历子目录(例如,在数据中遍历所有Excel文件)

使用Excel 2010 XLSX文件访问2010。

2 个答案:

答案 0 :(得分:0)

  如上所述,您需要将范围设置为B2:F10,而不是解析Range对象。

因此,您可以使用范围的Address属性,例如:

Range:=xlRange1.Address

我无法测试它。

答案 1 :(得分:0)

您正在尝试在文件打开时导入数据,这会给您带来一些问题。 您要做的是打开excel文件,设置范围,保存工作簿,导入范围,然后返回并清除命名范围(如果您愿意)。

如果要导入存储在一个工作表中的两组独立数据,您可能希望将它们拆分为两个单独的工作表,以使您的生活更轻松。

目前,有点像;

unique_ids = set()
for tweet in search_results:
    if 'retweeted_status' not in tweet.keys():
         continue
    retweetIDs = [retweeted_status[id] for retweeted_status in tweet ['retweeted_status']]
    unique_ids.update(retweetIds)

使用变量捕获上次使用的行更容易 比如

Do While strFile <> "" 
'Open File 
'Get the info from Excel: 
Set xlApp = New Excel.Application 

Set xlFile = xlApp.Workbooks.Open(strPath & "\" & strFile, False, True) 

Set xlSheet = xlFile.Sheets(strWorksheet) 

循环

结束功能

我已经从内存中编写了代码更改但这应该会让你走上正轨,如果你仍然坚持下去,请告诉我,我可以挖掘出我为你编写的前一个例子! HTH