Копирование листов с Instr, игнорируя скрытые листы - PullRequest
0 голосов
/ 03 декабря 2018

Я работал с некоторым кодом 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 голосов
/ 03 декабря 2018

Ниже приведен общий пример того, как выполнять код только на видимых листах .Вам нужно будет поставить перед всеми объектами префикс 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
...