当我的代码运行并到达行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一词。
答案 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必须筛选的数据量。
相同的结果,但解决方法不同。现在,宏可以通过命令按钮快速运行。