我必须使用后期绑定。我如何更换以下内容?
Sub CopyCell(wd As Object, stringcell As String, BookMarkName As String)
'find Word bookmark
wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName
wd.Selection.TypeText stringcell
End Sub
急需的帮助
答案 0 :(得分:2)
我会保留它的位置,但在模块级别将其声明为常量,可能在其自己的Public Const wdGoToBookmark As Long = -1
模块中:
Public Enum WdGoToItem
wdGoToBookmark = -1
wdGoToComment = 6
'...
End Enum
或者更好,重新创建枚举类型:
wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName
您可以在https://github.com/angular/material2/blob/master/src/lib/dialog/dialog.spec.ts#L178
上找到枚举定义这样代码仍然合法:
-1
它只是不再解析为在引用的库中声明的常量。
或者你可以在现场对一个神奇的wd.Selection.GoTo What:=-1, Name:=BookMarkName ' -1: wdGoToBookmark
值进行硬编码,但是要知道它代表什么就变得更难了,所以把它放在评论中并不是一个坏主意:
{{1}}
答案 1 :(得分:2)
答案 2 :(得分:2)
FWIW,我不会简单地创建常量并删除早期绑定。毕竟,我们早期开始利用代码的开发和编译时验证的简易性。
我强烈建议您编写代码,以便可以通过翻转开关进行切换。对于OP的特定代码,我们可以实现:
Sub CopyCell(wd As Object, stringcell As String, BookMarkName As String)
#If LateBind Then
Const wdGoToBookmark As Long = -1
#Else
Debug.Assert wdGoToBookmark = -1
#End If
'find Word bookmark
wd.Selection.GoTo What:=wdGoToBookmark, Name:=BookMarkName
wd.Selection.TypeText stringcell
End Sub
LateBind
const可以在其声明部分的每个模块上定义为:
#Const LateBind = 1
或者可以通过转到Options
- &gt;为整个项目定义它。 <project name> Properties
并将其放入Conditional Compilation Arguments
。
这种方法可以扩展到其他方法。例如,要创建Word.Application
,我们可以执行与此类似的操作:
#If LateBind Then
Dim app As Object
#Else
Dim app As Word.Application
#End If
Set app = CreateObject("Word.Application")
对于需要获取或返回对象的函数,可以有两个头:
#If LateBind Then
Sub CopyCell(wd As Object, stringcell As String, BookMarkName As String)
#Else
Sub CopyCell(wd As Word.Document, stringcell As String, BookMarkName As String)
#End If
'<rest of procedure body>
End Sub
为什么要写更多代码?这样您就可以简单地添加/删除对库的引用,将LateBind
常量更改为其他值,然后进行编译。您现在可以轻松地在两种模式之间切换,更重要的是,您可以非常轻松地在编译时验证代码,并且可以合理地确保它在后期绑定模式下同样有效。这不一定总是正确的,但仍然比简单地转储任何早期绑定代码的痕迹更好,并希望最好。运行时错误是开发人员面临的威胁,在开发过程中应尽可能避免。