很长一段时间没处理word合并单元格,又忘记了采取忽略错误的方式测试出相应单元格的行列坐标这种方式。真是浪费时间。以后再也不想为此在深夜熬命。

今晚算是和它杠上了,很想弄清楚合并单元格之后行列坐标重新分配的机制。于是做了一点测试。插入一个11行10列的表格,然后合并其中的部分,利用代码插入新的坐标。

转载请说明出处。

Sub NewPos()
Dim tb As Table, cel As Cell
Dim doc As Document
Set doc = ThisDocument
Set tb = doc.Tables(1)
For i = 1 To 10
For j = 1 To 10
On Error Resume Next
Set cel = tb.Cell(i, j)
On Error GoTo 0
If Not cel Is Nothing Then
Debug.Print Len(cel.Range.Text); " "; i; " "; j
If Len(cel.Range.Text) > 2 Then
cel.Range.Text = Replace(cel.Range.Text, vbCr, "") & ";" & "(" & i & "," & j & ")"
Else
cel.Range.Text = "(" & i & "," & j & ")"
End If End If
Set cel = Nothing
Next j
Next i
Set doc = Nothing
Set cel = Nothing
Set tb = Nothing
End Sub

  

新坐标分配总结如下:

0、先行后列

1、行坐标的分配:从上向下逐一递增,如果遇到连续几个整行水平合并,则视为一行。如(9,1)实为原始的第9和第10行合并。

2、列坐标的分配:从左向右逐一递增分配,如果遇到垂直合并单元格则需要分为两种情况:

第一种情况,该行正好是垂直合并单元格所在的首行,则列号依然遵循从左至右逐一递增分配,如(2,3)到(2,4),(5,5)到(5,6)

第二种情况较为复杂,如果该行并非垂直合并单元格所在的首行,则列号会出现缺失。

(1)在一行中间出现这种情况:(3,3)到(3,5)缺失了(3,4);

(2)在一行的行末遇到这种情况:(7,4)成为第7行最后一个列坐标;

(3)如在一行的行首遇到这种情况:第二行缺失了(2,1)(2,2)第三行缺失了(3,1)

通过正则表达式则提取到以下结果

Public Sub RegGet()
Dim Regex As Object
Dim Mh As Object
Set Regex = CreateObject("VBScript.RegExp")
With Regex
.Global = True
.MultiLine = True
.Pattern = "(\(\d+\,\d\))\s\x07"
End With
txt = ThisDocument.Content.Text
Set Mh = Regex.Execute(txt)
n = 0
For Each m In Mh
n = n + 1
Debug.Print n; " > "; m.submatches(0)
Next
Set Regex = Nothing
End Sub 1 > (1,1)
2 > (1,2)
3 > (1,3)
4 > (1,4)
5 > (1,5)
6 > (2,3)
7 > (2,4)
8 > (2,5)
9 > (2,6)
10 > (2,7)
11 > (2,8)
12 > (3,2)
13 > (3,3)
14 > (3,5)
15 > (3,7)
16 > (3,8)
17 > (4,3)
18 > (4,5)
19 > (4,7)
20 > (5,1)
21 > (5,3)
22 > (5,5)
23 > (5,6)
24 > (5,7)
25 > (5,8)
26 > (6,1)
27 > (6,3)
28 > (6,6)
29 > (7,1)
30 > (7,2)
31 > (7,3)
32 > (7,4)
33 > (8,1)
34 > (8,2)
35 > (8,3)
36 > (8,4)
37 > (8,5)
38 > (8,6)
39 > (8,8)
40 > (8,9)
41 > (9,1)
42 > (10,1)

  因此也可以采用正则的办法提取单元格的内容

Public Sub RegGet()
Dim Regex As Object
Dim Mh As Object
Set Regex = CreateObject("VBScript.RegExp")
With Regex
.Global = True
.MultiLine = False '设为单行模式,^元义符代表全文的开始,{n}通过重复括号内的子表达式n次的方式提取第n个单元格的内容
.Pattern = "^(.*?\s\x07){2}"
End With
txt = ThisDocument.Content.Text
Set Mh = Regex.Execute(txt)
n = 0
For Each m In Mh
n = n + 1
Debug.Print n; " >>>>>>>>>>> "; m.Value
Debug.Print "提取内容:"; m.submatches(0)
Next
Set Regex = Nothing
End Sub

  

