2017-01-13 4 views
0

Мне нужно пропустить 47 разных рабочих листов в одной книге.Цитирование через рабочие листы в одной книге при создании новых книг

Макрос, выполняемый на каждом рабочем листе, создает новую отдельную книгу для этого рабочего листа. Моя задача состоит в том, что после того, как рабочий лист из оригинальной книги преобразуется в новую книгу, мой макрос теперь начинает цикл через рабочий лист в новой книге вместо оригинала. Я пытался выяснить какой-то код, который учитывает каждый рабочий лист в оригинальной книге, а затем возвращается к оригиналу после создания новой книги.

Sub PriceListWest() 
' 
' PriceListWest Macro 
' 

Dim Current As Worksheet 

Windows("West price list master.xlsm").Activate 'Original workbook' 

For Each Current In Worksheets 

    ActiveSheet.Select 'Selecting worksheet in original workbook' 
    ActiveSheet.Copy 'Copying worksheet in original workbook' 

    'Challenge lies here now the loop goes through the new workbook versus returning to original workbook' 

    Cells.Select 
    Selection.Copy 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    Application.CutCopyMode = False 
    Selection.EntireColumn.Hidden = False 

Next 

End Sub 
+1

Где вы меняете книги? Получайте ссылки на свои объекты и используйте * те * вместо использования глобалов, активируйте и выберите. – Comintern

+0

Что вы пытаетесь сделать в оригинальной книге после того, как книга была скопирована? –

+1

Изменение 'ActiveSheet.Select'' ActiveSheet.Copy' будет 'Current.Copy' будет решать вашу проблему, но я добавил ответ, который немного изменил его. – YowE3K

ответ

1

Это плохая привычка использовать Select и Activate, если не следить за какой именно лист/ячейка активна, время от времени. Обратитесь к How to avoid using Select за советами о способах избежать этих команд.

Предполагая, что ваш существующий код успешно обработал первый рабочий лист, когда он начал обрабатывать второй рабочий лист, все еще был недавно созданной копией первого рабочего листа. Таким образом, этот лист затем будет скопирован в другую книгу, а не будет копировать один из рабочих листов из вашей оригинальной книги.

Следующий код использует ссылку на оригинальную книгу, и ссылка на Current объект, который уже создает код, чтобы убедиться, что правильные листы которые ссылаются:

Sub PriceListWest() 
' 
' PriceListWest Macro 
' 
    Dim wbMaster As Workbook 
    Dim Current As Worksheet 

    'Set a reference to the original workbook 
    Set wbMaster = Workbooks("West price list master.xlsm") 
    'Loop through each sheet in original workbook 
    For Each Current In wbMaster.Worksheets 
     'Copy the "current" sheet to a new workbook 
     Current.Copy 
     'The "Copy" command has now made the new workbook active, and 
     ' "ActiveSheet" is the newly created sheet in that workbook 

     With ActiveSheet 
      'Copy entire sheet 
      .Cells.Copy 
      'Paste values 
      .Cells.PasteSpecial Paste:=xlPasteValues, _ 
           Operation:=xlNone, _ 
           SkipBlanks:=False, _ 
           Transpose:=False 
      'Unhide all columns 
      .Columns.Hidden = False 
      'Set "active" cell to A1, just so the whole sheet isn't selected 
      .Cells(1, 1).Select 
     End With 
    Next 
    Application.CutCopyMode = False 
End Sub 

Код делает продолжайте использовать ActiveSheet, но только в том месте, где знает, что активный лист является вновь скопированным листом во вновь созданной книге.

+0

Спасибо за ответ и статью ... все еще есть некоторые проблемы, поскольку я получаю следующую ошибку во время выполнения. «Метод« Копировать »объекта« Рабочий лист »не удалось» .... из следующей строки Current.Copy – user7410879

+0

@ user7410879 - У вас есть скрытые рабочие листы? (Я предполагал, что вы этого не сделали, потому что вы использовали метод «Копировать» в вашем исходном коде, но если вы это сделаете, код нужно будет изменить, чтобы не пытаться скопировать эти рабочие листы.) – YowE3K

+0

А, спасибо! Я использовал «If Current.Visible = True Then» Это разрешило мою проблему – user7410879

0

ваша главная ошибка заключается в том, что ваша Current переменная держит токаworksheet пока переборе Worksheets коллекции, в то время как ActiveSheet является в настоящее время «Активный» лист и не изменится пока вы не Activate новый лист (и зацикливание не Активировать)

и после каждого ActiveSheet.Copy, вновь созданное учебное пособие становится ActiveWorkbook и его единственный лист ActiveSheet

так что вы должны использовать Current вместо ActiveSheet

, кроме того, действует на всех Cells из листа занимает много времени и может возрасти проблемы с памятью: гораздо лучше, вы ссылаетесь UsedRange свойство Worksheet объекта

так что вы мог бы код:

Option Explicit 

Sub PriceListWest() 
    ' 
    ' PriceListWest Macro 
    ' 
    Dim Current As Worksheet 

    For Each Current In Workbooks("West price list master").Worksheets 
     Current.Copy '<--| copy current worksheet from 'original' workbook into a new workbook, this latter becomes the "active" workbook and it's only sheet the "Active" Sheet 
     With ActiveSheet.UsedRange '<--| reference "Active" worksheet of current "Active" Workbook 
      .value = .value 
      .EntireColumn.Hidden = False 
     End With 
    Next 
End Sub 

Наконец, действуя как выше оставит вас так много открытых книг, как приклеенные листы, в то время как вы можете сохранить и закрыть их на каждом I тем самым оставляя только «оригинальную» рабочую книгу:

Option Explicit 

Sub PriceListWest() 
    ' 
    ' PriceListWest Macro 
    ' 
    Dim Current As Worksheet 

    For Each Current In Workbooks("West price list master").Worksheets 
     Current.Copy '<--| copy current worksheet from 'original' workbook into a new workbook, this latter becomes the "active" workbook and it's only sheet the "Active" Sheet 
     With ActiveSheet.UsedRange '<--| reference "Active" worksheet of current "Active" Workbook 
      .value = .value 
      .EntireColumn.Hidden = False 
     End With 
     ActiveWorkbook.SaveAs filepathandname '<-- save current workbook 
     ActiveWorkbook.Close '<--| close it 
    Next 
End Sub 
Смежные вопросы