我正在尝试在word文档中总结一个表的列。它是3列表,长度取决于文档。我在宏中做的是以下内容:
我想总结第2列中的数字。然后我添加一些某些行(第一列中的标题,第2列中没有数字)并稍微更改顺序。但我遇到的问题是,有时行被覆盖(由于编程错误......),所以我想总结第二列,并将结果与之前的结果进行比较(如校验和)。
如何实现将第二个表的值与变量相加(不将其写入单元格),并最终将其进行比较?
Sub ModuleTest()
Dim numrows As Long
Dim col2 As Range
numrows = ActiveDocument.Tables(1).Rows.Count
Set col2 = ActiveDocument.Range( _
Start:=ActiveDocument.Tables(1).Cell(1, 2).Range.Start, _
End:=ActiveDocument.Tables(1).Cell(numrows, 2).Range.End)
'Code to sum up values in range col2
End Sub
我设法定义范围,但现在我想把它总结为一个变量。
答案 0 :(得分:1)
良好的开端和逻辑思维 - 唯一的问题是在Word中一个Range对象必须是连续的(从左到右,从上到下)。表列中的单元格不是连续的,因此(不幸的是,我们)不能将其分配给Range对象。
这意味着你可以在Column对象中循环Cell对象,或者你可以在Selection对象中循环Cells。从面向对象的角度来看,第一个更正确;如果有很多单元格,第二个执行速度会更快。
这两种方法都在下面的代码中。它测试(截断的)单元格内容是否为数字,并对它们进行求和。 (为什么要截断:因为Word单元格的最后一个字符是Chr(13)& Chr(7),它们不是数字。)
Sub TableColumn()
'Working with Selection is faster
' Dim tbl As word.Table
' Dim runningSum As Double
' Dim sel As word.Selection
' Dim cel As word.Cell
' Dim celContent As String
'
' Set tbl = ActiveDocument.Tables(1)
' runningSum = 0
' tbl.Cell(1, 2).Select
' Set sel = Selection
' sel.Columns(1).Select
'
' For Each cel In sel.Cells
' celContent = Mid(cel.Range.Text, 1, Len(cel.Range.Text) - 1)
' If IsNumeric(celContent) Then
' runningSum = runningSum + CDbl(celContent)
' End If
' Next
' Debug.Print runningSum
'Working with the pure object model is slower, but "cleaner"
Dim tbl As word.Table
Dim col As word.Column
Dim runningSum As Double
Dim cel As word.Cell
Dim celContent As String
Set tbl = ActiveDocument.Tables(1)
Set col = tbl.Columns(2)
runningSum = 0
For Each cel In col.Cells
celContent = Mid(cel.Range.Text, 1, Len(cel.Range.Text) - 1)
If IsNumeric(celContent) Then
runningSum = runningSum + CDbl(celContent)
End If
Next
Debug.Print runningSum
End Sub