📊 Excel 高阶函数 · 互动教学

三大专题深度讲解:数据透视表 · VBA与宏 · 高级图表

📊 透视表 ⚡ VBA 宏 📈 高级图表 🎨 条件格式 🔄 Power Query 🎯 规划求解 📋 数据验证
VBA 从零到精通
7 章完整教程:语法 → 事件 → 实战 → 调试
📖
VBA 小白词典
50+ 词条即查即用 · 大白话 + 比喻
🎯 学习三步法: ① 看场景引入 → ② 看模拟数据和步骤教学 → ③ 点"动手试试"检验成果

📊 数据透视表 — 深度全解

⭐⭐ 进阶
🤔 先搞懂:数据透视表是干什么的?

简单说:你有一大坨原始数据,想按各种维度分类汇总——按部门求和、按月份平均、按地区计数……拖拖鼠标就能搞定,不用写任何公式。

💡 核心能力:把几千行的明细数据,在几秒内变成汇总报表。改一下拖拽方式,就是另一种报表。
📋 准备示例数据

先建一张销售明细表(这是标准的一维表格式)

ABCDEF
日期销售员区域产品数量金额
1月5日张三华东笔记本108,500
1月8日李四华东显示器56,000
1月12日王五华北笔记本86,800
1月15日张三华东键盘201,000
1月20日李四华东笔记本1210,200
1月25日王五华北显示器33,600
2月3日张三华东显示器78,400
2月10日李四华东键盘15750
2月18日赵六华南笔记本97,650
2月25日赵六华南显示器44,800
📌 第一步:创建数据透视表
1
选中数据:鼠标点一下表格里的任意单元格(A1:F11)
2
插入透视表:菜单栏 → 插入数据透视表(或者按 Alt+N+V)
3
选择位置:默认"新工作表",点确定。Excel 会自动创建一个新工作表
选中数据 插入 → 透视表 确认区域 新工作表 ✅
📌 第二步:拖字段(核心操作)

右边会出现"数据透视表字段"面板,把字段拖到四个区域:

区域放什么效果
区域、销售员按区域分行,区域内按销售员分行
产品按产品分列(可选)
金额(求和)汇总每个销售员的销售额
筛选日期(可按月分组)筛选只看某个月的数据
✅ 拖完后,透视表自动变成这样:
行标签笔记本显示器键盘总计
华东
 张三8,5008,4001,00017,900
 李四10,2006,00075016,950
华北
 王五6,8003,60010,400
华南
 赵六7,6504,80012,450
总计33,15022,8001,75057,700
📌 第三步:改计算方式

默认是"求和",右键值 → 值字段设置,可以切换:

计算类型说明应用场景
求和数值相加销售额汇总
计数统计条目数量订单笔数、客户数
平均值算术平均客单价、平均分
最大值最大值最高销售额
最小值最小值最低销售额
乘积数值相乘特殊计算
💡 值显示方式更强大:右键值 → 值字段设置值显示方式 → 可以选"占总和的百分比"、"差异"、"Running Total(累计)"等。选"百分比"后,每个数字旁边自动显示占比。
📌 第四步:分组
1
日期分组:右键日期字段 → 组合 → 按月、季度、年。比如把每天的明细自动汇总成月报表
2
数值分组:右键金额 → 组合 → 设置步长(如 5000),自动生成 0-5000、5000-10000 等区间
3
自定义分组:选中多行 → 右键 → 组合 → 比如把华东+华北 组合成"北方区"
📌 第五步:切片器 + 日程表(交互式筛选)
1
插入切片器:点透视表 → 数据透视表分析插入切片器 → 勾选"区域"
2
用法:点击切片器上的"华东"→ 透视表只显示华东的数据,像按钮开关一样
3
日程表:同样的位置选插入日程表→ 拖动时间条筛选日期范围
4
一个切片器控制多个透视表:右键切片器 → 报表连接 → 勾选其他透视表,就能同时筛选
📌 第六步:源数据变了怎么办?
1
手动刷新:右键透视表 → 刷新,或快捷键 Alt + F5
2
打开文件时自动刷新:右键透视表 → 数据透视表选项数据 → 勾选"打开文件时刷新数据"
3
数据源自动扩展:把数据区域转成"表"(Ctrl+T),以后加行数据透视表自动识别新数据
⚠️ 常见坑:源数据有空行合并单元格,透视表会出问题。务必保持一维表格式——每列有标题、无空行、无合并。
✏️ 动手试试

