word vba编程提示属性的使用无效,何解?

在word中随意选中一个表格,运行如下脚本:
Sub test()
Selection.Tables(1).Cell(1, 1) = "test"
End Sub
就是在 (1,1) 单元格中写入文本,为什么会提示属性的使用无效?

换一个写法:
Sub test()
Dim myTable As Object
Set myTable = Selection.Tables(1)
myTable.Cell(1, 1) = "test"
End Sub
就没有任何问题,这两个不是完全等价的吗?

第1个回答  2016-07-25
这两种写法不一样,Selection.Tables(1)这个只是一个对象的声明并没有做初始化,而

Set myTable = Selection.Tables(1)这个就是对声明的myTable做初始化的。追问

为什么需要初始化呢?Selection.Tables(1)不是 word 中已经存在的对象吗?

追答

必须显示声明为对象

已通知提问者对您的回答进行评价,请稍等

追问

采用楼下提到的 Selection.Tables(1).Cell(1, 1).range = "test" 写法就没问题了,区别在哪儿呢?

第2个回答  2016-07-25
属性的使用无效?那再写完整一点:

Sub test02()
ActiveDocument.Tables(1).Cell(1, 1).Range = "test"
End Sub

Selection.Tables(1).当用户没有把鼠标点击到表格中就会出错追问

Sub test()

Selection.Tables(1).Cell(1, 1).range = "test"
End Sub

就没问题了 ~ 能解释一下是为什么吗?为什么我题目中的第二种写法就不用加 range?

追答

你的第二例子是建立了一个表的新对象,已经明确告诉VBA所指向的对象

====================================
其实你的第二例子也不规范,请测试:在文档中,开头写几行文字,后面接着放表格,表格后面再输入一段文字,代码就出错了,找不到表格了

追问

试了试没问题,注意我的代码是 selection,需要选中表格才生效

追答

应该是出错的吧,请你把光标停到最后的文字后面,不要停到表格里,再运行代码

=======================
我认为,用Selection前应当先表格被选中,好像excel一样
先:[a1].select
后:Selection

追问

问题不在这儿,代码中的 range 到底起了什么作用?cell本身不就应该返回 range 对象吗?再加一个 .range 是什么意思?

问题不在这儿,代码中的 range 到底起了什么作用?cell本身不就应该返回 range 对象吗?再加一个 .range 是什么意思?

追答

word不同于excel,cell没有value属性,其实完整的写法应该是:cell().range.text=

追问

也即是说,第二个例子中系统帮我补足了 .range.text,而第一个例子中系统没补足,又因为 word 中 cell 不能赋值,导致出了问题?

追答

Sub test002()
Dim myTable As Object
Set myTable = ActiveDocument.Tables(1)
myTable.Cell(1, 1) = "test"
End Sub
第二例子的Selection改为ActiveDocument,经测试也就没问题

本回答被提问者采纳