【发布时间】:2014-03-26 15:45:44
【问题描述】:
我正在尝试从 Word 表格中获取选定的单元格。我需要收集选定的表格单元格来创建自定义书签对象,其中包含用户选择了哪些单元格范围的信息。当用户选择单元格的矩形区域时,一切正常。这就是我在 Word 插件中获取选定表格单元格的方式:
Globals.ThisAddIn.Application.Selection.Range.Application.ActiveWindow.Selection.Cells
如果用户选择非矩形区域或选择多个区域(按住 CTRL 时),此属性将返回无效的单元格集合。我创建了一个简单的 vba 代码,用于测试使用两个属性在表格中选择了哪些单元格:
Globals.ThisAddIn.Application.Selection.Range.Application.ActiveWindow.Selection.Cells
Globals.ThisAddIn.Application.Selection.Range.Cells
当用户选择非矩形表格单元格区域时,这两个属性都会返回不同且无效的选定单元格集合。这是我用于测试目的的 vba 代码,当在 Word 表中选择了单元格范围时:
Sub test()
Dim listaKomorek1 As New Collection
Dim listaKomorek2 As New Collection
Dim indekser1 As Integer
Dim indekser2 As Integer
Dim tekst1 As String
Dim tekst2 As String
Dim tabela As Table
Set tabela = Selection.Range.Tables(1)
indekser1 = 1
indekser2 = 1
liczbaKomorek1 = Selection.Range.Cells.count()
liczbaKomorek2 = Selection.Range.Application.ActiveWindow.Selection.Cells.count()
tekst1 = "Lista komorek 1 (Selection.Range.Cells): " & vbCrLf & vbCrLf & vbCrLf
tekst2 = "Lista komorek 2 (ActiveWindow.Selection.Cells): " & vbCrLf & vbCrLf & vbCrLf
For Each komorka In Selection.Range.Cells
tekst1 = tekst1 & "#Cell: " & CStr(indekser1) & " Value: " & CStr(komorka.Range.Text) & " Column: " & CStr(komorka.ColumnIndex) & " Row: " & CStr(komorka.RowIndex) & vbCrLf
indekser1 = indekser1 + 1
Next komorka
For Each komorka In Selection.Range.Application.ActiveWindow.Selection.Cells
tekst2 = tekst2 & "#Cell: " & CStr(indekser2) & " Value: " & CStr(komorka.Range.Text) & " Column: " & CStr(komorka.ColumnIndex) & " Row: " & CStr(komorka.RowIndex) & vbCrLf
indekser2 = indekser2 + 1
Next komorka
tekst1 = tekst1 & vbCrLf & "Cells count: " & CStr(liczbaKomorek1)
tekst2 = tekst2 & vbCrLf & "Cells count: " & CStr(liczbaKomorek2)
MsgBox tekst1
MsgBox tekst2
End Sub
我的问题是,当用户在 Word 表格中选择非矩形区域时,如何获得有效的选定单元格集合?
【问题讨论】:
-
据我所知,VBA“看到”的选择的多个非连续部分的唯一部分是最后一次选择。较早的选择不能通过对象模型获得。也没有有用的“选定”属性。 AFAIK 如果您进行一个连续的选择,您可以成功地迭代 Selection.Cells,但我不确定这是否是您找到的。还有一些其他潜在的困难:包含来自两个表的单元格的选择加上(在这种情况下,Selection.Cells.Count 为零)和涉及嵌套表的选择之间的空间。
-
有趣的阅读,谢谢。关于这一点:当用户选择多个不连续的范围时,Selection 对象的以下方法和属性适用于用户选择中的所有子范围:Selection.Font.Size。这是否意味着我可以更改多个不连续范围内所有单元格的字体大小,然后遍历表格以查找这些单元格?这行得通吗?
标签: c# vba ms-word office-interop