我需要实现的是,筛选表中I列等于0的数据,并读取出来。

截止至筛选步骤,不会有任何问题,表格中也会成功筛选数据。但是到第四步【读取筛选数据】时,则会出现以下报错。
报错提示:(-2147352567, '发生意外。', (0, 'Microsoft Excel', '无法对合并单元格执行此操作。', 'xlmain11.chm', 0, -2146827284), None)
根据报错提示,可以关注到无法对合并单元格执行此操作这一个问题,所以首先需要从合并单元格这一方面入手。
排查过程:
从第3行开始,目标sheet不存在合并单元格,只有1、2行有合并单元格。
对比表格的另一个类似结构sheet页,同样是1、2行有合并单元格,但该sheet页却能正常读取筛选数据。
将目标sheet页的全部格式取消合并单元格也能正常读取筛选数据。
目标sheet格式

图中红框中的都是合并单元格。合并单元格范围为:
A1:D2
E1:G2
H1:J2
对照sheet格式

从以上两图可以看出,格式大差不差,都存在合并单元格和隐藏列。根据上述的排查过程也能确认,确实是某处合并单元格的问题。那问题究竟出现在哪呢?
从相似中找不同,最后发现其实就是隐藏列的问题
在目标sheet当中,有一个合并单元格(JZTD填写)的范围是A1:D2,但是A~C列被隐藏了,只有D列是正常显示。也就是说原本的合并单元格,只显示了一部分。
拆分单元格:将原本A1:D2的合并单元格拆分为两个合并单元格,范围分别是A1:C2和D1:D2。
对Excel表进行筛选时,即使不从第一行开始筛选,Excel仍然需要完整的表头信息来创建筛选下拉框
(1) 确定筛选区域:通常是从表头行到最后一行
(2) 识别每一列:基于表头行的单元格结构
(3) 创建筛选下拉框:为每一列的顶部单元格添加下拉箭头
# 原始状态
屏幕显示:
| A列 | B列 | C列 | D列 |
| (隐藏) | (隐藏) | (隐藏) | [合并单元格残余部分] |
实际发生了什么:
1. A-C列虽然在视觉上隐藏了,但在Excel的内部结构中仍然存在
2. 合并单元格 A1:D2 在逻辑上仍然覆盖A、B、C、D四列
3. 但在视觉上,合并单元格只显示在D列区域
4. Excel无法准确地将筛选箭头放在D列上方,因为:
- 逻辑上:合并单元格覆盖4列
- 视觉上:只看到1列的区域
- 造成逻辑与视觉的冲突
------------------------------------------------------------------
# 当A-C列被取消隐藏后
屏幕显示:
| A列 | B列 | C列 | D列 |
| [合并单元格 A1:D2 跨越所有列] |
| | | | |
| 数据 | 数据 | 数据 | 数据 |
筛选箭头位置:
- Excel 知道合并单元格在物理上覆盖了A、B、C、D四列
- 但每个筛选箭头需要放在对应列的上方
- 由于列可见,Excel可以准确地在合并单元格上标记每个列的位置
每个显示列都需要独立的表头单元格(可以是合并的,但不能跨越其他列)
合并单元格不应该跨越隐藏列和显示列