我一直在摆弄这段代码几个小时,我无法摆脱编译错误。
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提前。
答案 0 :(得分:0)
尝试使用5代替wdLine而使用0代替wdMove。 - Darren Bartrup-Cook
如果您没有对Microsoft Word类型库的引用,则wdLine
和wdMove
未定义。
如果未在模块顶部指定Option Explicit
,则它们将变为未声明的变量,其默认类型为Variant
,并且因为它们已作为传递对于期望枚举值的成员的参数,它们将作为0
传递 - 这可能是也可能不是被调用成员的有效值,并且可能会或可能不会按预期工作。
如果在模块顶部指定了Option Explicit
,则代码无法编译,并且VBE将wdLine
和wdMove
作为未声明的标识符突出显示。
由于更多的人会使用这个,我坚持使用数字。但我很感激帮助! - MateoVD
最佳解决方案(假设您保持MS Word参考后期限制)是为了保持wdLine
和wdMove
值的可读性。内联它们各自的基础整数值会起作用,但是你有5
和0
并且不知道这些值意味着什么:这些被称为幻数,它们“是难以调试的问题的重要来源。
自己声明常量。 wdLine
和wdMove
分别是WdUnits
和WdMovementType
枚举的成员。
您可以在任何模块的顶部自己定义这些枚举 - 我建议在他们自己的标准/程序模块(.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
现在,您可以按原样保留代码,并使用wdMove
和wdLine
以及任何其他可能的合法值,而无需在线挖掘它们及其基础值。
如果您随后添加对Microsoft Word类型库的引用,则WordConsts
模块中定义的常量将优先于类型库中定义的相同名称标识符:这称为 shadowing < / em>,或隐藏 - 在您的VBA项目中定义的任何内容在标识符解析中始终具有更高的优先级。
TL; DR:编写代码表示它的作用,执行它所说的。魔术数字没有说什么 - 避免它们。如果数字意味着什么,请给它一个有意义的名字。如果该值存在名称,请使用它。