怎样用VBA遍历Word表格中各单元格才不会出现运行时错误,并给出判断Word表格中的单元格是不是合并单元格的方法

我们来看一个Word文档中的两个表格,第一个表格如下:

RowIndex=1

ColumnIndex=1

RowIndex=1

ColumnIndex=2

RowIndex=1

ColumnIndex=3

RowIndex=1

ColumnIndex=4

RowIndex=2

ColumnIndex=1

RowIndex=2

ColumnIndex=2

RowIndex=2

ColumnIndex=3

RowIndex=2

ColumnIndex=4

RowIndex=3

ColumnIndex=1

RowIndex=3

ColumnIndex=2

RowIndex=3

ColumnIndex=3

RowIndex=3

ColumnIndex=4

第二个表格如下:

RowIndex=1

ColumnIndex=1

RowIndex=1

ColumnIndex=2

RowIndex=1

ColumnIndex=3

RowIndex=2

ColumnIndex=1

RowIndex=2

ColumnIndex=2

RowIndex=2

ColumnIndex=3

RowIndex=2

ColumnIndex=4

RowIndex=3

ColumnIndex=1

RowIndex=3

ColumnIndex=2

RowIndex=3

ColumnIndex=3

RowIndex=3

ColumnIndex=4

RowIndex=4

ColumnIndex=2

RowIndex=4

ColumnIndex=3

RowIndex=4

ColumnIndex=4

我们知道,如下代码可以取得表格对象“aTable”的总行数和总列数:

' 取得aTable的总列数
iCols = aTable.Columns.Count
' 取得aTable的总行数
iRows = aTable.Rows.Count

通常情况下,通过使用索引变量,可以完成表格全部单元格的遍历,示例代码如下:

' 使用索引变量i和j行序优先遍历表格中的单元格
For i = 1 To iRows
     For j = 1 To iCols
        ' 将表格内容中最末的不能显示的字符替换为空后在提示框中显示
         MsgBox Replace(aTable.Cell(i, j).Range.Text, Chr(13) & Chr(7), "")
     Next
Next

但是,上述遍历代码在遍历第二个表格(存在合并单元格的表格)时,会出现运行时错误“无法访问此集合中单独的行或列,因为表格有纵向或横向合并的单元格。”。

表格中是否有合并单元格可以通过表格的“Uniform”属性检测,表格的“Uniform”属性为“True”则没有合并单元格,否则存在合并单元格。对于存在合并单元格的表格,不能采用上述使用索引的方式遍历单元格,而只能通过For each的方式来遍历单元格(当然没有合并单元格的表格也可以通过这种方式遍历)。下面的代码演示了针对有合并单元格的表格和没有合并单元格的表格采用不同的方式遍历所有单元格:

Sub 遍历word中表格单元格示例()
    Dim aCell As Cell
    Dim aTable As Table
    Dim i, j, iCols, iRows As Integer
    For Each aTable In ActiveDocument.Tables
        With aTable
            ' 表格中不存在合并单元格,采用行列索引的方式遍历。
            ' 存在合并单元格的表格用这种方式遍历将发生运行时错误。
            If .Uniform Then
                iCols = aTable.Columns.Count
                iRows = aTable.Rows.Count
                For i = 1 To iRows
                    For j = 1 To iCols
                      MsgBox "uniform:" & vbCrLf & Replace(.Cell(i, j).Range.Text, Chr(13) & Chr(7), "")
                    Next
                Next
            Else ' 表格中存在合并单元格, 采用For Each方式遍历。不存在合并单元格的表格同样可用这种方式遍历。
                For Each aCell In .Range.Cells
                   MsgBox Replace(aCell.Range.Text, Chr(13) & Chr(7), "")
                Next
            End If
        End With
    Next
End Sub

下面来个应用实例:遍历表格中的各单元格,如单元格中的内容是数字,则保留两位小数,否则维持原状不变:

