#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% уверенным, что оно устранило проблему, но я чувствую, что вы ответили на мой вопрос. Спасибо!