2016-12-22 4 views
1

я продолжать работать в ошибки, пытаясь удалить большинство листов в книге, а затем добавить их обратно.Попытка удалить все листы в книге, а затем добавить другие листы с использованием VBA

Я не могу удалить все листы в Учебное пособие; должен быть хотя бы один лист. Хорошо. Поэтому я сначала создаю лист под названием TempSheet.

targetWorkbook = ActiveWorkbook.Name 
'/* ...more code... */ 
Application.Workbooks(targetWorkbook).Activate 
Application.Workbooks(targetWorkbook).Worksheets.Add.Name = "TempSheet" 

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

For Each ws1 In Application.Workbooks(targetWorkbook).Worksheets 
    If ws1.Name <> "TempSheet" Then 
     Workbooks(targetWorkbook).Sheets(ws1.Name).Delete '/* Line X. */ 
    End If 
Next 

Когда я пошагово мой код и получить Line X, я получаю ошибку Can't enter break mode at this time. Я попытался заменить весь код на Line X только ws1.Delete, я получаю то же сообщение. Я хотел бы хотя бы пройти через код, чтобы я мог видеть, что листы удаляются.

Другая часть моего кода такова, что я хотел бы взять все листы из другой книги и поместить их в первую книгу, где я удалил все листы сверху. Мой код ниже:

Application.Workbooks("OtherWorkbook").Activate '/* Line Y. */ 
For Each ws2 In Application.Workbooks(sheetsWorkbook).Worksheets 
    ws2.Copy After:=Workbooks(targetWorkbook).Sheets(ws1.Name) 
Next 

я поставил точку останова на Line Y, и после того, как я получаю ошибку Can't enter break mode at this time, я нажал на кнопку Continue. Вместо остановки в точке останова я получаю ошибку Run-time error '424'. Object required, которая не показывает мне, к какой строке она относится, и не позволяет мне отлаживать (кнопка grey'd out и единственная кнопка, которую я могу выбрать, это end).

Любые предложения о том, как я могу это достичь?

+1

Не могли бы вы попытаться заключить свой цикл удаления с некоторыми отключенными событиями, предупреждениями, screenUpdating и расчетами? –

+0

Что такое ws1? Размещается ли он как рабочий лист? – Davesexcel

+2

Поскольку вы хотите удалить все листы, почему бы вам не начать с новой книги? – user3598756

ответ

6

Почистите ваш синтаксис, нет никакой необходимости, чтобы быть избыточными, как, например:

targetWorkbook = ActiveWorkbook.Name 
Application.Workbooks(targetWorkbook).Activate 

Это в основном говорят: ActiveWorkbook.Activate, который не только не делает ничего (в буквальном смысле), она также почти никогда не стоит полагаться на Activate или Select для ничего, если вы используете надлежащим образом контекстные переменные объекта.

Option Explicit 
Sub foo() 
Dim tempSheet as Worksheet, ws as Worksheet, wb As Workbook 
Set wb = ActiveWorkbook ' Or ThisWorkbook, or Workbooks("filename.xlsx"), etc. 
Set tempSheet = wb.Sheets.Add 

For Each ws in wb.Worksheets 
    Application.DisplayAlerts = False 
    If ws.Name <> tempSheet.Name Then 
     ws.Delete 
    End If 
    Application.DisplayAlerts = True 
Next 

'Now copy the other worksheets: 
Workbooks("OtherWorkbook").Worksheets.Copy After:=wb.Worksheets(1) 

'Finally, remove tempsheet 
tempSheet.Delete 

End Sub 

Это должны работы. Если вы не можете войти в режим прерывания, то на вашем ПК будет что-то еще.

Когда я просматриваю свой код и добираюсь до строки X, я получаю ошибку. Не могу войти в режим прерывания в это время.

Если вы ступая через код, вы в режиме перерыва уже, так что это не имеет смысла. Смотрите, если любой из этих предложений поможет определить источник ошибки (ы):

Can't enter break mode at this time

  1. В меню VBE Отладка «Compile VBA Project», это стоит выстрел.
  2. Удалить линию целиком. Запустите код. Затем верните строку и повторите попытку с точкой останова.
  3. Добавить DoEvents заявление после Sheets.Add
  4. Использовать MsgBox вместо точки останова на Debug.Print. В появившемся окне сообщения попытайтесь вручную разбить, используя ctrl + fn + Конец. (На данный момент «взломать» не нужно, но было бы интересно посмотреть, можете ли вы разбить этот путь)
  5. Вместо этого установите точку останова на Sheets.Add; практически нет причин поставить точку останова на оператор Print, если вы можете просто поместить его в предыдущую строку.
  6. Есть ли аддины? Если это так, отключите все из них и снова включите их, чтобы проверить, какой из них может внести вклад в ошибку.