Sub 将word表格中的数字单元格保留两位小数()
    Dim aCell As Cell
    Dim aTable As Table
    Dim sText As String
    For Each aTable In ActiveDocument.Tables
        With aTable
            For Each aCell In .Range.Cells
                With aCell
                    ' 记录单元格文本,需去掉最后的回车和响铃,否则不能得到正确结果
                    sText = Replace(.Range.Text, Chr(13) & Chr(7), "")
                    If IsNumeric(sText) Then
                        ' 单元格中的内容是数字,则设置为保留两位小数格式
                        sText = VBA.Format(sText, "##0.00")
                        ' 重写单元格内容
                        .Range.Text = sText
                    End If
                End With
            Next
        End With
    Next
End Sub

在涉及表格的Word VBA问题中,有一个难题是判断表格的单元格是否是合并单元格。Word中的表格不象Excel中的表格那样有一个MergCells属性直接判定单元格是否是合并单元格,但Word表格具有一个特性:

选择单元格所在行,该单元格在纵向没有合并多行时,Selection.Rows.Count的值为1,该单元格在纵向合并了多行时,Selection.Rows.Count的值为合并的行数。同样,选择单元格所在列,该单元格在横向没有合并多列时,Selection.Columns.Count的值为1,该单元格在横向合并了多列时,Selection.Columns.Count的值为合并的列数。

因此,在Word中要判断单元格是不是合并单元格尽管比较复杂,还是可以利用上述特性得到如下算法思路:

选定当前单元格所在行,如果选区的总行数大于1,那么当前单元格肯定在纵向合并了多行。如果总行数不大于1,再选定当前单元格所在列,如果选区的总列数大于1,那么当前单元格在横向合并了多列。如果选定当前单元格所在行和所在列时选区的总行数和总列数都是1,则当前单元格不是合并单元格。实现代码如下:

Sub 判断表格单元格是不是合并单元格()
    Dim aCell As cell
    Dim aTable As Table
    Dim iRows As Integer
    For Each aTable In ActiveDocument.Tables
        With aTable
            For Each aCell In .Range.Cells
                With aCell
                    .Select
                    ' 先选择单元格所在行
                    Selection.SelectRow
                    ' 如果选区总行数大于1,则该单元格在纵向合并了多行
                    If Selection.Rows.Count > 1 Then
                        iRows = Selection.Rows.Count
                        ' 再选择该单元格所在列,可以得到该单元格横向合并的列数
                        .Select
                        Selection.SelectColumn
                        MsgBox "RowIndex=" & .RowIndex & vbCrLf & "ColumnIndex=" & _
                                .ColumnIndex & vbCrLf & "此单元格是合并单元格,合并行数为:" & iRows & _
                                ";合并列数为:" & Selection.Columns.Count
                                
                    Else ' 如果选区总行数为1,则该单元格在纵向没有合并
                        .Select
                        ' 再选择单元格所在列
                        Selection.SelectColumn
                        ' 如果选区总列数大于1,则该单元格在横向合并了多列
                        If Selection.Columns.Count > 1 Then
                            MsgBox "RowIndex=" & .RowIndex & vbCrLf & "ColumnIndex=" & _
                                .ColumnIndex & vbCrLf & "此单元格是合并单元格,合并行数为1;" & _
                                "合并列数为:" & Selection.Columns.Count
                        Else ' 如果选区总列数为1,则该单元格在横向也没有合并,该单元格不是合并单元格
                            MsgBox "RowIndex=" & .RowIndex & vbCrLf & "ColumnIndex=" & _
                                .ColumnIndex & vbCrLf & "此单元格不是合并单元格"
                        End If
                    End If
                End With
            Next
        End With
    Next
