VBA参数错误

时间:2018-04-04 12:26:47

标签: excel vba excel-vba ms-word

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

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。但这也确保它不再选择价值。

此时我无望。所以我会帮忙。

Thnx提前。

1 个答案:

答案 0 :(得分: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模块中定义的常量将优先于类型库中定义的相同名称标识符:这称为 shadowing < / em>,或隐藏 - 在您的VBA项目中定义的任何内容在标识符解析中始终具有更高的优先级。

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