来自Excel 2003的VBA代码在Excel 2010/2013中无法正常工作

我真的是新来的VBA,但我已经设法编写一些基于主要来自这个网站的例子的代码。
这段代码应该将数据从多个csv文件复制到一个xls文件(然后重命名源csv文件)。
虽然它在Excel 2003中正常工作,但在Excel 2010/2013中无法正常工作(我无法在E2007中对其进行testing)。
它从第一个csv文件复制到xls文件后,似乎停止,所以在这一行之后:

Range("B4:AZ" & LR).Copy wbDEST.Sheets("Data").Range("B" & NR) 

错误1004“应用程序定义或对象定义的错误”。 debugging器突出显示下一行,即

 NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 

我只是看不出有什么问题,因为在代码的开头使用了相同的行,并没有停在那里。

我会很感激你的build议。

这里是整个代码:

 Option Explicit Sub ImportData() Dim fPATH As String, fNAMEcsv As String, fNAMEbak As String Dim LR As Long, NR As Long Dim wbSOURCE As Workbook, wbDEST As Workbook Set wbDEST = Workbooks.Open("C:\Utility\Data.xls") NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 fPATH = "C:\Utility\DataFiles\" 'remember the final \ in this string fNAMEcsv = Dir(fPATH & "*.csv") 'get the first filename in fpath Do While Len(fNAMEcsv) > 0 Set wbSOURCE = Workbooks.Open(fPATH & fNAMEcsv, Local:=True) 'open the file LR = Range("B" & Rows.Count).End(xlUp).Row 'how many rows of info? If LR > 1 Then Range("B4:AZ" & LR).Copy wbDEST.Sheets("Data").Range("B" & NR) NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 End If wbSOURCE.Close False 'close data workbook fNAMEbak = fNAMEcsv & ".bak" 'rename imported file to .bak Name (fPATH & fNAMEcsv) As (fPATH & fNAMEbak) fNAMEcsv = Dir 'get the next filename Loop MsgBox ("Completed. Check results on PRINTOUT sheet.") End Sub 

尝试排位你的Rows

 NR = wbDEST.Sheets("Data").Range("B" & wbDEST.Sheets("Data").Rows.Count).End(xlUp).Row + 1 

问题可能是这样的:

在这里你打开一个新的“源”工作簿wbSOURCE

 Set wbSOURCE = Workbooks.Open(fPATH & fNAMEcsv, Local:=True) 'open the file 

也许这是“新”格式的工作簿(Excel 2007及更高版本,* .xlsx&Co.)。 既然你刚刚打开它,它是活动的工作簿,因此不合格的Rows.Count将返回1048576。

也许你的目标工作簿wbDEST是“旧”的Excel 2003格式(* .xls&Co.)。 所以当你这样说的时候:

 NR = wbDEST.Sheets("Data").Range("B" & Rows.Count).End(xlUp).Row + 1 

您试图访问wbDEST.Sheets("Data").Range("B" & 1048576)但此格式的工作簿中不存在单元格B1048576 。 这实际上会引发错误1004“应用程序定义或对象定义的错误”。

那么解决scheme将完全符合这样的Rows.Count

 NR = wbDEST.Sheets("Data").Range("B" & wbDEST.Sheets("Data").Rows.Count).End(xlUp).Row + 1 

完全限定所有事情并不要依靠Excel的变幻莫测是一个好主意。