复制表格并获得结果表格对象?

Rab*_*ski 28 excel vba copy-paste worksheet excel-vba

有没有简单/简短的方法来获取复制工作表时获得的新工作表的Excel.worksheet对象?

ActiveWorkbook.Sheets("Sheet1").Copy after:=someSheet
Run Code Online (Sandbox Code Playgroud)

事实证明,.Copy方法返回布尔值而不是工作表对象.否则,我本可以做到:

set newSheet = ActiveWorkbook.Sheets("Sheet1").Copy after:=someSheet    <-- doesn't work
Run Code Online (Sandbox Code Playgroud)

所以,我写了大约25行代码来获取对象(在复制之前列出所有工作表,列出所有工作表之后,并确定哪一个只在最后一个列表中.所有在VBA中非常冗长),但我正在寻找更优雅,更短的解决方案.

Tim*_*ams 26

Dim sht 

With ActiveWorkbook
   .Sheets("Sheet1").Copy After:= .Sheets("Sheet2")
   Set sht = .Sheets(.Sheets("Sheet2").Index + 1)
End With
Run Code Online (Sandbox Code Playgroud)

  • AFAIK,这仅在源工作表可见且选项卡的可见顺序与工作表集合顺序(.Index)匹配时才有效,但情况并非总是如此.Before和After参数似乎引用*visible*顺序,并且Index属性仅设置为匹配它们(如果它们可见).至少这就是我的测试/调试今天在Excel中向我展示的内容.:( (13认同)
  • @TimWilliams如果您在索引1处复制工作表并选择在索引为1的工作表之后复制它然后隐藏它,那么它可以工作.但是,如果再次执行相同操作,则新工作表将插入隐藏工作表之后的索引3(!!)处.因此,如果要在复制后隐藏工作表,此方法只能工作一次. (3认同)

小智 15

我相信我终于把这个问题钉在了一起 - 这也让我疯了!如果MS制作Copy会返回一个工作表对象,就像添加方法一样,这真的很不错......

事实上,VBA分配新复制的工作表的索引实际上没有确定......正如其他人所指出的那样,它在很大程度上取决于隐藏的工作表.事实上,我认为表达式Sheets(n)实际上被解释为"第n个可见表".因此,除非你编写一个循环测试每个工作表的可见属性,否则在代码中使用它会充满危险,除非工作簿受到保护,因此用户不能弄乱工作表可见属性.太难...

我对这种困境的解决方案是:

  1. 使最后一张纸可见(即使是临时的)
  2. 复制该表后.它必须有索引Sheets.Count
  3. 如果需要,再次隐藏前一张表格 - 它现在将具有索引Sheets.Count-1
  4. 将新工作表移动到您真正想要的位置.

这是我的代码 - 现在似乎是防弹......

Dim sh as worksheet
Dim last_is_visible as boolean

With ActiveWorkbook
    last_is_visible = .Sheets(.Sheets.Count).Visible
    .Sheets(Sheets.Count).Visible = True
    .Sheets("Template").Copy After:=.Sheets(Sheets.Count)
    Set sh=.Sheets(Sheets.Count)
    if not last_is_visible then .Sheets(Sheets.Count-1).Visible = False 
    sh.Move After:=.Sheets("OtherSheet")
End With
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我有这样的事情(H表示隐藏的表格)

1 ... 2 ... 3(H)... 4(H)... 5(H)... 6 ... 7 ... 8(H)... 9(H)

.Copy After:=.Sheets(2)实际上在下一个VISIBLE工作表之前创建了一个新工作表 - 也就是说,它成为新的索引6.而不是索引3,正如您所料.

希望有所帮助;-)

  • 我相信这应该被标记为正确答案。 (2认同)
  • 如果不是粘贴“After:=.Sheets(Sheets.Count)”而是粘贴“Before:=.Sheets(1)”,则无需考虑工作表是否可见。然后 `Set Sh = .sheets(1)` 将始终有效,无论其他工作表是否隐藏;当然,只要您复制/粘贴的工作表可见。 (2认同)
  • @Ama我知道已经过去了快一年了,但是 - 为了未来读者的利益 - 我的测试[似乎证明并非如此](/sf/ask/538459211/ -sheet-object#comment105982030_37704412)。 (2认同)

Jou*_*arc 12

我使用的另一个解决方案是将工作表复制到您知道其索引的位置,即第一个.在那里,您可以轻松地根据需要随意引用它,之后您可以将其自由移动到您想要的位置.

像这样的东西:

Worksheets("Sheet1").Copy before:=Worksheets(1)
set newSheet = Worksheets(1)
newSheet.move After:=someSheet
Run Code Online (Sandbox Code Playgroud)

  • 如果第一个可见工作表 Sheet1 之前有一个隐藏工作表,这也不起作用:`Worksheets(1)` 将返回隐藏工作表,但 `.Copy Before:=Worksheets(1)` 会在 ** 之后混淆地插入新工作表** 隐藏的。所以 `newSheet` 将引用隐藏的工作表,而不是新创建的工作表...... (2认同)

Pau*_*ock 6

更新:

Dim ThisSheet As Worksheet
Dim NewSheet As Worksheet
Set ThisSheet = ActiveWorkbook.Sheets("Sheet1")
ThisSheet.Copy
Set NewSheet = Application.ActiveSheet
Run Code Online (Sandbox Code Playgroud)