使用Instr复制工作表,而忽略隐藏的工作表

时间:2018-12-03 16:33:39

标签: excel vba google-sheets hidden

我一直在使用一些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`

1 个答案:

答案 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