VBA参数错误

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

我一直在摆弄这段代码几个小时,我无法摆脱编译错误。

Set objWord = CreateObject("Word.Application")

''more code

objWord.Selection.TypeText (FDS.Cells(2, 8).Value)

objWord.Selection.HomeKey Unit:=wdLine, Extend:=wdMove (error occurs here)

ActiveDocument.Indexes.MarkEntry Range:=objWord.Selection.Range, Entry:=("Device")
objWord.Selection.EndKey Unit:=wdLine

''more code

(因为模块太大,我遗漏了很多代码)

我希望代码最终要做的是查看特定的excel单元格并获取该值并将其放在当前打开的word文档中。然后必须选择该值并给出一个标记,然后转到该行的末尾。

我已经尝试了所有我知道的解决方案并将Extend:=wdMove更改为Extend:=wdExtend但似乎没有任何效果。

我摆脱错误的唯一方法是删除Unit:=wdLine。但这也确保它不再选择价值。

我在这一点上毫无希望。所以我会帮忙。

提前致谢。

excel vba excel-vba ms-word
1个回答
0
投票

尝试使用5而不是wdLine和0来代替wdMove。 - Darren Bartrup-Cook

如果您没有对Microsoft Word类型库的引用,则wdLinewdMove未定义。

如果未在模块顶部指定Option Explicit,则它们将成为具有默认类型Variant的未声明变量,并且由于它们作为参数传递给期望枚举值的成员,因此它们将作为0传递 - 这可能是或者可能不是被调用成员的有效值,并且可能或可能不按预期工作。

如果在模块的顶部指定了Option Explicit,则代码不会编译,并且VBE将wdLinewdMove突出显示为未声明的标识符。

由于更多的人会使用这个,我坚持使用数字。但我很感激帮助! - MateoVD

最好的解决方案(假设你保持MS Word参考后期限制)是为了保持wdLinewdMove值的可读性。内联它们各自的底层整数值是有效的,但是你有50并且不知道这些值意味着什么:这些被称为幻数,它们是难以调试的重要问题。

自己声明常量。 wdLinewdMove分别是WdUnitsWdMovementType枚举的成员。

您可以在任何模块的顶部自己定义这些枚举 - 我建议在它们自己的标准/过程模块(.bas)中定义它们,以便可以从代码中的任何位置访问这些值(它们不会,如果你在例如Worksheet类模块中定义它们:

'Module: WordConsts
'@Folder("Microsoft Word Constants")
Option Explicit

Public Enum WdUnits
    wdCell = 12
    wdCharacter = 1
    wdCharacterFormatting = 13
    wdColumn = 9
    wdItem = 16
    wdLine = 5
    wdParagraph = 4
    wdParagraphFormatting = 14
    wdRow = 10
    wdScreen = 7
    wdSection = 8
    wdSentence = 3
    wdStory = 6
    wdTable = 15
    wdWindow = 11
    wdWord = 2
End Enum

Public Enum WdMovementType
    wdMove = 0
    wdExtend = 1
End Enum

现在,您可以按原样保留代码,并使用wdMovewdLine以及任何其他可能的合法值,而无需在线挖掘它们及其基础值。

如果然后添加对Microsoft Word类型库的引用,则WordConsts模块中定义的常量将优先于类型库中定义的相同名称标识符:这称为阴影或隐藏 - 在VBA项目中定义的任何内容都将始终在标识符解析中具有更高的优先级。


TL; DR:编写代码,说出它的作用,并按照它所说的去做。魔术数字没有说什么 - 避免它们。如果数字意味着什么,请给它一个有意义的名字。如果该值存在名称,请使用它。

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