Альтернатива application.calculation = xlcalculationmanual для ускорения работы mailmerge vba code? - PullRequest
0 голосов
/ 19 апреля 2019

Когда мой код запускается и достигает строки application.calculation = xlcalculationmanual, возникает ошибка компиляции о том, что метод или элемент данных не найдены


У меня есть макрос vba, который просматривает таблицу значений Excel иизвлекает эти данные для заполнения полей слияния в слове doc.

Макрос выполняется с помощью нажатия кнопки команды.Мне потребовалась помощь для ускорения кода, выполнение которого занимает более 15 секунд.

Я добавил несколько строк для ускорения кода (см. Ниже), но когда он достигает application.calculation = xlcalculationmanual, возникает ошибка компиляции: методили элемент данных не найден

Я посмотрел это, и кто-то упомянул использование раннего связывания.Поэтому я перешел к справочникам по инструментам и поставил галочку для библиотеки MS Excel 16.0.Проблема с calculationmanual осталась.

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


Private Sub CommandButton1_Click()

'speed up of code    
Application.ScreenUpdating = False    
Application.DisplayStatusBar = False    
Activesheet.DisplayPageBreaks = False    
Application.Calculation = xlCalculationManual    
Application.EnableEvents = False    
'end of speed up of code

  Dim numRecord As Integer
  Dim myDCR As String

myDCR = InputBox("Enter DCR:")    
Set dsMain = ActiveDocument.MailMerge.DataSource

With ActiveDocument.MailMerge
 .DataSource.ActiveRecord = wdFirstRecord
End With

If dsMain.FindRecord(FindText:=myDCR, Field:="DCR") = True Then
    numRecord = dsMain.ActiveRecord
End If

Application.ScreenUpdating = True    
Application.DisplayStatusBar = True    
Activesheet.DisplayPageBreaks = True    
Application.Calculation = xlCalculationAutomatic    
Application.EnableEvents = True

End Sub

Я ожидаю, что код запустится и получит данные изпревзойти и заполнить слово doc менее чем за 3 секунды.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2019

Предположительно, поскольку вы делаете почтовое слияние, ваше приложение - это Word, для которого не существует такого понятия, как Application.Calculation.Это команда Excel, и вы не используете Excel.Кроме того, если все, что вы пытаетесь сделать, это ограничить объединение определенным набором записей, то никакой VBA вообще не требуется.Вы можете использовать фильтры mailmerge или поле SKIPIF, закодированные вдоль строк:

{SKIPIF {MERGEFIELD DCR}<> {FILLIN "Enter DCR:" \o}}

, где фигурные скобки поля (т. Е. {}) Создаются в виде пар в основном документе mailmerge с помощью Ctrl-F9.

1 голос
/ 19 апреля 2019

У вас также нет обработки ошибок в вашем коде.Если ваш код сломался после того, как вы начали вносить все изменения в настройки приложения, восстановить эти настройки некуда.Это может оставить ваше приложение в ОЧЕНЬ плохом состоянии.Вот что вы должны делать:

 Private Sub CommandButton1_Click()

    'speed up of code    
    On Error GoTo ExitErr
       Application.ScreenUpdating = False    
       Application.DisplayStatusBar = False    
       Activesheet.DisplayPageBreaks = False    
       Application.Calculation = xlCalculationManual    
       Application.EnableEvents = False    
    'end of speed up of code

   Dim numRecord As Integer
   Dim myDCR As String

       myDCR = InputBox("Enter DCR:")    
       Set dsMain = ActiveDocument.MailMerge.DataSource

       With ActiveDocument.MailMerge
        .DataSource.ActiveRecord = wdFirstRecord
       End With

       If dsMain.FindRecord(FindText:=myDCR, Field:="DCR") = True Then
           numRecord = dsMain.ActiveRecord
       End If

    ExitErr:
       Application.ScreenUpdating = True    
       Application.DisplayStatusBar = True    
       Activesheet.DisplayPageBreaks = True    
       Application.Calculation = xlCalculationAutomatic    
       Application.EnableEvents = True

    End Sub
0 голосов
/ 24 апреля 2019

Спасибо за все ваши ответы в процессе изучения SKIPIF для реализации ответа макропода. Я предложил очень простое интуитивно понятное решение.

Решение : Архивирование половины электронной таблицы, так что теперь в электронной таблице содержится половина количества строк, которые она содержала ранее. В электронной таблице содержались данные за 2016-19 гг., Но до 2019 г. не было необходимости иметь данные.

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

Тот же результат, но другой способ обойти это. Теперь макрос запускается довольно быстро из командной кнопки.

...