Vba 复制工作表而不丢失引用

Vba 复制工作表而不丢失引用,vba,excel,excel-formula,Vba,Excel,Excel Formula,我目前的问题是,如果我复制工作簿中的工作表,那么复制的表就会失去引用 这是我用来复制工作表的代码: Dim wb As Workbook: Set wb = ThisWorkbook Dim ws As Worksheet: Set ws = wb.Sheets("Template") Dim wa As Worksheet: Set wa = wb.Sheets("NeedToKnow") Dim newws As Worksheet, sh As Worksheet, newname 'so

我目前的问题是,如果我复制工作簿中的工作表,那么复制的表就会失去引用

这是我用来复制工作表的代码:

Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = wb.Sheets("Template")
Dim wa As Worksheet: Set wa = wb.Sheets("NeedToKnow")
Dim newws As Worksheet, sh As Worksheet, newname
'some other code to create the name
ws.Copy after:=wa: Set newws = ActiveSheet: newws.Name = newname
上面的代码复制工作表“模板”,并将其重命名为相应的“新名称”

该模板有一个包含多个列的表。此列有一个数组公式:

=IF(ISERROR(INDEX(Table1[[Costobject]:[Total]];SMALL(IF($B$3=Table1[Costobject];ROW(Table1[Costobject])-MIN(ROW(Table1[ProjectName])-1));ROW('Planning'!BI9)-8);COLUMN('Planning'!BI9)));0;INDEX(Table1[[Costobject]:[Total]];SMALL(IF($B$3=Table1[Costobject];ROW(Table1[Costobject])-MIN(ROW(Table1[ProjectName])-1));ROW('Planning'!BI9)-8);COLUMN('Planning'!BI9)))
因此,在vba运行并复制工作表后,上面的公式如下所示:

=IF(ISERROR(INDEX(Table1[[Costobject]:[Total]];SMALL(IF($B$3=Table1[Costobject];ROW(Table1[Costobject])-MIN(ROW(Table1[ProjectName])-1));ROW('Planning'!#REF!)-8);COLUMN('Planning'!#REF!)));0;INDEX(Table1[[Costobject]:[Total]];SMALL(IF($B$3=Table1[Costobject];ROW(Table1[Costobject])-MIN(ROW(Table1[ProjectName])-1));ROW('Planning'!#REF!)-8);COLUMN('Resto Planning'!#REF!)))
有没有办法防止这种情况发生?或者是否有一个自动化的解决方法

目前,当我点击forumla CTRL-SHIFT-ENTER来计算数组,然后使用自动更正选项时,我会手动修复工作表。

使用
行(11:11);列(B:B)
。使用或 函数只是将序号返回到公式中<代码>行(A19)-8,
行(19:19)-8
行('Planning'!BI9)-8
行(11:11)
都是一样的东西;它们只会导致11

=IFERROR(INDEX(Table1[[Costobject]:[Total]]; 
     SMALL(IF($B$3=Table1[Costobject]; ROW(Table1[Costobject])-MIN(ROW(Table1[ProjectName])-1)); ROW(11:11)); COLUMN(B:B))); 0)

如果你使用的是.xlsx而不是.xls,那么有效地将你的公式一分为二。

@Jeeped很棒的输入。这大大简化了我的公式。我现在按照建议将其更改为:

=IFERROR(INDEX(Table1[[Costobject]:[Total]];SMALL(IF($B$3=Table1[Costobject];ROW(Table1[Costobject])-MIN(ROW(Table1[ProjectName])-1));ROW('Planning'!1:1));COLUMN('Planning'!BI:BI));0)
实际上,它不是
B19
而是
BI
,但你的建议帮我找到了正确的方向

因此,现在我仍然存在一个问题,即当我复制选项卡时,引用被破坏,请参见下图:


问题是如何修复此复制错误

对于模板页的复制问题,我找到了解决方案

当我在表格中使用公式时,我将表格转换为一个范围

我采取了以下步骤:

  • 在桌子上做记号
  • 转到表格工具->设计
  • 转换为范围
  • 之后,我用公式标记了第一行,并填充到 最后一行(我需要多少)
  • 从那以后,我就没有任何关于断章取义的问题了