Стереть данные, хранящиеся в памяти, или упростить этот подраздел еще больше?

#excel #vba #performance #optimization

#excel #vba #Производительность #оптимизация

Вопрос:

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

1- есть ли способ упростить его еще больше, чем у меня уже есть, и

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

 Sub Splitbook()
Dim xPath As String, xWs As Worksheet, Box As String
xPath = Application.ActiveWorkbook.Path
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Box = Application.InputBox("Set?")

For Each xWs In ActiveWorkbook.Sheets
    If xWs.Name <> "Master" Then
        xWs.Copy
        Application.ActiveWorkbook.SaveAs Filename:=xPath amp; "" amp; xWs.Name amp; " " amp; Box amp; ".xlsx"
        Application.ActiveWorkbook.Close False
    Else

    End If
Next

Application.DisplayAlerts = True
End Sub
  

Заранее извините, если это неподходящая тема.

Комментарии:

1. Вы просматриваете каждый лист рабочей книги. Допустим, в нем 2 листа, и ни один из них не назван «master». Первый лист вы .copy сохраняете, а затем activeworkbook сохраняете. Затем вы закрываете activeworkbook . Затем он переходит ко второму листу теперь закрытой книги … похоже, это не то, что вы намеревались сделать. Возможно, вы не хотите закрывать activeworkbook до завершения цикла? Также… почему .Copy рабочий лист. Вы никогда никуда его не вставляете. Это кажется излишним.

2. Итак, файл, в котором это выполняется, обычно содержит 96 вкладок. 95 из них — это просто номер хранилища, тогда 96-й является «основным» со всей информацией. Цель этого — разбить каждую вкладку на отдельный файл. Вы правы в xWS.Copy строке; это следует удалить. Что касается ActiveWorkbook строк, вы хотите сказать, что первая в if инструкции — единственная, которая необходима?

3. Я беспокоюсь, что вся эта «ActiveWorkbook» вызывает проблему. Над вашим for циклом поместите Set xWB = ActiveWorkbook . Тогда ваш For цикл может выглядеть следующим образом For Each xWs In xWB.Sheets . Сохраните остальной код как есть и посмотрите, убережет ли это его от сбоя.

4. Пытаюсь сейчас. Однако я должен отметить, что в 75% случаев это работает отлично. Когда у меня открыто несколько программ во время запуска, это приводит к сбою компьютера.

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

Ответ №1:

Я предлагаю вам попробовать использовать VBA.DoEvents. проблема, с которой вы сталкиваетесь, может быть связана с использованием большого объема системной памяти, поскольку вы открываете и закрываете книгу Excel. Когда у вас в обращении слишком много книг, ваш исходный Excel становится «не отвечающим» с использованием VBA.DoEvents может снизить общую скорость, но должен предотвращать «не отвечающий» исходную книгу

 For Each xWs In ActiveWorkbook.Sheets
If xWs.Name <> "Master" Then
vba.DoEvents
    xWs.Copy
    Application.ActiveWorkbook.SaveAs Filename:=xPath amp; "" amp; xWs.Name amp; " " amp; Box amp; _
".xlsx"
    Application.ActiveWorkbook.Close False
Else

End If
Next
  

Комментарии:

1. Я только что протестировал это, и оно завершилось. Ваш ответ определенно на пути, который я искал, поскольку я предположил, что причиной моих сбоев была проблема с системной памятью. Мне придется использовать это решение еще несколько раз, чтобы быть на 100% уверенным, что оно устранило проблему, но я чувствую, что вы ответили на мой вопрос. Спасибо!