使用相交在工作表之间复制数据

时间:2018-07-28 20:15:09

标签: excel vba

我正在编写一个Excel宏(Excel 2016)以在工作表之间复制数据。而不是使用典型的Range命令(例如,Sheet2.Range(“ A1:A15”)。Value = Sheet1.Range(“ A1:A15”)。Value)我想对列使用命名范围,以防万一以后再在任一工作表中插入列。我也想使用相交,以防将来将来添加/删除行。当我在SAME工作表中复制数据时,我已经能够使它工作,但是当我尝试从一个工作表到另一个工作表时,它给我一个“ 400错误”。我不确定自己在做什么错。

首先,以下是在同一工作表中复制数据时可以使用的代码行。

Intersect([P1B_CalcPercent1], Rows(FirstRow & ":" & LastRow)).Value = Intersect([P1B_CalcPercent2], Rows(FirstRow & ":" & LastRow)).Value

这是我的专案,旨在将一系列单元格从一张纸复制到另一张纸。以Intersect开头的行给了我400错误。

Sub Copy_from_1A_Button()

Dim FirstRow As Integer, LastRow As Integer

Application.ScreenUpdating = False

ThisWorkbook.Sheets("Page 1B").Activate

Module7.UnprotectPage1BSheet

FirstRow = Range("B_first_row").Value
LastRow = Range("B_last_row").Value

If MsgBox("Are you sure you wish to do this? Data in the target cells will be overwritten.", vbYesNo) = vbYes Then

    Intersect([P1B_JobTitles], Rows(FirstRow & ":" & LastRow)).Value = Intersect([P1A_JobTitles], Rows(FirstRow & ":" & LastRow)).Value

End If

Module7.ProtectPage1BSheet
Application.ScreenUpdating = True

End Sub

“ P1A_JobTitles”和“ P1B_JobTitles”都是具有工作簿范围的命名范围,但是它们存在于不同的工作表中。 (旁边的问题:每个对象的作用范围是否仅仅是它所在的表?)

我尝试放入“应用程序”。在两个地方都在相交的前面,但是我遇到了相同的错误。

有什么想法为什么Intersect方法不能从一张纸复制到另一张纸?

2 个答案:

答案 0 :(得分:0)

您收到此错误,因为ROWS返回了一个Range对象,该对象代表指定工作表上的所有行。由于您未指定工作表,因此仅使用活动工作表。您需要使用要在其上使用的工作表的名称来限定它。要动态地执行此操作,您可以使用以下内容:

Intersect(Range("SomeName"), Worksheets(Parent.Range("SomeName")).Rows("1:2")).Address

答案 1 :(得分:0)

尝试

dim i as long, j as long, pa as string, pb as string, P1A_P1B as variant
dim p1a as worksheet, p1b as worksheet

P1A_P1B = array("P1__JobTitles", "P1__CalcPercent")
set p1a = ThisWorkbook.workSheets("Page 1A")
set p1b = ThisWorkbook.workSheets("Page 1B")
...

for i=lbound(P1A_P1B) to ubound(P1A_P1B)
    pa = replace(P1A_P1B(i), "__", "A_")
    pb = replace(P1A_P1B(i), "__", "B_")
    with Intersect(p1a.Range(pa), p1a.Range(FirstRow & ":" & LastRow))
        Intersect(p1b.Range(pb), p1b.Range(FirstRow & ":" & LastRow)).resize(.rows.count, .columns.count) = .Value
    end with
next i
...