我正在编写一个excel宏,它旨在循环工作表复制部分并将它们粘贴到具有相同工作表名称的不同工作簿中。每个实际的工作表名称代表本季度的星期五(13张),所以明天是2014年7月11日的071114。
我已将第1周 - 第13周的vba变量设置为这些选项卡名称。我希望下面的For循环可以循环到第1周到第13周,但它并没有按照我想要的方式工作,因为计算机正在搜索名为"第1周和第34天的选项卡。而不是变量week1。我想我只是要更改选项卡名称,但如果有办法,我想知道将来参考。
For x = 1 To 13
wbD.Activate
Worksheets("week" & x).Activate
Range(carange).Select
Selection.Copy
wbC.Activate
Worksheets("week" & x).Activate
Range(carange).Select
ActiveSheet.Paste
Next x
答案 0 :(得分:3)
我会使用数组。就像下面一样。还没有测试过,但是应该让你知道我在说什么。
Public Sub TestArray()
Dim wkSheetNames(13) As String
wkSheetNames(1) = "Some Name"
wkSheetNames(2) = "Some Name"
wkSheetNames(3) = "Some Name"
'.................
'.................
wkSheetNames(12) = "Some Name"
wkSheetNames(13) = "Some Name"
For x = 1 To 13
wbD.Activate
Worksheets(wkSheetNames(x)).Activate
Range(carange).Select
Selection.Copy
wbC.Activate
Worksheets(wkSheetNames(x)).Activate
Range(carange).Select
ActiveSheet.Paste
Next x
End Sub
谢谢, V
答案 1 :(得分:2)
@Vikas'解决方案,它使用数组将工作表名称存储为String
变量,这是一个很好的建议。由于您的Workbook
和Range
变量似乎也已定义,因此您可以通过避免.Activate
和.Select
方法进一步优化宏,这两种方法是运行时错误的两个常见来源,而是使用Range.Copy
方法:
'note: if carange is a named range defined in the worksheets, this code would
'need to be adjusted to ...Range("carange").Copy...
For x = 1 To 13
wbD.Worksheets(wkSheetNames(x)).Range(carange).Copy _
Destination:=wbC.Worksheets(wkSheetNames(x)).Range(carange)
Next x
以下是Range.Copy
方法的MSDN链接,其中包含更多示例:http://msdn.microsoft.com/en-us/library/office/ff837760(v=office.15).aspx
这是一篇内容丰富的帖子,其中包含有关如何避免使用.Select
和.Activate
的建议:How to avoid using Select in Excel VBA macros