后期绑定wdGoToBookmark

时间:2018-01-08 18:35:21

标签: excel vba excel-vba

我必须使用后期绑定。我如何更换以下内容?

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

急需的帮助

3 个答案:

答案 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)

在Word中转到VB编辑器并按F2打开对象浏览器 - 搜索wdGoToBookmark以查找其数值。在代码中使用该值或根据Mat's mug建议定义一个常量。

enter image description here

答案 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常量更改为其他值,然后进行编译。您现在可以轻松地在两种模式之间切换,更重要的是,您可以非常轻松地在编译时验证代码,并且可以合理地确保它在后期绑定模式下同样有效。这不一定总是正确的,但仍然比简单地转储任何早期绑定代码的痕迹更好,并希望最好。运行时错误是开发人员面临的威胁,在开发过程中应尽可能避免。