我一直在使用一些vba代码将多个工作表从各种文件复制到不同的工作簿中。虽然代码运行良好,但确实有一些限制。尤其是当基础文件包含隐藏的工作表时。
基本上,当“基本”文件包含隐藏工作表时,可以说提取工作表2是隐藏的。下面的代码将在Sheets(“ sheet2”)行处拉出一个错误。在尝试复制工作表2时选择。
根据我的理解,这是因为它最初会识别Instr代码中存在一个工作表,即使该工作表是隐藏的。然后向下几行,它试图选择该工作表,但由于被隐藏而无法执行。
任何帮助将不胜感激,我只想在活动而不是隐藏的表上运行Instr代码,并忽略所有隐藏的表。示例代码如下
Dim book1 as workbook
Dim book2 as workbook
Dim ws as worksheet
book1.Activate
For Each ws In ActiveWorkbook.Worksheets
If InStr(1, ws.Name, "sheet2") Then
book2.Activate
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "X2"
book1.Activate
Sheets("sheet2").Select
Set ws = ActiveSheet
If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then
ActiveSheet.AutoFilterMode = False
End If
Cells.Select
Application.CutCopyMode = False
Selection.Copy
book2.Activate
Sheets("x").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Selection.Columns.AutoFit
End If
Exit For
Next`
答案 0 :(得分:2)
下面的一般示例,说明如何仅在可见工作表上执行代码。您将需要在所有对象之前加上ws
标识符,以便清楚地知道代码应引用哪个工作表。例如:ws.Range("A1").Copy
Dim ws as Worksheet
For Each ws in Worksheets
If ws.Visible Then
'Do what with visible sheets?
End If
Next ws
此外,您还应该从代码中写出.Select
的每个实例(包括要调用的另一个子对象)。对于机构,这部分代码
Sheets("x").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
可以简化为这一点(注意,您可以跳过.Select
并直接到达该点。
Sheets("x").Range("A1").PasteSpecial Paste:=xlPasteValues
Sheets("x").Range("A1").PasteSpecial Paste:=xlPasteFormats