替代application.calculation = xlcalculationmanual来加快mailmerge vba代码的速度?

时间:2019-04-19 10:29:05

标签: excel vba ms-word mailmerge

当我的代码运行并到达行application.calculation = xlcalculationmanual时,出现编译错误,提示未找到方法或数据成员


我有一个vba宏,该宏在excel值表中查找并提取此数据以在word 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

我希望代码能够在不到3秒的时间内运行并从excel中提取数据并填充doc一词。

3 个答案:

答案 0 :(得分:2)

大概是因为您正在执行邮件合并,所以您的应用程序是Word-对于它,没有诸如Application.Calculation之类的东西。这是一个Excel命令,您没有运行Excel。此外,如果您要做的只是将合并限制为一组特定的记录,则完全不需要任何VBA。您可以使用mailmerge过滤器或在以下行中编码的SKIPIF字段:

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

其中的字段括号(即{})是通过Ctrl-F9在邮件合并主文档中成对创建的。

答案 1 :(得分:1)

您的代码中也没有错误处理。如果在开始对所有“应用程序”设置进行更改后代码中断,则无法将这些设置恢复为应有的设置。这会使您的应用程序处于非常不良的状态。这是您应该做的:

 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

答案 2 :(得分:0)

感谢您在学习有关SKIPIF来实现macropod答案的过程中得到的所有答案,我提出了一个非常简单的直观解决方案。

解决方案: 归档电子表格的一半,以便电子表格现在具有以前包含的行数的一半。该电子表格包含2016-19年的数据,但无需在2019年之前获得数据。

我认为可以解决的原因: 与其通过添加更多代码来加快宏的速度,反而减少了excel必须筛选的数据量。

相同的结果,但解决方法不同。现在,宏可以通过命令按钮快速运行。