求助:编写VBA宏统计各工作表首列字符总数写入主表
统计各工作表首列字符总数并写入MAIN表的VBA解决方案
原代码的问题
你的代码存在几个关键问题,导致无法正常运行:
- 用
Sheets当变量名,和Excel内置的工作表集合对象重名,容易引发冲突 - 内层循环
Rowref = 1 To 12完全多余,每个工作表只需要对应MAIN表的一行,外层遍历工作表时直接递增行号即可 Range("B2:B100000").Value是多单元格区域,不能直接用Len函数获取字符数,得逐个单元格处理- 最后一行仅指定了单元格位置,未将计算好的
totalchar赋值给它,等于没有写入结果 totalchar未初始化,每次循环会累加之前的结果,导致统计数值错误
修正后的代码
针对指定工作表的版本(对应你原代码里的1-12工作表)
Sub CountFirstColumnChars() Dim targetSheets As Variant Dim wsName As Variant Dim ws As Worksheet Dim totalChar As Long Dim rowIndex As Long ' 列出要统计的工作表名称 targetSheets = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12") rowIndex = 1 ' 从MAIN表的L1开始写入 For Each wsName In targetSheets Set ws = ThisWorkbook.Worksheets(wsName) totalChar = 0 ' 每次统计新工作表前重置总数 ' 遍历首列(A列)的所有非空单元格,累加字符数 For Each cell In ws.Range("A1", ws.Cells(ws.Rows.Count, "A").End(xlUp)) totalChar = totalChar + Len(cell.Value) Next cell ' 将结果写入MAIN表对应行的L列 ThisWorkbook.Worksheets("MAIN").Range("L" & rowIndex).Value = totalChar rowIndex = rowIndex + 1 ' 切换到下一行 Next wsName End Sub
通用版本(遍历所有工作表,自动跳过MAIN表)
如果后续工作表数量有变化,用这个版本更省心:
Sub CountAllSheetsFirstColumnChars() Dim ws As Worksheet Dim totalChar As Long Dim rowIndex As Long rowIndex = 1 ' 从MAIN表的L1开始写入 For Each ws In ThisWorkbook.Worksheets If ws.Name <> "MAIN" Then ' 跳过MAIN表本身 totalChar = 0 ' 重置字符总数 ' 遍历首列非空单元格 For Each cell In ws.Range("A1", ws.Cells(ws.Rows.Count, "A").End(xlUp)) totalChar = totalChar + Len(cell.Value) Next cell ' 写入结果到MAIN表L列 ThisWorkbook.Worksheets("MAIN").Range("L" & rowIndex).Value = totalChar rowIndex = rowIndex + 1 End If Next ws End Sub
注意事项
- 如果你说的“首列”是指B列(原代码里用了B列),把代码中的
"A"替换成"B"即可 - 用
ws.Cells(ws.Rows.Count, "A").End(xlUp)可以自动定位到首列最后一个非空单元格,避免遍历大量空单元格,提升运行速度 - 变量
totalChar用Long类型,避免字符总数过多时溢出(Integer最大值是32767,不足以应对大量数据)
内容的提问来源于stack exchange,提问作者Francesco_Cimmino
相关产品推荐
相关产品推荐