所有的问题产生的根源都是对WORD 对象模型不熟悉
原来可以如此循环所有单元格 Sub RangeCells()
For Each cel In ThisDocument.Tables(1).Range.Cells
Debug.Print cel.Range.Text
Next cel
End Sub

  

20190407 Word合并单元格的更多相关文章

  1. Java删除word合并单元格时的重复值

    Spire.Doc提供了Table.applyVerticalMerge()方法来垂直合并word文档里面的表格单元格,Table.applyHorizontalMerge()方法来水平合并表格单元格 ...

  2. java使用freemarker模板导出word(带有合并单元格)文档

    来自:https://blog.csdn.net/qq_33195578/article/details/73790283 前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并 ...

  3. 使用POI创建word表格合并单元格兼容wps

    poi创建word表格合并单元格代码如下: /** * @Description: 跨列合并 */ public void mergeCellsHorizontal(XWPFTable table, ...

  4. EXCEL合并单元格快捷键暨WORD+EXCEL自定义快捷键

    最近在写测试用例时,用到合并单元格,只能点,没有快捷键,觉得很蛋疼,上网找了一下,没有直接设置其对应快捷键的方法,但有种曲线救国的方法: 一.右击功能区,选择‘自定义快速访问工具栏’   二.可以在这 ...

  5. 关于.net Microsoft.Office.Interop.Word组建操作word的问题,如何控制word表格单元格内部段落的样式。

    控制word表格单元格内部文字样式.我要将数据导出到word当中,对于word表格一个单元格中的一段文字,要设置不同的样式,比如第一行文字作为标题要居中,加粗,第二行为正常的正文. 代码如下 publ ...

  6. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  7. jquery操作表格 合并单元格

    jquery操作table,合并单元格,合并相同的行 合并的方法 $("#tableid").mergeCell({ cols:[X,X] ///参数为要合并的列}) /** * ...

  8. NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

    我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...

  9. poi获取合并单元格内的第一行第一列的值

    当读取如图所示的excel时,显示为第1行 第1列 的内容是:合并单元格 其它在合并单元格区域内的单元格不显示 示例代码如下: import java.io.FileInputStream; impo ...

随机推荐

  1. 1231: ykc买零食

    1231: ykc买零食时间限制: 1 Sec  内存限制: 128 MB 题目描述 ykc的班级准备举行班级聚会,而身为生活委员的ykc要为此准备好零食,这天,ykc来到了学校的新起点超市,在转了3 ...

  2. windows10的普通用户使用Task Scheduler的问题

    在Create Task 窗口的General选项卡中,在Security options 里有几个单选项,分别是 Run only when user is logged on ,Run wheth ...

  3. zw-clay字王胶泥体系列

    zw-clay字王胶泥体系列 zw-clay字王胶泥体系列,2018新版,也是在2012版本的基础上升级的. 字王胶泥体系列的idea,源自黏土动画电影的制作模式.同样,字王胶泥体系列,也非常适合于动 ...

  4. zimbra填坑记录

    邮件服务器上架,问题记录. 1.DNS解析设置,zimbra收发邮件均使用统一域名,mail.xxxx.com.cn,因此在做SMTP,POP,MX记录时均应指向此域名. 2.实际上架内部网络和安装所 ...

  5. App 基本图片配置(I)

    UITabBarController 的底部Item图片设置 分为三种: imageName@1x.png 图片像素(30 * 30) imageName@2x.png 图片像素(60 * 60) i ...

  6. MQ知识点汇总

    1. MQ是什么 2. MQ能做什么 3. 消息模式 4. 使用MQ的时候需要注意什么 5. 常用MQ 6. MQ的不足 7. 什么时候不适用MQ 8. MQ的组成 9. MQ的关注点 1. MQ是什 ...

  7. python3 短网址和数字的相互转换的代码

    下面内容是关于python3 短网址和数字的相互转换的内容. import mathimport decimal def convert_to_code(num): """ ...

  8. Git抽取版本之间的差异,打包解压

    patch.sh文件代码 #!/bin/bash MY_SAVEIFS=$IFS #IFS=$(echo -en "\n\b") IFS=$'\n' build_dir=" ...

  9. 二分法bug修复

    public class Main { public static void main(String[] args) { int[] arr = {1,2,3,4,5,6,7,8,9,10}; int ...

  10. 用Python实现一个词频统计(词云+图)

    第一步:首先需要安装工具python 第二步:在电脑cmd后台下载安装如下工具: (有一些是安装好python电脑自带有哦) 有一些会出现一种情况就是安装不了词云展示库 有下面解决方法,需看请复制链接 ...