application.calculation = xlcalculationmanual替代加速mailmerge vba代码?

问题描述 投票:0回答:3

当我的代码运行并到达行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

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

excel vba ms-word mailmerge
3个回答
2
投票

据推测,既然你正在做一个mailmerge,你的应用程序就是Word--没有Application.Calculation这样的东西。这是一个Excel命令,你没有运行Excel。此外,如果您要做的只是将合并限制为特定的记录集,则根本不需要任何VBA。您可以使用mailmerge过滤器或按以下方式编码的SKIPIF字段:

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

其中字段括号(即{})通过Ctrl-F9在mailmerge主文档中成对创建。


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

0
投票

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

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

我认为这样做的原因是:不是通过添加更多代码来加速我的宏,而是削减excel必须筛选的数据量。

相同的结果,但不同的方式绕过它。现在宏从命令按钮运行得非常快。

© www.soinside.com 2019 - 2024. All rights reserved.