三大专题深度讲解:数据透视表 · VBA与宏 · 高级图表
简单说:你有一大坨原始数据,想按各种维度分类汇总——按部门求和、按月份平均、按地区计数……拖拖鼠标就能搞定,不用写任何公式。
先建一张销售明细表(这是标准的一维表格式)
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| 日期 | 销售员 | 区域 | 产品 | 数量 | 金额 |
| 1月5日 | 张三 | 华东 | 笔记本 | 10 | 8,500 |
| 1月8日 | 李四 | 华东 | 显示器 | 5 | 6,000 |
| 1月12日 | 王五 | 华北 | 笔记本 | 8 | 6,800 |
| 1月15日 | 张三 | 华东 | 键盘 | 20 | 1,000 |
| 1月20日 | 李四 | 华东 | 笔记本 | 12 | 10,200 |
| 1月25日 | 王五 | 华北 | 显示器 | 3 | 3,600 |
| 2月3日 | 张三 | 华东 | 显示器 | 7 | 8,400 |
| 2月10日 | 李四 | 华东 | 键盘 | 15 | 750 |
| 2月18日 | 赵六 | 华南 | 笔记本 | 9 | 7,650 |
| 2月25日 | 赵六 | 华南 | 显示器 | 4 | 4,800 |
插入 → 数据透视表(或者按 Alt+N+V)右边会出现"数据透视表字段"面板,把字段拖到四个区域:
| 区域 | 放什么 | 效果 |
|---|---|---|
| 行 | 区域、销售员 | 按区域分行,区域内按销售员分行 |
| 列 | 产品 | 按产品分列(可选) |
| 值 | 金额(求和) | 汇总每个销售员的销售额 |
| 筛选 | 日期(可按月分组) | 筛选只看某个月的数据 |
| 行标签 | 笔记本 | 显示器 | 键盘 | 总计 |
|---|---|---|---|---|
| 华东 | ||||
| 张三 | 8,500 | 8,400 | 1,000 | 17,900 |
| 李四 | 10,200 | 6,000 | 750 | 16,950 |
| 华北 | ||||
| 王五 | 6,800 | 3,600 | 10,400 | |
| 华南 | ||||
| 赵六 | 7,650 | 4,800 | 12,450 | |
| 总计 | 33,150 | 22,800 | 1,750 | 57,700 |
默认是"求和",右键值 → 值字段设置,可以切换:
| 计算类型 | 说明 | 应用场景 |
|---|---|---|
| 求和 | 数值相加 | 销售额汇总 |
| 计数 | 统计条目数量 | 订单笔数、客户数 |
| 平均值 | 算术平均 | 客单价、平均分 |
| 最大值 | 最大值 | 最高销售额 |
| 最小值 | 最小值 | 最低销售额 |
| 乘积 | 数值相乘 | 特殊计算 |
值字段设置 → 值显示方式 → 可以选"占总和的百分比"、"差异"、"Running Total(累计)"等。选"百分比"后,每个数字旁边自动显示占比。
组合 → 按月、季度、年。比如把每天的明细自动汇总成月报表组合 → 设置步长(如 5000),自动生成 0-5000、5000-10000 等区间组合 → 比如把华东+华北 组合成"北方区"数据透视表分析 → 插入切片器 → 勾选"区域"插入日程表→ 拖动时间条筛选日期范围报表连接 → 勾选其他透视表,就能同时筛选刷新,或快捷键 Alt + F5数据透视表选项 → 数据 → 勾选"打开文件时刷新数据"题目1:把"销售员"拖到行,把"金额"拖到值(求和),看看谁的总销售额最高?
题目2:怎么只看"华东"区域的数据?
宏:把你做的一系列操作"录下来",以后按一下按钮自动重放一遍。
VBA:宏背后其实是一段 VBA(Visual Basic for Applications)代码。录宏→自动生成代码→你可以自己改代码实现更复杂的功能。
文件 → 选项 → 自定义功能区录制宏、Visual Basic 等按钮开发工具 → 录制宏 → 弹出一个窗口Ctrl+Shift+H → 确定停止录制 ✅ 宏已经录好了!Alt+F8 → 选择"设置标题" → 执行 → 自动变黄底粗体!
Alt + F11 打开 VBA 编辑器模块 → 模块1| 📄 VBA 代码(自动生成) |
|---|
| Sub 设置标题() ' 设置标题 Macro ' 快捷键: Ctrl+Shift+H With Selection.Interior .Pattern = xlSolid .Color = 65535 ' 黄色 End With Selection.Font.Bold = True ' 粗体 End Sub |
Sub ... End Sub 就是一段"宏"。里面的每一行对应你刚才的一个操作。Selection 就是"当前选中的单元格",.Interior.Color 是背景颜色,.Font.Bold 是字体粗体。
Alt+F11 打开编辑器 → 插入 → 模块| 📄 手动写 VBA |
|---|
| Sub 填入数字() Dim i As Integer For i = 1 To 10 Cells(i, 1).Value = i ' 第i行第1列 = i Next i End Sub |
Alt+F8 → 选择"填入数字" → 执行For 循环 + Cells(行, 列) 是最常用的语法。| 操作 | VBA 代码 | 说明 |
|---|---|---|
| 读/写单元格 | Range("A1").Value = "Hello" | 读写A1的值 |
| 读/写单元格 | Cells(1, 1).Value = 100 | 第1行第1列 |
| 设置字体颜色 | Range("A1").Font.Color = RGB(255,0,0) | 红色字体 |
| 设置底色 | Range("A1:C10").Interior.Color = 65535 | 黄色背景 |
| 复制粘贴 | Range("A1").Copy Range("B1") | 复制A1到B1 |
| 循环 | For i = 1 To 10 ... Next i | 循环1到10 |
| 条件判断 | If Range("A1") > 100 Then ... End If | 如果A1>100 |
| 选中最后一行 | Range("A" & Rows.Count).End(xlUp).Select | 跳到A列最后有数据的行 |
| 遍历所有工作表 | For Each ws In Worksheets ... Next ws | 遍历每个sheet |
| 📄 合并文件的 VBA 代码 |
|---|
| Sub 合并文件() Dim 文件名 As String Dim 路径 As String Dim 目标行 As Integer 路径 = "C:\销售数据\" ' 修改为你的文件夹路径 目标行 = 1 ' 从第1行开始粘贴 ' 找文件夹里的所有 .xlsx 文件 文件名 = Dir(路径 & "*.xlsx") Do While 文件名 <> "" ' 打开文件 Workbooks.Open 路径 & 文件名 ' 复制Sheet1的数据 Worksheets("Sheet1").UsedRange.Copy ' 粘贴到汇总表 ThisWorkbook.Worksheets("汇总").Cells(目标行, 1).PasteSpecial ' 关闭文件 ActiveWorkbook.Close SaveChanges:=False ' 更新目标行位置 目标行 = 目标行 + 100 ' 留点空间 ' 找下一个文件 文件名 = Dir() Loop MsgBox "合并完成!" End Sub |
Dir("路径*.xlsx") → 查找文件夹里所有 xlsx 文件Workbooks.Open → 打开文件UsedRange.Copy → 复制所有有数据的区域Do While ... Loop → 循环处理每一个文件Sheet1Worksheet,再下拉选 Change| 📄 事件自动触发 |
|---|
| Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then MsgBox "A1 被修改了!新值: " & Target.Value End If End Sub |
.xlsm(启用宏的工作簿),不能存为普通的 .xlsx,否则宏会丢失。
题目1:写一段 VBA,把选中的单元格字体变成蓝色、斜体。
题目2:想用宏合并多个文件,第一步应该打开什么工具?
| 月份 | 销售额(万) | 增长率 |
|---|---|---|
| 1月 | 120 | — |
| 2月 | 135 | 12.5% |
| 3月 | 110 | -18.5% |
| 4月 | 150 | 36.4% |
| 5月 | 165 | 10.0% |
| 6月 | 180 | 9.1% |
插入 → 组合图(2016版以上有)更改系列图表类型 → 选"折线图"并勾选次坐标轴。
| 产品 | 1月 | 2月 | 3月 | 4月 | 5月 | 趋势↗ |
|---|---|---|---|---|---|---|
| 笔记本 | 50 | 65 | 60 | 80 | 90 | 📈 |
| 显示器 | 30 | 28 | 35 | 32 | 40 | 📈 |
| 键盘 | 100 | 90 | 85 | 70 | 65 | 📉 |
插入 → 迷你图 → 选折线图(或柱形图、盈亏图)设计 → 可以改颜色、显示高点/低点/负点,让趋势更明显。
| 项目 | 金额(万) | 说明 |
|---|---|---|
| 期初利润 | 100 | 起点 |
| 营收增长 | +20 | 增加 |
| 成本上升 | -10 | 减少 |
| 其他收入 | +15 | 增加 |
| 税费变化 | +5 | 增加 |
| 期末利润 | 130 | 终点 |
插入 → 图表 → 瀑布图设置为汇总(会浮起来作为总计)数据 → 数据验证 → 选"序列" → 输入:华东,华北,华南=FILTER(数据范围, 区域列=下拉单元格) 动态筛选| 类别 | 子类别 | 销售额 |
|---|---|---|
| 电子产品 | 笔记本 | 50,000 |
| 电子产品 | 显示器 | 30,000 |
| 电子产品 | 键盘 | 10,000 |
| 家具 | 办公椅 | 25,000 |
| 家具 | 办公桌 | 40,000 |
插入 → 图表 → 选树状图+ 号 → 趋势线 → 选"线性"或"移动平均"设置趋势线格式 → 勾选"显示公式"和"显示R平方值"+ → 误差线 → 可设置固定值、百分比、标准偏差| 美化操作 | 怎么做 | 效果 |
|---|---|---|
| 去掉多余图例 | 点击图例 → Delete | 只有一个系列时不需要图例 |
| 加数据标签 | 点击图表 → + → 数据标签 | 柱子上显示具体数值 |
| 改主题色 | 点击图表 → 设计 → 换颜色方案 | 跟报告整体风格统一 |
| 坐标轴从0开始 | 右键坐标轴 → 设置坐标轴格式 → 最小值=0 | 避免夸大视觉效果 |
| 加网格线/去掉网格线 | 点击图表 → + → 勾选/取消网格线 | 让图表更干净或更易读 |
| 用图片填充柱子 | 右键柱子 → 填充 → 图片或纹理填充 | 适合汇报场合,视觉效果惊艳 |
题目1:想在一张图上同时展示"销售额"和"增长率"(单位不同),应该用什么图表?
题目2:怎样在不改原始数据的情况下,让图表只显示某个区域的数据?
数据太多看不过来?让 Excel 自动帮你标颜色——大于1万的变绿、小于5千的变红、重复的标黄……一眼扫过去就知道重点在哪。
| 销售员 | 销售额 | 条件格式效果 ↓ | |
|---|---|---|---|
| 张三 | 12,000 |
🟢 >10,000 绿色 =C2>10000🔴 <5,000 红色 =C2<5000
| |
| 李四 | 8,500 | ||
| 王五 | 15,000 | ||
| 赵六 | 3,200 | ||
| 孙七 | 6,800 |
开始 → 条件格式 → 突出显示单元格规则 → 大于| 销售员 | 区域 | 销售额 | 公式 |
|---|---|---|---|
| 张三 | 华东 | 12,000 |
=$C2>10000选中 A2:C6 → 条件格式 → 新建规则 → 使用公式 👆 C列前面加 $ 锁定列,这样整行都变色 |
| 李四 | 华东 | 8,500 | |
| 王五 | 华北 | 15,000 |
=$C2>10000 中的 $C 表示固定列(判断C列),2 不加 $ 表示行号跟着当前行变。这就是整行高亮的原理。
| 销售员 | 数据条效果 | 图标集效果 |
|---|---|---|
| 张三 | 12,000 | ✅ 达标 |
| 李四 | 8,500 | ✅ 达标 |
| 赵六 | 3,200 | 🔴 未达标 |
条件格式 → 数据条 → 选渐变色或实心色条件格式 → 图标集 → 选红绿灯/箭头/勾叉条件格式 → 管理规则 → 可以调整触发条件和显示样式=MOD(ROW(),2)=0 → 设置浅灰底色。这样不管怎么增删行,斑马纹都不会乱。
题目:写一个条件格式公式,让"区域"列是"华东"的整行变蓝色底色。
你从系统导出的数据乱七八糟——有空行、列名不对、格式不统一、需要合并多个文件……
Power Query 就是 Excel 内置的"数据清洗工厂",操作完以后一键刷新就能重复使用。
数据 → 获取数据(或 新建查询)| 功能 | 在哪 | 做什么用 |
|---|---|---|
| 从文本/CSV 导入 | 数据 → 获取数据 → 自文件 | 导入 CSV、TXT 文件,自动拆分列 |
| 从文件夹合并 | 数据 → 获取数据 → 自文件夹 | 一键合并整个文件夹的所有文件 |
| 删除空行/空列 | 主页 → 删除行 → 删除空行 | 清理脏数据 |
| 拆分列 | 主页 → 拆分列 | 按分隔符拆成一列变多列 |
| 透视列/逆透视列 | 转换 → 透视列/逆透视列 | 二维表↔一维表互转 |
| 合并查询 | 主页 → 合并查询 | 类似 VLOOKUP,两张表匹配合并 |
| 追加查询 | 主页 → 追加查询 | 多张相同结构的表上下拼接 |
| 更改数据类型 | 主页 → 数据类型 | 把文本转数字、日期等 |
C:\销售数据\ 文件夹里,想把所有文件合并成一张表。
数据 → 获取数据 → 自文件 → 从文件夹C:\销售数据\ 文件夹 → 确定合并 → 合并并加载刷新,新文件自动包含进来!题目:Power Query 的"合并查询"和"追加查询"有什么区别?
你有预算限制,想最大化利润——投多少钱到产品A、多少钱到产品B?
你想知道贷款多少年月供刚好能承受——单变量求解帮你反推。
你想比较三种投资方案哪个最划算——方案管理器帮你算。
| 参数 | 值 | 公式 |
|---|---|---|
| 贷款总额 | 200,000 | |
| 年利率 | 4.5% | |
| 贷款年限 | ??? | ← 这是要求的值 |
| 月供 | 3,500 | =PMT(利率/12, 年限*12, -贷款额) |
PMT 函数算出月供数据 → 模拟分析 → 单变量求解| 贷款20万 | 3年 | 5年 | 10年 | 15年 |
|---|---|---|---|---|
| 3.5% | 5,858 | 3,642 | 1,978 | 1,430 |
| 4.0% | 5,905 | 3,683 | 2,025 | 1,479 |
| 4.5% | 5,953 | 3,724 | 2,073 | 1,530 |
| 5.0% | 6,001 | 3,766 | 2,121 | 1,582 |
数据 → 模拟分析 → 模拟运算表数据 → 规划求解(如果没有,先在加载项里启用)文件 → 选项 → 加载项 → 转到 → 勾选"规划求解加载项" → 确定
题目:如果产品A 利润率变成 20%,产品B 变成 30%,约束不变,最优解会变吗?
你让别人填表,想限制只能选某些选项——比如只能选"华东/华北/华南",不能乱填。
更进一步:选了"广东"→ 下一个下拉自动只显示广东的城市——叫二级联动。
数据 → 数据验证(或 数据有效性)华东,华北,华南)是,否 或者 男,女,用英文逗号隔开,不需要另起一列。
| D (广东省) | E (江苏省) | F (浙江省) | |
|---|---|---|---|
| 1 | 广州 | 南京 | 杭州 |
| 2 | 深圳 | 苏州 | 宁波 |
| 3 | 珠海 | 无锡 | 温州 |
| 4 | 东莞 | 常州 | 绍兴 |
公式 → 名称管理器 → 新建 → 名称填"城市列表"INDIRECT(A1) 会把 A1 单元格的内容(文本)转换成区域引用。所以 A1 的内容必须跟列标题一模一样(包括空格)。
题目:数据验证的"来源"里,用英文逗号隔开和选中区域有什么区别?
忘了语法?回来这里快速翻一下
| 函数 | 语法 | 一句话 |
|---|---|---|
| XLOOKUP | =XLOOKUP(查谁, 查哪列, 返回哪列, [查不到显示]) | 新版查找,任意方向 |
| FILTER | =FILTER(数据区, 条件, [无结果]) | 动态筛选,自动扩展 |
| SUMIFS | =SUMIFS(求和区, 条件区1, 条件1, ...) | 多条件求和 |
| COUNTIFS | =COUNTIFS(条件区1, 条件1, ...) | 多条件计数 |
| UNIQUE | =UNIQUE(数组) | 去重 |
| SORT | =SORT(数组, [排序列], [升序]) | 排序 |
| INDEX+MATCH | =INDEX(返回列, MATCH(查谁, 查找列, 0)) | 经典绝配 |
| LET | =LET(变量名, 值, 计算) | 公式里用变量 |
| LAMBDA | =LAMBDA(参数, 计算) | 自定义函数 |
| INDIRECT | =INDIRECT("文本引用") | 文本变引用 |
| OFFSET | =OFFSET(起点, 行, 列, [高], [宽]) | 动态偏移区域 |