将数据从一个(已closures)工作簿复制到另一个(已打开)工作簿

我已经成功地创build了一个macros,将一个(已closures)工作簿中的多个列的内容复制到另一个已经打开的工作簿。

问题是下面的代码在最后一行总是显示N / A为每列…你知道我的代码中的错误是什么? 我宁愿修复它,而不是添加删除N / A的另一行代码。

这里的代码(我也注意到,使用ActiveWorkbook或ThisWorkbook显着减慢了macros…closures自动计算,使其更快,但请让我知道,如果你有任何进一步的build议,以简化代码)。

Sub DataFromClosedFile() On Error GoTo ErrHandler Application.ScreenUpdating = False Application.Calculation = xlCalculationManual 

x是closures的源工作簿y是我将粘贴数据的当前活动工作簿

 Dim x As Workbook Dim y As Workbook Dim CA_TotalRows As Integer Dim CA_Count As Integer 

我认为下一行代码与“ThisWorkbook”显着减缓了一切 – 不知道为什么,但哦…

 Set y = ThisWorkbook 'Could also have used ActiveWorkbook Set x = Workbooks.Open("PATH", True, True) 

接下来,计算需要复制的行数(我不想复制标题,因此我从第2行开始:

 CA_TotalRows = x.Worksheets("August_2015_CA").Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Rows.Count + 1 

另外,我只想复制源数据手册中的A:B和E:H列。 因此重复的公式。 再次,如何最大限度地提高代码的效率的任何build议,赞赏!

 For CA_Count = 1 To CA_TotalRows y.Worksheets("Sheet3").Range("A1:B" & CA_Count).Formula = x.Worksheets("August_2015_CA").Range("A2:B" & CA_Count).Formula Next CA_Count For CA_Count = 1 To CA_TotalRows y.Worksheets("Sheet3").Range("C1:F" & CA_Count).Formula = x.Worksheets("August_2015_CA").Range("E2:H" & CA_Count).Formula Next CA_Count 

所以在最后一个代码被执行之后的某个时间点,最后一行被复制为一堆N / As …表示每一列。 如何避免?

 x.Close False Set x = Nothing Application.Calculation = xlCalculationAutomatic ErrHandler: Application.EnableEvents = True Application.ScreenUpdating = True End Sub 

以下声明应该很long

 Dim CA_TotalRows As Long Dim CA_Count As Long 

您不能依赖开放到August_2015_CA工作表的工作簿,但是您依靠不指定Cells的父项来作为ActiveSheet。

 with x.Worksheets("August_2015_CA") CA_TotalRows = .Range("A2:A" & .Cells(Rows.Count, "A").End(xlUp).Row).Rows.Count + 1 end with 

注意.Cells而不是Cells 。 预表. 强制父母成为With … End With语句中logging的工作表。 如果August_2015_CA不是打开的活动工作表,那么你得到错误的行数。

错误是您开始从工作表“August_2015_CA”中的行2中提取数据,并将其从“Sheet1”中的第1行中粘贴。 因此,最后一个循环是指“August_2015_CA”中的空单元格。 而且,你一次又一次地粘贴相同的数据,这会减慢代码的速度。

解:

1)查找最后一行可能会更容易一些:

 CA_TotalRows = x.Worksheets("August_2015_CA").UsedRange.Rows.Count 

假设您在Row1中有数据

2)为什么不尝试将所有数据粘贴到一个 – 这将比循环快得多:

 y.Worksheets("Sheet3").Range("A1:B" & CA_TotalRows - 1).Formula = _ x.Worksheets("August_2015_CA").Range("A2:B" & CA_TotalRows).Formula y.Worksheets("Sheet3").Range("C1:F" & CA_TotalRows - 1).Formula = _ x.Worksheets("August_2015_CA").Range("E2:H" & CA_TotalRows).Formula