题目1:把"销售员"拖到行,把"金额"拖到值(求和),看看谁的总销售额最高?

题目2:怎么只看"华东"区域的数据?

⚡ VBA 与宏 — 从零到自动化

⭐⭐⭐ 高阶
🤔 先搞懂:什么是宏?什么是 VBA?

宏:把你做的一系列操作"录下来",以后按一下按钮自动重放一遍。
VBA:宏背后其实是一段 VBA(Visual Basic for Applications)代码。录宏→自动生成代码→你可以自己改代码实现更复杂的功能。

💡 一句话: 不想重复的事,让宏来做。宏搞不定的,写 VBA 搞定。
📌 第一步:开启「开发工具」选项卡
1
文件选项自定义功能区
2
在右侧勾选 「开发工具」 → 确定
3
菜单栏出现「开发工具」选项卡 → 现在可以看到 录制宏Visual Basic 等按钮
文件 → 选项 自定义功能区 勾选"开发工具" 确定 ✅
📌 第二步:录制你的第一个宏
🎯 目标:录制一个宏,自动把选中单元格设为"黄底+粗体"
1
准备:先在单元格A1随便输入一段文字
2
开发工具录制宏 → 弹出一个窗口
3
宏名输入 "设置标题" → 可以设快捷键 Ctrl+Shift+H → 确定
4
开始录制了!现在你做的每一步操作都会被记下来。
5
选中A1 → 设置填充色为黄色 → 设置字体为粗体
6
停止录制 ✅ 宏已经录好了!
🎉 测试:选中任意单元格 → Alt+F8 → 选择"设置标题" → 执行 → 自动变黄底粗体!
📌 第三步:看 VBA 代码长什么样
1
Alt + F11 打开 VBA 编辑器
2
左边有一个"工程资源管理器",展开后找到 模块模块1
3
双击模块1,你会看到 Excel 自动生成的代码:
📄 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 是字体粗体。
📌 第四步:自己动手写一段 VBA
🎯 目标:把 A1 到 A10 填上数字 1 到 10
1
Alt+F11 打开编辑器 → 插入模块
2
输入这段代码:
📄 手动写 VBA
Sub 填入数字() Dim i As Integer For i = 1 To 10 Cells(i, 1).Value = i ' 第i行第1列 = i Next i End Sub
3
回到 Excel,按 Alt+F8 → 选择"填入数字" → 执行
4
结果:A1=1, A2=2, A3=3 …… A10=10 ✅ 自动填好了!
🎉 学会了!这就是写代码控制 Excel——For 循环 + Cells(行, 列) 是最常用的语法。
📌 VBA 常用语法速查
操作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
📌 实战:合并多个 Excel 文件
🎯 场景:你有12个月的销售文件(1月.xlsx~12月.xlsx),想把它们合并到一张表里。
📄 合并文件的 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 → 循环处理每一个文件
— 改一下文件夹路径就能直接用!
📌 进阶:事件自动化(不用手动点,自动触发)
🎯 场景:修改单元格A1时,自动弹出提示框。
1
在 VBA 编辑器中,左边双击 Sheet1
2
下拉选 Worksheet,再下拉选 Change
3
输入代码:
📄 事件自动触发
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then MsgBox "A1 被修改了!新值: " & Target.Value End If End Sub
🎉 现在试试:在 Sheet1 的 A1 输入任何内容 → Excel 自动弹窗!这就是"事件驱动"编程。
⚠️ 保存注意事项:含有宏的文件必须保存为 .xlsm(启用宏的工作簿),不能存为普通的 .xlsx,否则宏会丢失。
✏️ 动手试试

题目1:写一段 VBA,把选中的单元格字体变成蓝色、斜体。

题目2:想用宏合并多个文件,第一步应该打开什么工具?

📈 高级图表 — 让数据"看得见"

