使用循环将一个工作簿复制到另一个工作簿

时间:2020-07-10 06:21:47

标签: excel vba

我已经开发了以下代码,但是它向我显示了运行时错误9和13的错误。当涉及到宏应将数据从一个工作簿复制到另一个工作簿时,该错误就会出现。我知道我错误地分配了变量,但不知道如何更改它。

Workbooks(wbk).Worksheets(FieldBVal).Range("A1:V1000").Copy Workbooks(recon).Worksheets(FieldAVal).Range("B2")

不久之后该宏应该做什么。它应该只是将工作表从一个工作簿复制到另一个工作簿。每张工作表都引用一个公司,因此它必须转到另一个工作簿,再到与该公司同名的工作表。因此,我决定将工作表的名称放在excel宏所在的位置。可能会发生添加,删除了公司的情况,因此用户可以轻松更改工作表的名称或添加新的工作表(而无需了解宏结构),但不幸的是,这并不起作用。有人可以帮我吗?

代码:

Sub Copy data()

Workbooks.Open Range("A10").Value

For Each wb In Application.Workbooks
    If wb.Name Like "*Reconciliation*" Then
        wb.Activate
        Exit For
    End If
Next wb

Set wbk = Workbooks(Range("A9").Value)
Set recon = Workbooks(Range("A11").Value)


    Sheets("Macro").Select
    Range("B6").Select
  
    Dim i As Integer
    Dim FieldAVal As String
    Dim FieldBVal As String

    Dim Iter As Integer
    Iter = Cells(1, 3).Value

  
                   
             For i = 1 To Iter
                FieldAVal = Cells(i + 5, 2).Value
                FieldBVal = Cells(i + 5, 3).Value
                 'SAP code to be executed for each row
              
Workbooks(wbk).Worksheets(FieldBVal).Range("A1:V1000").Copy Workbooks(recon).Worksheets(FieldAVal).Range("B2") here shows error
              

                Next i
End Sub

2 个答案:

答案 0 :(得分:0)

在开始编写代码之前,请先设置逻辑。首先在空白代码模块的顶部编写Option Explicit

  1. 看来,您有一本名为 like 的工作簿“对帐”。您似乎想将此工作簿称为Wb。因此,您的第一行代码应该是

    将Wim作为工作簿调和工作簿

  2. 似乎该工作簿中的某个位置有单元格A9和A11。哪里?在工作表上。哪个工作表?这将导致您进入第二行代码。

    Dim Ws As Worksheet”从中收集公司信息的工作表

  3. 以这种方式继续操作,直到通过项目的性质(工作簿,工作表,字符串,数字),项目在项目中的功能(数据提供者,数据接收者,帮助者)确定了项目的每个部分,并且给它起个名字。

设置wbk =工作簿(范围(“ A9”)。值) 设置recon = Workbooks(Range(“ A11”)。Value)

创建两个工作簿对象。您尚未声明它们,也未在项目中说明它们的功能。但是很明显,如果范围A9和A11不包含 open 工作簿的名称,您的代码将失败。它们必须处于打开状态,因为即使单元格包含具有各自路径的完整文件名,您的代码也无法打开它们。

观察到A9和A11都在ActiveSheet上。之所以这样,是因为您没有特别指定任何工作表。 ActiveSheet将是对象Wb中名称为 like “对帐”的任何工作表,当时恰好处于活动状态-这是一个非常模糊的描述。可以找到正确工作表的可能性很小。

所有这些混乱是由于开始编写代码之前缺乏计划。返回并重新开始。想比现在少得多的步骤。但是,不必必须考虑的一个步骤是选择激活。答案是一致的“无”。 Wb.Worksheets("MySheet 1").Cells(9, "A")是一个非常明确的地址。 VBA可以找到它。它可以ValueRowHeight获得它的Formula,它的Select和它的Activate,并对其进行任何更改,甚至更多。激活和选择是用户需要执行的操作。 VBA或Excel不会。

而且,在我忘记之前,VBA地址按名称范围和按其坐标的单元格范围。 Range("A9")是一种解决方案,可以为单个单元格的范围使用综合名称。这样的杂技绝不会有好的结果。由于您已经掌握了寻址单元格的语法,因此请坚持使用该语法。使用名称来寻址多个单元格的范围,但要记住,诸如“ A1:C7”之类的名称是根据单元格坐标人工构建的。这是一个很棒的系统,但是,可惜的是,该特定梯子上的最低横档。您可以使用自己创建和管理的真实姓名做更多的事情。

答案 1 :(得分:0)

感谢您的反馈,但是在零件复制和粘贴方面仍然存在错误。我命名了工作表和工作簿,但下面的这种组合不起作用。

Workbooks(wbk1).Worksheets(ws1).Range("A1:V1000").Copy Workbooks(wbk2).Worksheets(ws2).Range("B2")

Sub CopyData()

  Dim i As Integer
    Dim FieldAVal As String
    Dim FieldBVal As String
    Dim FieldCVal As String
    Dim FieldDVal As String
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim Iter As Integer
    Dim recon As Workbook
    Dim FilePath As String
   
    
   

FilePath = ThisWorkbook.Worksheets("Macro").Cells(11, 1)


Set recon = Workbooks(FilePath)



Workbooks.Open Range("A10").Value
 recon.Activate
    
  
    Iter = Cells(1, 3).Value
   
    
                    
             For i = 1 To Iter
                FieldAVal = Cells(i + 14, 2).Value
                FieldBVal = Cells(i + 15, 3).Value
                FieldCVal = Cells(i + 16, 4).Value
                FieldDVal = Cells(i + 17, 5).Value
                
 Set wbk1 = Workbooks(FieldDVal)
   Set wbk2 = Workbooks(FieldCVal)
    Set ws1 = wbk1.Sheets(FieldBVal)
  Set ws2 = wbk2.Sheets(FieldAVal)

                
Workbooks(wbk1).Worksheets(ws1).Range("A1:V1000").Copy Workbooks(wbk2).Worksheets(ws2).Range("B2")
                

                Next i
End Sub