作者:绿色风
分类:
时间:2022-08-17
浏览:104
楼主 zzmxy |
Q: 我想把表中的'初三1班'、'初三2班'的学生成绩通过"合并成绩"按钮合并到'初三成绩表'中,初二、初一不合并在初三成绩表中, 还有一个问题是各班的人数不定,2班成绩要自动接在1班后,请问VBA怎么写(用循环的方式,因实际工作表不是两张而是很多张)?
A: 由于各表的名称有规律,且表格的结构一致,因此这种情况编写代码最为简单,使用两个控制变量,以及两个循环即可完成。 如果数据表的格式结构不太一样,那需要根据对应的语句作出判断或修改,本例子使用的代码如下:- Private Sub CommandButton1_Click()
- Application.ScreenUpdating = False '关闭屏幕刷新
- Columns("A:K").ClearContents '清空A:K列的内容
- Cells(1, 1).Resize(1, 11) = Array("序号", "姓名", "语文", "数学", "英语", "**", "物理", "化学", "总分", "班级", "年级")
- '使用数组的方式,生成标题行,其中Resize()函数的11是列数,与标题行的列数相同
- iRow = 2 '初始化要输入的行号起始值,为2
- For Each sht In Worksheets '用For Each循环,遍历本工作簿的所有工作表
- i = 3 '初始化各个工作表复制的起始位置,由于表格结构一样,都是从第三行开始,所以i=3
- If sht.Name <> ActiveSheet.Name And Left(sht.Name, 2) = "初三" Then
- '判断,工作表名不是当前工作表或其前两个字符是不是“初三”,如果不满足则不复制数据
- Do While sht.Cells(i, 1) <> "" '循环开始,当Ai单元格的值非空时,刚进行下面的复制
- Cells(iRow, 1) = iRow - 1 '在工作表的第一列,输入序号
- Cells(iRow, 2).Resize(1, 10).Value = sht.Cells(i, 2).Resize(1, 10).Value '数据复制
- iRow = iRow + 1 '序号+1
- i = i + 1 '工作表数据的行号+1
- Loop
- End If
- Next
- Application.ScreenUpdating = True '重新开启屏幕刷新
- End Sub
另外,由于本例中,数据之间有空行,因此Do...Loop循环里,也可以直接用比较简单的方式End(xlDown)选择区域后进行数值复制,如下:- sht.Range(sht.Cells(i, 2), sht.Cells(i, 2).End(xlDown).End(xlToRight)).Copy Cells(iRow, 2)
- iRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
多工作表汇总zz.rar |
2楼 wise |
建议题目修改一下,不具备通用性吧? |
3楼 zzmxy |
是应该改一下~~最开始的初衷是比较容易修改为适用的,所以才用了那两个字~~谢谢小7提醒! |
4楼 baohugengdi |
学习了,可是太复杂,学不会 |
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一