VBA多工作表合并触发Type mismatch错误,请求代码排查
解决VBA「Type mismatch」错误并修复合并工作表代码
嘿,我来帮你排查这个问题!触发「Type mismatch」错误的核心原因是代码里的Worksheets(ws)——ws本身已经是一个Worksheet对象了,而Worksheets()集合只接受字符串(工作表名称)或数字(索引位置)作为参数,直接传对象就会导致类型不匹配。
除此之外,代码里还有几个潜在问题(比如整数溢出、插入行范围计算错误),我把完整的修正版代码放在下面,再逐一解释修改点:
Public Sub Conc() Dim ws As Worksheet Dim LR1 As Long ' 改用Long避免行数超过32767时溢出 Dim LR2 As Long Dim first As Long LR1 = 0 first = 1 ' 在当前工作簿末尾添加合并工作表 With ThisWorkbook .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = "Conc" End With ' 遍历当前工作簿的所有工作表 For Each ws In ThisWorkbook.Worksheets If ws.Name <> "Conc" Then ' 获取合并表的下一个空行(B列) LR1 = ThisWorkbook.Sheets("Conc").Cells(Rows.Count, 2).End(xlUp).Row + 1 ' 获取当前工作表的有效行数(B列) LR2 = ws.Cells(Rows.Count, 2).End(xlUp).Row ' 直接使用ws对象操作,避免类型不匹配 ws.Rows(first & ":" & LR2).Cut ' 插入的行范围是从LR1开始,共LR2行,所以结束行是LR1 + LR2 - 1 ThisWorkbook.Sheets("Conc").Rows(LR1 & ":" & LR1 + LR2 - 1).Insert End If Next ws End Sub
关键修改说明:
- 修复Type mismatch错误:把
Worksheets(ws)改成直接使用ws对象,因为ws已经是遍历得到的Worksheet实例,不需要再通过Worksheets集合去引用。 - 变量类型替换:将
Integer换成Long,Excel工作表最大行数是1048576,远超过Integer的最大值32767,用Long可以避免溢出错误。 - 修正插入行范围:原来的
LR3 = LR1 + LR2会导致插入的行多一行,正确的结束行应该是LR1 + LR2 - 1,这样刚好插入和原工作表行数一致的行。 - 统一使用ThisWorkbook:避免
ActiveWorkbook可能带来的歧义(比如不小心激活了其他工作簿),确保所有操作都在当前代码所属的工作簿中执行。
如果你的工作表有表头,不想重复粘贴表头的话,可以把first变量改成2,这样从第2行开始剪切数据(跳过表头),不过这需要根据你的实际需求调整哦。
内容的提问来源于stack exchange,提问作者Stloax
相关产品推荐
相关产品推荐