+0

Просто вернемся к этому. Этот код не работает. Этот код удалит все мои обычные листы (которые я узнал, что мой исходный код также делает, если я пропускаю итерацию по листам с кнопками), но когда он попадает на рабочий лист с кнопками, то по какой-то причине он все еще говорит мне: «Может 't введите режим прерывания в это время'. Сначала я попытался удалить кнопки, но это не сработало. У меня хотя бы есть идея, в чем проблема, поэтому я собираюсь поиграть с этим некоторое время. Спасибо за ответ. – aCarella

+0

Можете ли вы объяснить обоснование удаления листов и копирования в новую книгу? Почему бы не просто скопировать в новую книгу (без удаления)? –

+0

Рабочая книга, которую я удаляю, представляет собой книгу с поддержкой макросов, которую могут открывать несколько человек в любой момент времени. Я хотел бы иметь возможность делать изменения разработки на своей машине и экспортировать все изменения, в том числе любые изменения пользовательского интерфейса на листах, а затем пользователь «перезагружает» рабочую книгу, которую они используют (кнопка, которая запускает макрос, который удаляет все листы и копирует листы из xlsx), не закрывая и не открывая его. Это моё решение для того, чтобы не было возможности экспортировать графические изменения на листы. – aCarella

1

Вы уже установили объект листа ws1 и зацикливаетесь внутри книги, вы можете напрямую удалить объект ws1, не усложняя синтаксис.

Dim ws1 As Worksheet 

For Each ws1 In Application.Workbooks(targetWorkbook).Worksheets 
    If ws1.Name <> "TempSheet" Then 
     ws1.Delete 
    End If 
Next 

Вы можете просто установить рабочую книгу также как:

Dim wb1 As Workbook 

Set wb1 = ActiveWorkbook ' better yet use ThisWorkbook if the workbook is the one with this code in it 

For Each ws1 In wb1.Worksheets 
    If ws1.Name <> "TempSheet" Then 
     ws1.Delete 
    End If 
Next 

Полный код:

Sub Add_DeleteWorksheets() 

Dim wb1 As Workbook 
Dim ws1 As Worksheet 
Dim tmpsht As Worksheet 

Set wb1 = ActiveWorkbook ' better yet use ThisWorkbook if the workbook is the one with this code in it 
Set tmpsht = wb1.Worksheets.Add 
tmpsht.Name = "TempSheet" 

For Each ws1 In wb1.Worksheets 
    If ws1.Name <> tmpsht.Name Then 
     ws1.Delete 
    End If 
Next 

End Sub 
+0

Эй. Спасибо, что ответили. Я упомянул, что я уже пробовал 'ws1.Delete' и получил ту же ошибку. Любые другие идеи о том, как я могу это реализовать? – aCarella

+0

@aCarella является 'ws1', определяемым как' Worksheet'? –

+0

Я выполнил все вышеперечисленное и все равно получаю то же сообщение об ошибке. – aCarella

0

Другие, что я предложил в мой комментарий, вы можете попробовать эти следующие два подхода


подход 1 - первая вставка новых книг, а затем удалять существующие

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

Option Explicit 

Sub delsheets1() 
    ReDim existingSheets(1 To Worksheets.Count) As String 
    Dim isht As Long 

    For isht = 1 To Worksheets.Count 
     existingSheets(isht) = Worksheets(isht).Name 
    Next 

    Application.DisplayAlerts = False 
    Workbooks("Cartel2").Worksheets.Copy After:=Worksheets(1) 
    Worksheets("OtherWorkbook").Delete 
    Application.DisplayAlerts = True 
End Sub 

подход 2 - первый удалять существующие, а затем вставить новые рабочие книги

это тот же подход, как ваша, и имеет (логику только, на самом деле) недостаток вставки нового " темп»лист

может быть„группа“удаление метод позволяет избежать проблем у вас с вашим текущим кодом

Option Explicit 

Sub delsheets2() 
    ReDim existingSheets(1 To Worksheets.Count) As String 
    Dim isht As Long 

    For isht = 1 To Worksheets.Count 
     existingSheets(isht) = Worksheets(isht).Name 
    Next 

    Worksheets.Add.Name = "TempSheet" 

    Application.DisplayAlerts = False 
    Worksheets(existingSheets).Delete 
    Workbooks("OtherWorkbook").Worksheets.Copy After:=Worksheets(1) 
    Worksheets("TempSheet").Delete 
    Application.DisplayAlerts = True 
End Sub 
+0

@aCarella, вы попробовали одно из этих решений? – user3598756

 Смежные вопросы

  • Нет связанных вопросов^_^