Vba 后期绑定WDGOTOBOKOKMARK

Vba 后期绑定WDGOTOBOKOKMARK,vba,excel,Vba,Excel,我必须使用后期装订。如何替换以下内容 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 Thx对于急需的帮助

我必须使用后期装订。如何替换以下内容

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

Thx对于急需的帮助

我会将其保留在原处,但在模块级别将其声明为常量,可能在其自己的WordConstants模块中:

或者更好,重新创建枚举类型:

Public Enum WdGoToItem
    wdGoToBookmark = -1
    wdGoToComment = 6
    '...
End Enum
您可以在上找到枚举定义

这样,本守则仍然合法:

它不再解析为引用库中声明的常量

或者,您可以当场硬编码一个magic-1值,但这样就很难知道它代表什么,因此将其放在注释中不是一个坏主意:

wd.Selection.GoTo What:=-1, Name:=BookMarkName ' -1: wdGoToBookmark

我会将其保留在原来的位置,但在模块级别将其声明为常量,可能在其自己的WordConstants模块中:

或者更好,重新创建枚举类型:

Public Enum WdGoToItem
    wdGoToBookmark = -1
    wdGoToComment = 6
    '...
End Enum
您可以在上找到枚举定义

这样,本守则仍然合法:

它不再解析为引用库中声明的常量

或者,您可以当场硬编码一个magic-1值,但这样就很难知道它代表什么,因此将其放在注释中不是一个坏主意:

wd.Selection.GoTo What:=-1, Name:=BookMarkName ' -1: wdGoToBookmark

在Word中,转到VB编辑器并按F2键打开对象浏览器-搜索wdGoToBookmark以查找其数值。在代码中使用该值,或者按照Mat的杯子建议定义一个常量


在Word中,转到VB编辑器并按F2键打开对象浏览器-搜索wdGoToBookmark以查找其数值。在代码中使用该值,或者按照Mat的杯子建议定义一个常量


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常量可以在其声明部分的每个模块上定义为: 常数LateBind=1

或者,可以通过转到Options->Properties并将其放入条件编译参数中,为整个项目定义它

这种方法可以扩展到其他领域。例如,要创建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常量更改为另一个值,然后编译。现在,您可以轻松地在两种模式之间切换,更重要的是,您可以使代码在编译时很容易被验证,并且可以合理地保证它在后期绑定模式下同样工作。这不一定总是正确的,但这仍然比简单地丢弃任何早期绑定代码的痕迹并希望得到最好的结果要好。运行时错误对开发人员是一种威胁,在开发过程中应该尽量避免。

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常量可以在其声明部分的每个模块上定义为: 常数LateBind=1

或者,可以通过转到Options->Properties并将其放入条件编译参数中,为整个项目定义它

这种方法可以扩展到其他领域。例如,要创建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常量更改为另一个值,然后编译。现在,您可以轻松地在两种模式之间切换,更重要的是,您可以使代码在编译时很容易被验证,并且可以合理地保证它在后期绑定模式下同样工作。这不一定总是正确的,但这仍然比简单地丢弃任何早期绑定代码的痕迹并希望得到最好的结果要好。运行时错误对开发人员构成威胁,在开发过程中应尽可能避免。

在Word中,转到VB编辑器并按F2键打开对象浏览器-搜索wdGoToBookmark以查找其数值在Word中,转到VB编辑器并按F2键打开对象浏览器-搜索WDGOTOBOKMARK以查找它的数值是有效的。。。只要引用了wordlibrary,我不建议将其转换为后期绑定,因为这样很容易错过引用。FWIW我正在使用Rubberduck中的“添加/删除引用”对话框功能,该功能将与“查找所有引用”搜索工具一起提供,该工具可以快速查找解析为引用库的所有内容。可以
我等不及要把它运出去了!这很有效。。。只要引用了wordlibrary,我不建议将其转换为后期绑定,因为这样很容易错过引用。FWIW我正在使用Rubberduck中的“添加/删除引用”对话框功能,该功能将与“查找所有引用”搜索工具一起提供,该工具可以快速查找解析为引用库的所有内容。迫不及待地想发货@请阅读答案。当然,这是有效的,这不是我推荐的。建议的方法是保持代码的原样,自己定义常量,就像答案的第一部分所说的那样。对不起,我将重新措辞:其他方法不起作用,最后一个方法起作用。无论如何,谢谢你的邀请help@GiuseppeMercurio请阅读答案。当然,这是有效的,这不是我推荐的。建议的方法是保持代码的原样,自己定义常量,就像答案的第一部分所说的那样。对不起,我将重新措辞:其他方法不起作用,最后一个方法起作用。无论如何,谢谢你的帮助,这是最终的解决方案,这是最终的解决方案。