delphi dbgrideh 遍历每一个单元格_VBA实践+处理合并单元格(无法访问单独的列或行)...

d6ee07bc016ed0ef8097abdebe30f4eb.png

VBA实践+处理合并单元格(无法访问单独的列或行)

在word中使用VBA处理表格时,如果表格存在合并单元格,经常会碰到“无法访问单独的行或列”或者“不能选择整行整列”的错误,导致程序无法运行。具有合并单元格的表格放到excel中处理也会比较麻烦。

使用Selection对象的相关方法和属性来处理这样的表格,可以避免这类错误。相关的方法和属性包括SelectCell、SelectRow、SelectColumn、Tables、Range等。

下面是一个处理案例。如下图是一个表格的表头,有两处合并单元格,分别是“项目”,纵向合并;“住院时间”,横向合并。这样的表格在文档中有很多,而且列的数量是不固定的。

f7a5fb59c79cebba3094f62ad3264814.png

希望把表格的表头拆解为如下图所示。去掉“住院时间”的合并单元格,把“项目”变成非合并单元格。

339e6a8d7e884c8493f6986f11f2d813.png

程序设计的思路

对于每一个表格,“宣教”单元格所在行的上方就是表头,通过Find方法查找到“宣教”,在此行上方增加一个空行,增加的空行与此行有相同的列数。把空行上方相接的每一个单元格的文本赋值给空行的相应单元格,然后删除表头。代码如下。

Sub 表头合并单元格拆解()
'拆解表头处的合并单元格,以避免出现“因为存在纵向或横向合并的列或行,不能选择整行整列”
Dim i As Integer, orow As Cells, ocell As Cell
Selection.HomeKey wdStory '光标置于文首

'设置查找参数
Selection.Find.ClearFormatting '清除查找处格式
Selection.Find.Replacement.ClearFormatting '清除替换处格式
With Selection.Find
    .Text = "宣教" '“宣教”前的两行为表头行,有合并单元格存在
    .Style = "正文" '因为表格中的内容的段落样式都为正文
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop '查找到文档结尾时停止搜索
    .MatchWildcards = True
    .Format = True
End With

'开始查找,查找不到“宣教”时,循环处理停止
Do While Selection.Find.Execute '
    If Selection.Information(wdWithInTable) And Len(Selection.Paragraphs(1).Range) < 5 Then '当“宣教”在表格中且所在段落字符数小于5(含两个隐含字符)时处理
        Selection.InsertRowsAbove 1 '在“宣教”行上方增加一空行
        Set orow = Selection.Cells
 
        '循环为增加的空行的每一个单元格取得其上一个单元格的内容
        For Each ocell In orow
            ocell.Select '选中一个增加的空行的单元格
            Selection.MoveUp unit:=wdLine, Count:=1, Extend:=wdExtend '向上扩展一行,即向上扩展一个单元格
            ocell.Range = Left(Selection.Range.Cells(1).Range, Len(Selection.Range.Cells(1).Range) - 2) '取得上一个单元格的内容
        Next
        '删除表头行
        Selection.Tables(1).Range.Cells(1).Select
        Selection.SelectRow
        Selection.Rows.Delete
 
 
        i = i + 1 '记录处理表格数量
    End If
    '把光标移动到正处理的表格的结尾,以便查找一下“宣教”
    Selection.Tables(1).Select
    Selection.Collapse wdCollapseEnd
Loop
MsgBox "共处理" & i & "个表格"
End Sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值