⭐⭐ 进阶
📌 组合图 — 柱形 + 折线,展示不同量级的数据
🎯 场景:一张表同时展示"销售额"(万元级)和"增长率"(百分比),两个数据尺度完全不同。
月份销售额(万)增长率
1月120
2月13512.5%
3月110-18.5%
4月15036.4%
5月16510.0%
6月1809.1%
1
选中数据 → 插入组合图(2016版以上有)
2
"销售额"设为簇状柱形图,"增长率"设为折线图
3
勾选"增长率"的次坐标轴 → 这样右边出现一个百分比坐标轴
✅ 效果:柱子看销售额(左轴),折线看增长率(右轴),一张图两个维度,对比一目了然。
💡 没有"组合图"选项?先插入柱形图 → 右键"增长率"系列 → 更改系列图表类型 → 选"折线图"并勾选次坐标轴。
📌 迷你图 — 在单元格里画小趋势图
🎯 场景:你的报表有几十行数据,每行是一个产品的月度销量,想在每行末尾的单元格里放一个小折线图,直观看到每个产品的趋势。
产品1月2月3月4月5月趋势↗
笔记本5065608090📈
显示器3028353240📈
键盘10090857065📉
1
选中你要放迷你图的单元格(比如 F2)
2
插入迷你图 → 选折线图(或柱形图、盈亏图)
3
数据范围选 B2:E2(1月~4月数据)→ 确定
4
拖拽下拉填充到其他行 → 每行都有小趋势图了 ✅
💡 美化:点迷你图 → 设计 → 可以改颜色、显示高点/低点/负点,让趋势更明显。
📌 瀑布图 — 展示数据增减变化过程
🎯 场景:分析利润从100万到130万的过程中,每个因素贡献了多少(+20万营收、-5万成本、+15万其他收入……)。
项目金额(万)说明
期初利润100起点
营收增长+20增加
成本上升-10减少
其他收入+15增加
税费变化+5增加
期末利润130终点
1
选中数据 → 插入图表瀑布图
2
右键"期初利润"和"期末利润" → 设置为汇总(会浮起来作为总计)
3
现在每个柱子都"悬浮"在上一个柱子之上/之下,增减过程一眼看清 ✅
📌 动态图表 — 下拉菜单控制图表显示什么
🎯 场景:你有一张多年的销售数据表,想通过下拉菜单选择"华东"或"华北",图表自动切换显示该区域的数据。
1
建下拉菜单:数据数据验证 → 选"序列" → 输入:华东,华北,华南
2
用公式提取数据:在旁边区域用 =FILTER(数据范围, 区域列=下拉单元格) 动态筛选
3
创建一个普通图表,数据源指向FILTER 公式返回的区域
4
效果:下拉选"华北"→ 图表自动变成华北的数据 ✅
📌 树状图 / 旭日图 — 层级关系一目了然
类别子类别销售额
电子产品笔记本50,000
电子产品显示器30,000
电子产品键盘10,000
家具办公椅25,000
家具办公桌40,000
1
选中数据 → 插入图表 → 选树状图
2
每个产品用一个方块表示,方块大小=销售额,颜色分组=大类
3
旭日图类似,但层级关系用同心环表示,更适合深层级的数据
📌 趋势线和误差线 — 预测和精度
1
趋势线:点击图表 → + 号 → 趋势线 → 选"线性"或"移动平均"
2
右键趋势线 → 设置趋势线格式 → 勾选"显示公式"和"显示R平方值"
3
趋势公式可以用来预测未来数据。R²越接近1,预测越准
4
误差线:点击图表 → +误差线 → 可设置固定值、百分比、标准偏差
📌 图表美化 — 让图表变"高级"
美化操作怎么做效果
去掉多余图例点击图例 → 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
1
选中 C2:C6(销售额列)
2
开始条件格式突出显示单元格规则大于
3
输入 10000 → 设为绿色填充 → 确定 ✅
📌 进阶:用公式高亮整行
🎯 场景:不止标一个单元格,而是让整行变色。比如销售额>10,000的那一行全标绿。
销售员区域销售额公式
张三华东12,000 =$C2>10000