End Sub

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
第1章Range(单元格)对象8 技巧1单元格的引用方法8 1-1使用Range属性8 1-2使用Cells属性9 1-3使用快捷记号9 1-4使用Offset属性10 1-5使用Resize属性11 1-6使用Union方法12 1-7使用UsedRange属性12 1-8使用CurrentRegion属性13 技巧2选定单元格区域的方法13 2-1使用Select方法13 2-2使用Activate方法14 2-3使用Goto方法15 技巧3获得指定行、列的最后一个非空单元格15 技巧4定位单元格18 技巧5查找单元格19 5-1使用Find方法19 5-2使用Like运算符23 技巧6替换单元格内字符串24 技巧7复制单元格区域25 技巧8仅复制数值到另一区域28 8-1使用选择性粘贴28 8-2直接赋值的方法29 技巧9单元格自动进入编辑状态30 技巧10禁用单元格拖放功能30 技巧11单元格格式操作31 11-1单元格字体格式设置31 11-2设置单元格内部格式33 11-3为单元格区域添加边框34 11-4灵活设置单元格的行高列宽36 技巧12单元格的数据有效性37 12-1在单元格建立数据有效性37 12-2判断单元格是否存在数据有效性39 12-3动态的数据有效性39 12-4自动展开数据有效性下拉列表41 技巧13单元格的公式42 13-1在单元格写入公式42 13-2检查单元格是否含有公式43 13-3判断单元格公式是否存在错误44 13-4取得单元格公式的引用单元格45 13-5将单元格的公式转换为数值46 技巧14单元格的批注47 14-1判断单元格是否存在批注47 14-2为单元格添加批注48 14-3删除单元格的批注49 技巧15合并单元格操作50 15-1判断单元格区域是否存在合并单元格50 15-2合并单元格时连接每个单元格的文本51 15-3合并内容相同的连续单元格52 15-4取消合并单元格时在每个单元格保留内容54 技巧16高亮显示单元格区域55 技巧17双击被保护单元格时不显示提示消息框56 技巧18重新计算工作表指定区域58 技巧19录入数据后单元格自动保护58 技巧20工作表事件Target参数的使用方法60 20-1使用单元格的Address 属性60 20-2使用Column属性和Row属性61 20-3使用Intersect方法61 第2章Worksheet(工作表)对象63 技巧21引用工作表的方式63 21-1使用工作表的名称63 21-2使用工作表的索引号63 21-3使用工作表的代码名称64 21-4使用ActiveSheet属性引用活动工作表64 技巧22选择工作表的方法65 技巧23遍历工作表的方法66 23-1使用For...Next 语句66 23-2使用For Each...Next 语句68 技巧24在工作表上下翻页69 技巧25工作表的添加与删除70 技巧26禁止删除指定工作表74 技巧27自动建立工作表目录76 技巧28工作表的深度隐藏78 技巧29防止更改工作表的名称80 技巧30工作表一次插入多行81 技巧31删除工作表的空行82 技巧32删除工作表的重复行84 技巧33定位删除特定内容所在的行86 技巧34判断是否选整行87 技巧35限制工作表的滚动区域88 技巧36复制自动筛选后的数据区域89 技巧37使用高级筛选获得不重复记录91 技巧38工作表的保护与解除保护92 技巧39奇偶页打印95 第3章Wordbook(工作簿)对象97 技巧40工作簿的引用方法97 40-1使用工作簿的名称97 40-2使用工作簿的索引号97 40-3使用ThisWorkbook98 40-4使用ActiveWorkbook99 技巧41新建工作簿文件99 技巧42打开指定的工作簿101 技巧43判断指定工作簿是否打开104 43-1遍历Workbooks集合方法104 43-2错误处理方法104 技巧44禁用宏则关闭工作簿105 技巧45关闭工作簿不显示保存对话框109 45-1使用Close方法关闭工作簿109 45-2单击工作簿关闭按钮关闭工作簿111 技巧46禁用工作簿的关闭按钮111 技巧47保存工作簿的方法113 47-1使用Save方法113 47-2直接保存为另一文件名113 47-3保存工作簿副本113 技巧48保存指定工作表为工作簿文件114 技巧49打印预览时不触发事件116 技巧50设置工作簿文档属性信息118 技巧51不打开工作簿取得其他工作簿数据119 51-1使用公式119 51-2使用GetObject函数120 51-3隐藏Application对象121 51-4使用ExecuteExcel4Macro

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yivifu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值