使用VBA巧妙获取图表数据源区域

在日常工作中,使用VBA操作Excel图表是经验遇到的工作创建。

示例图表如下:

在这里插入图片描述

使用如下代码可以更新图表的数据源区域,增加一个数据系列。

Sub UpdateChart()ActiveSheet.ChartObjects(1).ActivateActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$D$6")
End Sub

更新后的图表如下所示。

在这里插入图片描述

代码很简单,即使大家不知道SetSourceData方法,也可以通过录制宏的方法获得代码。

现在问题来了,如何读取图表的数据源区域呢?Chart对象并没有SourceData属性,也没有GetSourceData方法。这只能说明微软并未提供相应的接口,我们仍然可以使用变通的方法来获取图表的数据源区域。

示例代码如下:

Sub GetDataSource()Dim objCht As chart, sFormula As StringDim aTxt, topRightCell As Range, bottomLeftCell As RangeSet objCht = ActiveSheet.ChartObjects(1).chartsFormula = objCht.SeriesCollection(1).FormulaaTxt = Split(sFormula, ",")With Range(aTxt(1))Set topRightCell = .Cells(.Cells.Count)End WithsFormula = objCht.SeriesCollection(objCht.SeriesCollection.Count).FormulaaTxt = Split(sFormula, ",")Set bottomLeftCell = Range(aTxt(2)).Cells(1)With Range(topRightCell, bottomLeftCell)Debug.Print "图表数据源所在工作表:" & .Parent.NameDebug.Print "图表数据源地址:" & .AddressEnd With
End Sub

【代码解析】
第4行代码获取活动工作表中的第一个Chart对象,需要注意的是ChartObject和Chart是两个不同的对象,Chart对象是ChartObject对象的子对象。
第5行代码获取图表中第一个系列的公式,输出如下所示。

 =SERIES(Sheet11!$A$2,Sheet1!$B$1:$D$1,Sheet1!$B$2:$D$2,1)

其语法格式如下:

=SERIES(<series name>,<x values>,<y values>,<plot order>)

第6行代码使用逗号作为分隔符拆分公式,结果数组下标下界为零。
第7行代码中aTxt(1)为数组中第二个元素,即x轴的值对应的单元格区域(下文简称为x轴区域),即:Sheet1!$B$1:$D$1,这种包含Sheet1!的字符串可以作为Range( )的参数,无需进一步拆分。
第8行代码获取x轴区域的最后一个单元格,即图表数据区域的右上角单元格。
第10行代码获取图表最后一个系列的公式,其中objCht.SeriesCollection.Count为图表中系列的总数。
第12行代获取y轴区域的第一个单元格,即图表数据区域的左下角单元格。
第13行代码使用两个边角单元格获取图表数据区域。
第14行代码输出工作表名称。
第14行代码输出数据源地址。

输出结果如下:

图表数据源所在工作表: Sheet1
图表数据源地址:$B$1:$D$6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/617336.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客研究生复试刷题(1)

KY30进制转换 1.最开始没有考虑到大数问题,可以说是没考虑完全,输入类型使用的是int64_t,只ac了一半测试用例。所以在数很大找不到合适的数据类型存储时,要考虑使用string来存放。 2.使用string存放数字的时候就要考虑:字符和数字之间的转换。字符转换成数字:str[i]-0,…

从 0 搭建公司Jenkins服务 Centos7

从 0 搭建公司Jenkins服务 Centos7 安装 (运维人员) 安装环境 配置DNS安装JDK17安装Jenkins安装Docker安装GIT安装Ansible启动Jenkins安装插件配置凭据配置共享库配置 (开发经理)使用 (开发、测试人员) 安装 (运维人员) 安装环境 配置DNS 新安装系统的服务器无法解析域名&a…

CMake 学习笔记2

其他很好的总结 CMake教程系列-01-最小配置示例 - 知乎 CMake 保姆级教程&#xff08;上&#xff09; | 爱编程的大丙 10-补充(完结)_哔哩哔哩_bilibili 1、基本关键字 SET命令的补充 &#xff08;1&#xff09;SET命令设置执行标准 #增加-stdc11 set(CMAKE_CXX_STANDARD…

二、Flask会话技术和模板语言

Cookie Session # views.py: 路由 + 视图函数 import datetimefrom flask import Blueprint, render_template, request, redirect, session from .models import *# 蓝图 blue = Blueprint(user, __name__)# 首页 可以写两个路由,都是访问同一个函数 @blue.route(/) @blue.ro…

【算法基础2】前缀和与差分

目录 前缀和与差分1.综述2.前缀和&#xff08;1&#xff09;一维前缀和&#xff08;2&#xff09;二维前缀和&#xff08;子矩阵的和&#xff09; 3.差分&#xff08;1&#xff09;一维差分&#xff08;2&#xff09;二维差分&#xff08;差分矩阵&#xff09; 前缀和与差分 1…

简介:基于Web的产品3D

基于 Web 的产品 3D 通过可视化界面获得各种选项来个性化他们的产品&#xff0c;例如颜色、材料、尺寸、文字、徽标、零件等。 在过去几年中&#xff0c;随着 3D 建模和渲染软件的出现&#xff0c;3D 渲染现在更常用于营销和促销目的。设计师、制造商和营销人员使用 3D 产品渲…

64B/66B编码

一、前言 8B/10B编码主要作用的优化直流平衡&#xff0c;从8bit中插2个bit进去&#xff0c;这样的话最终效果能够使长0或者长1的位数不超过5位&#xff0c;达到很好的效果。但是由于8B/10B编码的带宽利用率非常低&#xff0c;10G的带宽只有8G在传输有效数据&#xff0c;2G的带…

Java | Leetcode Java题解之第27题移除元素

题目&#xff1a; 题解&#xff1a; class Solution {public int removeElement(int[] nums, int val) {int left 0;int right nums.length;while (left < right) {if (nums[left] val) {nums[left] nums[right - 1];right--;} else {left;}}return left;} }

GAN:对抗生成网络【通俗易懂】

一、概述 对抗生成网络&#xff08;GAN&#xff09;是一种深度学习模型&#xff0c;由两个神经网络组成&#xff1a;生成器G和判别器D。这两个网络被训练来协同工作&#xff0c;以生成接近真实数据的新样本。 生成器的任务是接收一个随机噪声向量&#xff0c;并将其转换为与真…

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

C++11---多线程

看前须知&#xff1a;如果对线程不了解的&#xff0c;可以先去看Linux---多线程(上)&#xff0c;(下)这两篇文章 那里主要讲了线程的一些基础概念和底层相关理解&#xff0c;对我们阅读这篇文章会有所帮助 一、thread --- 线程 1、thread相关接口介绍 在C11之前&#xff0c;涉…

第7期 部署两地三中心解决方案SDRS+CBR

第7期 部署两地三中心解决方案SDRSCBR 1.实施步骤&#xff08;部署跨可用区容灾&#xff09;配置跨可用区容灾操作场景约束与限制创建保护组 什么是SDRS什么是CBR什么是两地三中心容灾方案&#xff08;SDRSCBR&#xff09;应用场景方案优势三种容灾方案对比 2.两地三中心方案原…