有个朋友让帮忙看下excel数据怎么处理,初步一看有点复杂,难以下手。进一步分析、搜索,发现VBA可以很好地解决这个问题,总结记录一下。
问题描述:如下图,有N个sheet,每个sheet记录了一个公司的交易详细,需求:统计出来所有公司,每样产品的交易情况。
分析整理思路
初步一看,这些杂乱数据处理起来很麻烦,首先是跨表格统计,然后是数据规律没有那么明显。仔细分析是有规律的:
- 公司的位置是固定的——C4
- 交易详单的起始位置是固定的——B9
- 交易详单的结束方式是固定的——空格
整体解决思路,建立新的sheet,假设为sum:
- 从C4位置取公司名字作为第一列
- 从B9开始向下搜索,B10、B11……,取B9作第2列,数量F9作为第3列,组成一行数据
- 搜索结束条件就是BN为空格
- 对其他所有sheet采用同样的处理
代码模块学习
确定处理方案是VBA之后,学习VBA基本
选取固定表格
Sub test1() '为单元格C1赋予单元格D6的值方式一 Range("C1") = Range("D6").Value '为单元格B1赋予单元格A1的值方式二 Cells(3, 2) = Cells(3, 2).Value End Sub
其中,Cells(i,j)中i指的是行数,j指的是列数,Cells(i,j)指的是第i行的第j列单元格。
循环表达式使用
Sub test2() Dim i As Integer ' for循环使用 For i = 1 To 10 ... Next ' while循环使用 While i < 10 ... Wend End Sub
遍历所有sheet
Sub test3() Dim myWorksheet As Worksheet '遍历所有sheet For Each myWorksheet In Worksheets '... Next End Sub
最终代码实现
Sub calc() '定义增量循环i Dim myWorksheet As Worksheet Dim i As Integer Dim j As Integer i = 1 '汇总表从第一行开始 Debug.Print "开始测试" For Each myWorksheet In Worksheets '遍历所有sheet Debug.Print myWorksheet.Name j = 9 Debug.Print j While myWorksheet.Cells(j, 2) <> "" '结束条件Bn为空 Sheets("calc").Cells(i, 1) = myWorksheet.Cells(4, 3) '第一列放名字 Sheets("calc").Cells(i, 2) = myWorksheet.Cells(j, 2) '第二列放型号 Sheets("calc").Cells(i, 3) = myWorksheet.Cells(j, 6) '第三列放数量 i = i + 1 '汇总表往下一行移动 j = j + 1 'B列往下搜索 Wend Next myWorksheet End Sub
数据表及其他细节
打开VBA代码窗口
右键任一sheet,选择查看代码。或者快捷键Alt+F11
文件——选项——自定义功能区,常用命令的主选项卡可以选中开发工具,打开菜单栏,可以直接看到Visual Basic和宏菜单
调试方法
Debug.Print,支持变量、字符串等,打印内容输出在立即窗口,立即窗口打开方法:
视图——立即窗口。或者快捷键Ctrl+G
文本转数字
最终生成的数量列是文本,不能做加法统计,需要先转为数字
选中所有文本,左上角出现黄色感叹号,鼠标移动过去,选择转换为数字
实例表格下载
https://files.cnblogs.com/files/quantumplan/vba%E5%AE%9E%E4%BE%8B.rar