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)
小智 15
我相信我终于把这个问题钉在了一起 - 这也让我疯了!如果MS制作Copy会返回一个工作表对象,就像添加方法一样,这真的很不错......
事实上,VBA分配新复制的工作表的索引实际上没有确定......正如其他人所指出的那样,它在很大程度上取决于隐藏的工作表.事实上,我认为表达式Sheets(n)实际上被解释为"第n个可见表".因此,除非你编写一个循环测试每个工作表的可见属性,否则在代码中使用它会充满危险,除非工作簿受到保护,因此用户不能弄乱工作表可见属性.太难...
我对这种困境的解决方案是:
这是我的代码 - 现在似乎是防弹......
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,正如您所料.
希望有所帮助;-)
Jou*_*arc 12
我使用的另一个解决方案是将工作表复制到您知道其索引的位置,即第一个.在那里,您可以轻松地根据需要随意引用它,之后您可以将其自由移动到您想要的位置.
像这样的东西:
Worksheets("Sheet1").Copy before:=Worksheets(1)
set newSheet = Worksheets(1)
newSheet.move After:=someSheet
Run Code Online (Sandbox Code Playgroud)
更新:
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)