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

时间:2015-09-04 21:54:43

标签: excel vba worksheet

我设法半成功地创建了一个宏,它将一个(已关闭)工作簿中的几列的内容复制到另一个已打开的工作簿中。

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

这是代码(我也注意到使用ActiveWorkbook或ThisWorkbook大大减慢了宏...关闭自动计算以使其更快,但如果您有任何进一步的建议来简化代码,请告诉我)。

Sub DataFromClosedFile()

On Error GoTo ErrHandler

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

x是封闭的源工作簿 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列。因此重复的公式。同样,对于如何最大限度地提高代码效率的任何建议都表示赞赏!

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

2 个答案:

答案 0 :(得分:1)

以下声明应为long

Dim CA_TotalRows As Long
Dim CA_Count As Long

您不能依赖于打开August_2015_CA工作表的工作簿,但是您依赖于它是ActiveSheet而没有指定Cells的父级。

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 statement中记录的工作表。如果August_2015_CA不是打开的活动工作表,那么你的行数就会错误。

答案 1 :(得分:1)

错误是您开始从工作表中的第2行提取数据" August_2015_CA"并将其从第1行粘贴到" Sheet1"中。因此,最后一个循环是指" 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