
本文于2023年9月15日首发于本人同名其他平台,更多文章案例请搜索关注!
内容提要
代码调试的基本方法
大家好,我是冷水泡茶,今天在论坛上看到一个求助:
如何将同一文件夹内多个工作簿多个工作表合并到一个工作表内?
这个功能我们分享过啊:【Excel VBA 文件合并神器】,正准备把它发到论坛上,转念一想,还是测试一下吧。
他要求合并多个工作表,我记得我们的代码中是按照合并多个工作表写的,但是没有测试,当时测试的时候用的都是只有一个工作表的文件。所以,还是先测试一下吧,等验证没有问题再发。
于是就搞了几个多工作表的Excel文件,这一测试就有问题了。一会报错,一会是合并不完整。
赶紧打开CombineExcel过程检查代码,看了几遍,感觉没有问题啊:
If FileExtn = ".xlsx" Or FileExtn = ".xls" Then Set wb = Workbooks.Open(file.path) For Each ws In wb.Sheets If t = 0 Then ws.UsedRange.Copy CombineWs.Cells(1, 1) Else lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row lastCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column If blnCkb Then Set rng = ws.Range(Cells(2, 1), Cells(lastRow, lastCol)) Else Set rng = ws.Range(Cells(1, 1), Cells(lastRow, lastCol)) End If rng.Copy CombineWs.Cells(CombineWs.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) End If t = t + 1 Next wb.Close savechanges:=FalseEnd If
当然,运行结果不对,那肯定是有问题的,经过一番折腾,终于找到问题:
第4~5行,这里是复制第一张表,但只复制了一个表头。
第6~15行,复制其他工作表,内容缺失,是没有把要复制的工作表激活。
后来把代码修改如下:
If FileExtn = ".xlsx" Or FileExtn = ".xls" Then Set wb = Workbooks.Open(file.path) wb.Activate For Each ws In wb.Sheets ws.Activate lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row lastCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column If t = 0 Then Set rng = ws.Range(Cells(1, 1), Cells(lastRow, lastCol)) rng.Copy CombineWs.Cells(CombineWs.Cells(Rows.Count, 1).End(xlUp).Row, 1) Else If blnCkb Then Set rng = ws.Range(Cells(2, 1), Cells(lastRow, lastCol)) Else Set rng = ws.Range(Cells(1, 1), Cells(lastRow, lastCol)) End If rng.Copy CombineWs.Cells(CombineWs.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) End If t = t + 1 Next wb.Close savechanges:=FalseEnd If
第3行,激活待合并工作簿。工作簿打开应该就是激活的,不管它,多激活一下不防事。
第5行,激活待合并工作表。
第8~11行,复制第一张工作表,从表格第一行开始复制。
第12~17行,复制第二张及以后的工作表,根据选项“明细表数据有标题”来确定从表格第一行还是第二行开始复制。
然后运行正常。
这里向大家说声抱歉!
后来,把用户窗体上的按钮布局顺便稍作修改:

主要原因是“每个文件另起一页”只针对WORD文档,但在选择其他文件类型的时候,它也是勾选的,有点容易让人产生误解。就想把它给搞一下,但怎么弄好呢?本来是想,在选择其他按钮的时候,把它取消勾选。后来决定把它们分类放到框架里,这样就对应起来了,应该不会产生误解了吧。
但是,问题又来了。选项按钮在不同的框架里是相互独立的,都可以选中,那又该怎么办呢?不想放弃这个框架,看上去还是比较顺眼的。那就再写代码吧,给每个选项按钮的Click事件添加代码,使得其他选项按钮的值都为FALSE:
Private Sub OptExcel_Click() Me.OptPDF = False Me.OptPictureToPDF = False Me.OptWord = FalseEnd SubPrivate Sub OptWord_Click() Me.OptPDF = False Me.OptExcel = False Me.OptPictureToPDF = FalseEnd SubPrivate Sub OptPdf_Click() Me.OptWord = False Me.OptExcel = FalseEnd SubPrivate Sub OptPictureToPdf_Click() Me.OptWord = False Me.OptExcel = FalseEnd Sub
今天是周末,祝大家周末愉快!
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留个言、分享一下呗!感谢!