世事洞明皆学问,人情练达即文章。这篇文章主要讲述准时下班系列!Excel合集之第3集—VBA怎么做双条件受控动态图表相关的知识,希望能为你提供帮助。
Hi,各位同学好!我是吴明课堂的答疑老师之一陈婉。
最近有位勇敢又特别聪明的学员,零基础学了几天(非夸张量词)Excel之后,成功应聘到了一家连锁企业做了仓管。
初生牛犊不怕虎,她对领导做了很多承诺。但学的时间特别短,基础不牢固,经常不记得功能在课程的哪个位置,所以最近跟我沟通比较多。
前两天问我动态图表咋做,我给她截图了老师在Excel教程第11章讲的动态图表相关课程位置,她照着做了一个,又提出了新的需求:老师讲的例子只有一个条件会变动,她想要加一个条件,希望能在图表中选择显示前N项数据。
于是我们俩一拍即合,迅速确定了这周的文章内容:
首先给大家演示下最终效果:
组成结构解析:
所需技能分析:
关键位置设置展示:
2. C13自定义单元格格式设置:
3. VBA代码(写在工作表对象内):
用户更改工作表单元格(不包含重新计算事件)时触发
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Address = "$B$13" Or Target.Address = "$C$13") Then
Call reDoChart
End If
End Sub
更改图表
Private Function reDoChart()
Dim dataArr(), total As Integer, i As Integer
根据条件获取图表数据源
dataArr = getDataByCondition()
total = UBound(dataArr)
拆分图表数据源
Dim nameArr(), valueArr()
nameArr = dataArr
valueArr = dataArr
For i = 0 To total
Dim conArr() As String
conArr = VBA.Split(dataArr(i), ";
")
nameArr(i) = conArr(0)
valueArr(i) = VBA.CDbl(conArr(1))
Next i
设置图表数据源
Dim cot As ChartObject
For Each cot In Sheets("Sheet1").ChartObjects
cot.Chart.FullSeriesCollection(1).Name = [B13]
cot.Chart.FullSeriesCollection(1).Values = valueArr
cot.Chart.FullSeriesCollection(1).XValues = nameArr
Next cot
End Function
根据B13、C13获取图表数据源
Private Function getDataByCondition() As Variant
Dim month As String, topN As Integer
Dim titlerngs As Range, titleRng As Range, dataRngs As Range
month = [B13]
topN = [C13]
月份标题区域
Set titlerngs = Range("B5:H5")
Set titleRng = titlerngs.Find(month)
If (titleRng Is Nothing) Then
MsgBox "请检查数据"
Exit Function
End If
数据区域
Set dataRngs = Range(titleRng.Offset(1, 0), titleRng.End(xlDown))
给数据区域排名,并返回排名后的区域
getDataByCondition = getRankData(dataRngs, topN)
End Function
给单元格排序的函数,并返回前N项数据
Private Function getRankData(dataRngs As Range, topN As Integer) As Variant
容错处理
If (topN >
dataRngs.Count) Then
MsgBox "数据有误,请检查"
Exit Function
End If
需引用Microsoft Scripting Runtime
Dim sourcedic As New Dictionary
Dim rng As Range
单元格区域放进Dictionary中
For Each rng In dataRngs
sourcedic.Add Cells(rng.Row, 2).Value, rng.Value
Next rng
排序后的字典对象
Dim rankedDic As New Dictionary
Dim i As Integer, j As Integer, index As String, max As Double
For i = 1 To topN
index = sourcedic.Keys(0)
max = sourcedic.Items(0)
For j = 0 To sourcedic.Count - 1
If (sourcedic.Items(j) >
= max) Then
index = sourcedic.Keys(j)
max = sourcedic.Items(j)
End If
Next j
rankedDic.Add index, index &
";
" &
max
sourcedic.Remove index
Next i
getRankData = https://www.songbingjia.com/android/rankedDic.Items
End Function
学习重难点分析:
附上Dictionary对象的API链接:
??https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/dictionary-object??
如需系统学习Excel,可查看以下课程:
??
https://edu.51cto.com/course/26293.html??
该课程可以使学员以最少的学习时间搭建最完善的表格基础知识架构。
案例文档获取链接:
??https://pan.baidu.com/s/1WKvcfUgfWVn0zlc--_mNuA??
【准时下班系列!Excel合集之第3集—VBA怎么做双条件受控动态图表】提取码:wmkt
推荐阅读
- #yyds干货盘点#mybatis-plus学习与实践逻辑删除
- Linux基础(目录索引)
- #yyds干货盘点#linux命令--cat
- 百度智能云实战——静态文件CDN加速
- centos8.5 配置vsftpd的SSL/TLS功能
- Linux之head命令
- #yyds干货盘点#-win10磁盘检查命令
- #yyds干货盘点#JavaScript数值范围
- Zabbix5.0安装步骤