【问题标题】:Copying data from one (closed) workbook into another (already open) workbook将数据从一个(关闭的)工作簿复制到另一个(已经打开的)工作簿
【发布时间】:2015-09-05 07:51:21
【问题描述】:

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

问题是下面的代码导致最后一行总是显示每列的 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

【问题讨论】:

    标签: excel vba worksheet


    【解决方案1】:

    以下声明应为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 statement 中注明的工作表。如果 August_2015_CA 不是打开时的活动工作表,那么您得到的行数有误。

    【讨论】:

      【解决方案2】:

      错误是您开始从工作表“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
      

      【讨论】:

      • 这真是太有见地了!谢谢你教会了我这一切!现在的代码更简单,并且可以完美运行。
      • 没问题。我很高兴能够提供帮助。
      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多