选中 A2:C6 → 条件格式 → 新建规则 → 使用公式
👆 C列前面加 $ 锁定列,这样整行都变色
李四华东8,500
王五华北15,000
💡 关键点:公式 =$C2>10000 中的 $C 表示固定列(判断C列),2 不加 $ 表示行号跟着当前行变。这就是整行高亮的原理。
📌 数据条 & 图标集
销售员数据条效果图标集效果
张三12,000✅ 达标
李四8,500✅ 达标
赵六3,200🔴 未达标
1
数据条:选中数据 → 条件格式数据条 → 选渐变色或实心色
2
图标集:选中数据 → 条件格式图标集 → 选红绿灯/箭头/勾叉
3
管理规则:条件格式管理规则 → 可以调整触发条件和显示样式
💡 斑马纹(隔行变色):选中数据 → 公式规则 =MOD(ROW(),2)=0 → 设置浅灰底色。这样不管怎么增删行,斑马纹都不会乱。
✏️ 动手试试

题目:写一个条件格式公式,让"区域"列是"华东"的整行变蓝色底色。

🔄 Power Query — 数据清洗神器

⭐⭐ 进阶
🤔 什么时候用 Power Query?

你从系统导出的数据乱七八糟——有空行、列名不对、格式不统一、需要合并多个文件……
Power Query 就是 Excel 内置的"数据清洗工厂",操作完以后一键刷新就能重复使用。

