向豆包对话可以死磕的,以前问问题我只是根据第一条给出的答案使用。AI还有个优点,不会烦你,只要有问题就接着问,一直问到解决好问题。小编对豆包的连环提问,最终解决了批量删表头页面的问题。
1、豆包对话过程
开始问题1:
excel表格中隔几行就会出相同(有多行)的表头,如何只保留一个表头,中间的表头都去掉,在wps里怎么快速实现,用VBA实现。
出现错误接着问2:
If ws.Range(ws.Cells(i, 1), ws.Cells(i + headerRow - 1, ws.Cells(1, ws.Columns.Count).End(xlToRight).Column)).Value = headerRange.Value Then这行代码显示有错误,表头有5行
还是不行接问3:
设置表头区域的代码是否要根据表的情况进行修改
问4:
表头如果有些单元格是合并的,有没有影响,是否要改代码
问5:
执行完还是没有删除表头,代码中设置表头区域注释下的代码是否要修改
问6:
表头是从一行一列开始的,表头范围是1-5行,A-L列,表头中第四行与第五行中有些单元格是合并的
问7:
还是不行,宏运行没有报错,运行的过程跟结果在哪里看
问8:
不知道你理解完整我的需求不,目前第一个表头范围(A1,L5),第二个表头(A28,L32)...,我需要的就是只保留第一个表头,能确定表头范围内的内容一致,表头范围内有合并单元格,现在需要完整的可执行的VBA代码
问9:
只删除了一个,我需要删除与表头一样的,且我不需要找规律,适应第二个表头不是A28:L32范围的
。。。
问100:
当前 i 的值: 1 headerRowCount 的值: 0 i + headerRowCount - 1 的值: 0
通过一些列的问题,最终获得一段满意的vba代码:
Sub RemoveDuplicateHeadersAndPageNumbers()Dim ws As WorksheetDim lastRow As LongDim headerRowCount As LongDim headerRange As RangeDim checkRange As RangeDim i As LongDim isSame As BooleanDim cell As RangeDim pageNumberRows As Long' 设置要操作的工作表,可根据实际情况修改Set ws = ThisWorkbook.Sheets("Sheet1")' 获取数据区域的最后一行lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row' 表头行数headerRowCount = 5' 设置第一个表头区域Set headerRange = ws.Range("A1:L5")' 页码所占行数pageNumberRows = 1' 先删除重复表头i = headerRowCount + 1Do While i <= lastRow - headerRowCount + 1' 输出调试信息,查看变量值Debug.Print "当前 i 的值: " & iDebug.Print "headerRowCount 的值: " & headerRowCountDebug.Print "i + headerRowCount - 1 的值: " & (i + headerRowCount - 1)Set checkRange = ws.Range(ws.Cells(i, 1), ws.Cells(i + headerRowCount - 1, 12)) ' 12 代表 L 列isSame = True' 逐单元格比较For Each cell In headerRangeDim correspondingCell As RangeSet correspondingCell = checkRange.Cells(cell.Row - headerRange.Row + 1, cell.Column)' 处理合并单元格Dim mergedValue1 As VariantDim mergedValue2 As VariantIf cell.MergeCells ThenmergedValue1 = Trim(cell.MergeArea.Cells(1, 1).Value)ElsemergedValue1 = Trim(cell.Value)End IfIf correspondingCell.MergeCells ThenmergedValue2 = Trim(correspondingCell.MergeArea.Cells(1, 1).Value)ElsemergedValue2 = Trim(correspondingCell.Value)End If' 将值转换为文本格式进行比较If CStr(mergedValue1) <> CStr(mergedValue2) ThenisSame = FalseExit ForEnd IfNext cell' 如果相同则删除对应的行If isSame Thenws.Rows(i & ":" & (i + headerRowCount - 1)).Delete' 因为删除了行,所以更新最后一行lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).RowElse' 如果不相同,移动到下一行i = i + 1End IfLoop' 重新获取最后一行lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row' 再删除页码行和空白行i = lastRowDo While i > headerRowCount' 检查是否为页码行Dim isPageNumber As BooleanisPageNumber = TrueFor j = 0 To pageNumberRows - 1Dim currentCell As RangeSet currentCell = ws.Cells(i - j, 1)Dim rowValue As StringrowValue = Trim(currentCell.MergeArea.Cells(1, 1).Text)' 检查是否为合并单元格If Not currentCell.MergeCells ThenisPageNumber = FalseDebug.Print "第 " & (i - j) & " 行:不是合并单元格"Exit ForEnd If' 检查内容是否为纯数字文本If Not IsNumeric(rowValue) Or Not IsAllDigits(rowValue) ThenisPageNumber = FalseDebug.Print "第 " & (i - j) & " 行:内容不是纯数字文本,内容为 " & rowValueExit ForEnd If' 检查内容是否居中If currentCell.HorizontalAlignment <> xlCenter ThenisPageNumber = FalseDebug.Print "第 " & (i - j) & " 行:内容未居中,对齐方式为 " & currentCell.HorizontalAlignmentExit ForEnd IfNext jIf isPageNumber Then' 删除页码行ws.Rows(i - pageNumberRows + 1 & ":" & i).Delete' 因为删除了行,所以更新最后一行lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Rowi = i - pageNumberRowsDebug.Print "已删除第 " & (i - pageNumberRows + 1) & " 行到第 " & i & " 行的页码行"Elsei = i - 1End IfLoop
End Sub
Function IsAllDigits(str As String) As BooleanDim i As LongFor i = 1 To Len(str)If Not Mid(str, i, 1) Like "[0-9]" ThenIsAllDigits = FalseExit FunctionEnd IfNext iIsAllDigits = True
End Function
2、wps测试
2.1 首先得安装wps宏,wps.vba.exe,文末分享:
2.2 打开我们预算文件表格,那种直接可以打印的预算excel。找到开发工具——点击录制宏——停止——点击vb宏。
2.3 点击宏编辑进入vba编辑
2.4 复制豆包生成的代码,修改对应表格名称,根据表头的情况对代码进行修改(有注释,代码好理解)。
3、视频教程与资料分享
3.1 视频操作流程:
WPS+VBA删除表格中多余的表头、页码、空白页
3.2 素材下载(含wps.vba.exe),公号回复:vba删表头。