ie传递给系统调用的数据区域太小_Excel VBA——提取图表中数据系列的引用区域...

本文以《Excel VBA——创建组合图表》中生成的图表为例讲述如何通过VBA中Series对象的Formula属性提取图表中数据系列的引用区域。如图1,图表中的“目标值”,“设计方案”,“偏差”就是构成图表的三个数据系列,每个数据系列都对应一个系列公式,当选中图表中的某个数据系列时,系列公式就显示在公式编辑框中。Series公式语法为:
= SERIES(name, category_labels, values, order)

eb2eb71610bc83246b18461223ab0e1e.png

图1 SERIES公式内参数解析以图1为例对参数进行解析:

name为“图表2!$C$1”,表示将C1单元格中的值作为系列名称显示在图例中。这个参数是可选参数,如省略,就默认为系列1、系列2等。如果图表只有一个数据系列,则默认为图表标题。

category_labels为“图表2!$A$2:$A$5”,表示将A2:A5单元格区域的值作为分类轴标签,也就是横坐标显示值。这个参数也是可选参数,如省略,横坐标就显示为从1开始的连续整数。values为“图表2!$C$2:$C$5”,表示将C2:C5单元格区域的值作为数据系列的具体数值。这是一个必选参数。

order为“2”,表示该数据系列在所有系列中的序号,本例中序号为2。

Function过程

本号之前文章的代码中用到的都是VBA的Sub过程。在VBA中,一个Sub过程就是一种基本的程序单元,使用时通常会将完成某个任务的一系列代码放入一个Sub过程。通过录制宏得到的就是Sub过程,还有一种过程是无法通过录制得到的,它就是Function过程,其实就是在VBA中自定义函数。

这里我们就定义一个可以返回图表数据系列对应单元格区域地址的Function过程。

代码分享

Function rngseries(ByVal Nindex As Integer, ByVal chtchart As Chart) As Range   '定义返回数据系列指定单元格区域地址的Range变量    Dim serseries As Series    Set serseries = chtchart.SeriesCollection(Nindex)   'Nindex是指代数据系列序号的参数,通过SeriesCollection属性抓取指定序号的数据系列    Set rngseries = Range(Split(Split(serseries.Formula, ",")(2), "!")(1))  '两次采用Split函数,将series公式中的values参数中的单元格区域地址提取出来,并赋给rngseries变量    Set serseries = NothingEnd Function

以上代码自定义了一个名为rngseries的Function过程,并定义了两个按值传递的过程参数。其中,Nindex为整形变量,指代数据系列对应序号;chtchart为图表变量。

通过chtchart.SeriesCollection属性可以抓取指定序号的数据系列,这个方法在前面的文章中也应用过。Split函数是将通过serseries.Formula属性返回的公式字符串(图表2!$C$1,图表2!$A$2:$A$5,图表2!$C$2:$C$5,2)按指定分隔符拆分为一维数组。本例中按 “,” 和 “!” 拆分两次后就可以获得values参数中的数据系列所在单元格区域地址。要注意,Split函数分隔的一维数组索引号都是从0开始,所以提取values参数部分,其索引号为2。

这里额外加个鸡腿说明一下过程参数的两种传递方式:按引用传递、按值传递。

按引用传递,过程只会传递保存在变量数据中的内存地址,而不是数据本身,也就是说过程中用来传递的参数可能会被被调用过程中的某些语句修改。

按值传递,也就是在定义被调用过程时,在参数前加上ByVal关键字,这时无论被调用过程中的语句如何修改传递参数的值,执行过程时只会按保存在变量数据中的值运行,不会被修改。

有点绕,不知道解释是否清楚?632bb8c6c49f56a13183ea06ef68805f.png如果实在搞不清,那就请记住在定义参数时在前面都加上ByVal,这样可以避免某些意外的错误。

返回数据系列引用区域地址

再回到正题,我们再写一个Sub主过程调用上面的Function过程来返回数据系列引用区域的地址。代码分享
Sub getsngseries()    Dim chtchart As Chart    Set chtchart = ActiveSheet.ChartObjects(1).Chart    Dim xh As Variant    xh = InputBox("输入要提取的数据系列序号:")    MsgBox rngseries(Int(xh), chtchart).Address     '利用Address属性输出地址    Set chtchart = NothingEnd Sub
主过程中先定义了两个传递参数:数据系列序号xh变量,以及chtchart变量。其中xh变量利用InputBox函数输入。为方便演示,再在菜单栏下插入一个按钮控件(图2),右键编辑按钮文字,并指定给上述主过程(图3)。

f4431a13b1dab9622ac42d12a817215d.png

图2 插入按钮控件

c19689e37ba42d37d61880122af62d1a.png

图3 指定宏

运行效果

29032a671679b7d4d9279b7af50389b8.gif

图4 返回数据系列引用区域的地址

总结本文分享了如何通过VBA快速返回图表中任意数据系列引用的单元格区域的地址,应用了Formula属性、Split函数、Function过程。尽管码了不少字,但这个功能貌似有点儿鸡肋,图表都有了,只要点到图表上睁眼看公式编辑框就好了。好吧,我承认我就是出于兴趣瞎玩一下子,望读者轻喷77de1dd5a701c82977e5860aa0750073.png
内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值