💡 在哪找? Excel 2016+ → 数据获取数据(或 新建查询
老版本需要单独安装 Power Query 加载项。
📌 常用功能一览
功能在哪做什么用
从文本/CSV 导入数据 → 获取数据 → 自文件导入 CSV、TXT 文件,自动拆分列
从文件夹合并数据 → 获取数据 → 自文件夹一键合并整个文件夹的所有文件
删除空行/空列主页 → 删除行 → 删除空行清理脏数据
拆分列主页 → 拆分列按分隔符拆成一列变多列
透视列/逆透视列转换 → 透视列/逆透视列二维表↔一维表互转
合并查询主页 → 合并查询类似 VLOOKUP,两张表匹配合并
追加查询主页 → 追加查询多张相同结构的表上下拼接
更改数据类型主页 → 数据类型把文本转数字、日期等
📌 实战:合并文件夹中所有 CSV 文件
🎯 场景:你每天导出一个 CSV 销售报表存在 C:\销售数据\ 文件夹里,想把所有文件合并成一张表
1
数据获取数据自文件从文件夹
2
浏览选择 C:\销售数据\ 文件夹 → 确定
3
Power Query 会显示该文件夹所有文件列表 → 点下方 合并合并并加载
4
Power Query 自动识别所有文件的表头 → 点确定 → 所有文件数据合并到一张表 ✅
5
以后再来新文件? 右键结果表 → 刷新,新文件自动包含进来!
🎉 一键刷新!以后每天把新 CSV 丢进文件夹,点一下刷新,数据自动更新——这就是 Power Query 的魔力。
💡 Power Query vs VBA:
Power Query 适合数据清洗和转换——点点鼠标就能搞定,不需要写代码。
VBA 适合自动化操作——比如操作界面、弹消息框、跟其他程序交互。
两者互补,建议先学 Power Query,搞不定的再用 VBA。
✏️ 动手试试

题目:Power Query 的"合并查询"和"追加查询"有什么区别?

🎯 规划求解 & 模拟分析 — 算最优解

⭐⭐⭐ 高阶
🤔 什么时候用?

你有预算限制,想最大化利润——投多少钱到产品A、多少钱到产品B?
你想知道贷款多少年月供刚好能承受——单变量求解帮你反推。
你想比较三种投资方案哪个最划算——方案管理器帮你算。

📌 单变量求解 — 已知结果,反推输入
🎯 场景:你要贷款买一辆 20 万的车,希望每月还款不超过 3,500。利率 4.5%,问贷款多少年合适?
参数公式
贷款总额200,000
年利率4.5%
贷款年限???← 这是要求的值
月供3,500=PMT(利率/12, 年限*12, -贷款额)
1
在 Excel 里填好参数,用 PMT 函数算出月供
2
数据模拟分析单变量求解
3
目标单元格:月供 → 目标值:3500 → 可变单元格:年限
4
点确定 → Excel 算出结果:约 6 年
📌 模拟运算表 — 一个/两个变量变化时,结果怎么变
🎯 场景:想看看不同的利率和贷款年限下,月供分别是多少。
贷款20万3年5年10年15年
3.5%5,8583,6421,9781,430
4.0%5,9053,6832,0251,479
4.5%5,9533,7242,0731,530
5.0%6,0013,7662,1211,582
1
建好 PMT 公式,把不同的利率和年限参数列出来
2
数据模拟分析模拟运算表
3
输入行的引用单元格(年限)、列的引用单元格(利率)→ 确定
4
一张完整的利率×年限 月供矩阵表自动生成 ✅
📌 规划求解 — 资源有限,怎么分配最优
🎯 场景:你有 10 万预算,要投放两种产品。产品A 利润率 15%,产品B 利润率 25%,但产品B 最多投 4 万。怎么分配总利润最高?
1
建模型:A投入(可变)、B投入(可变)、总投入≤10万、B≤4万、总利润 = A×15% + B×25%
2
数据规划求解(如果没有,先在加载项里启用)
3
设置:
目标:最大化总利润
可变:A投入, B投入
约束:A+B ≤ 10万, B ≤ 4万, A≥0, B≥0
4
点求解 → 结果:A投6万、B投4万,总利润 19,000 ✅ 这就是最优解!
⚠️ 注意:规划求解是加载项,需要先启用:
文件选项加载项转到 → 勾选"规划求解加载项" → 确定
✏️ 动手试试

题目:如果产品A 利润率变成 20%,产品B 变成 30%,约束不变,最优解会变吗?

📋 数据验证 — 下拉菜单 & 二级联动

⭐⭐ 进阶
🤔 什么时候用?

你让别人填表,想限制只能选某些选项——比如只能选"华东/华北/华南",不能乱填。
更进一步:选了"广东"→ 下一个下拉自动只显示广东的城市——叫二级联动

📌 基础:创建下拉菜单
1
在旁边空白列输入选项:华东、华北、华南(每行一个)
2
选中要放下拉的单元格 → 数据数据验证(或 数据有效性
3
允许 → 序列 → 来源 → 选中那三个选项的区域(或直接输入:华东,华北,华南
4
确定 → 单元格右边出现下拉箭头 ✅ 只能选预设的选项了
💡 快捷方式:来源也可以直接输入 是,否 或者 男,女,用英文逗号隔开,不需要另起一列。
📌 进阶:二级联动下拉(选省→自动显示市)
🎯 场景:A1 选"广东省" → B1 自动只显示广东省的城市(广州、深圳、珠海……)
选"江苏省" → B1 自动变成(南京、苏州、无锡……)
1
准备数据:第一列各省名称,后面每列是该省的城市(列标题=省名)
D
(广东省)
E
(江苏省)
F
(浙江省)
1广州南京杭州
2深圳苏州宁波
3珠海无锡温州
4东莞常州绍兴
2
A1 做一级下拉(省份),数据验证 → 序列 → 来源选中 D1:F1
3
定义名称:公式名称管理器 → 新建 → 名称填"城市列表"
4
引用位置输入:=INDIRECT(A1)核心!INDIRECT 把A1的内容(如"广东省")变成对E列的引用
5
B1 做二级下拉 → 数据验证 → 序列 → 来源输入 =城市列表 → 确定 ✅
🎉 测试:A1 选"江苏省" → B1 下拉只有南京、苏州、无锡、常州 ✅ 选"浙江省" → 自动变成杭州、宁波、温州、绍兴
💡 核心原理: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(起点, 行, 列, [高], [宽])动态偏移区域

⚡ 快捷键速查

快速求和Alt + =
设单元格格式Ctrl + 1
创建表Ctrl + T
绝对引用切换F4
编辑单元格F2
插入图表Alt + F1
创建透视表Alt + N + V
VBA 编辑器Alt + F11
运行宏Alt + F8
快速分析Ctrl + Q
定位空值F5 → 定位条件
显示所有公式Ctrl + `