使用VBA快速创建非规则数据图表

2024-08-26 04:28

本文主要是介绍使用VBA快速创建非规则数据图表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实例需求:工作表中共有4组数据,第一组数据涵盖所有日期,其他3组均为断续数据。

在这里插入图片描述

现在需要创建如下图所示的线图,由于数据区域是非连续的,因此无法直接创建图表。

在这里插入图片描述

需要先将数据表按照日期对齐,如下图所示,才能创建图表。

在这里插入图片描述

Sub Demo()Dim i As Long, j As Long, iCol As Long, ColCnt As LongDim arrData, arrData2, rngData As Range, allDateRng As RangeDim arrRes, iR As Long, oSht As Worksheet, xRng As RangeDim LastRow As Long, aRow, iMin As Long, iMax As LongaRow = Array(2, 5, 8, 11) Sheets(1).Copy After:=Sheets(Sheets.Count)Set oSht = ActiveSheetSet allDateRng = oSht.Range("A" & aRow(0)).CurrentRegionarrData = allDateRng.ValueColCnt = UBound(arrData, 2)Set xRng = allDateRng.Resize(1, ColCnt - 1).Offset(, 1)iMin = Application.Min(oSht.Rows(aRow(0)))For i = 1 To UBound(aRow)Set rngData = oSht.Range("A" & aRow(i)).CurrentRegionarrData2 = rngData.ValueReDim arrRes(1, 1 To ColCnt)arrRes(0, 1) = arrData2(1, 1)arrRes(1, 1) = arrData2(2, 1)For j = 2 To UBound(arrData2, 2)iCol = CLng(arrData2(1, j)) - iMin + 2arrRes(0, iCol) = arrData2(1, j)arrRes(1, iCol) = arrData2(2, j)NextrngData.Resize(, ColCnt).Value = arrResNextDim oShp As Shape, oCht As Chart, oSer As Series, serRng As RangeFor i = 1 To UBound(aRow)Set serRng = allDateRng.Rows(1).Offset(aRow(i) - aRow(0) + 1)Set allDateRng = Application.Union(allDateRng, serRng)NextSet oShp = ActiveSheet.Shapes.AddChart2(332, xlLineMarkers)oShp.Top = oSht.Range("A15").Top: oShp.Left = 0Set oCht = oShp.ChartoCht.SetSourceData allDateRng
End Sub

【代码解析】
第6行代码创建数组,其中每个元素代表一个图表数据的起始行号。在此示例中,数据间隔是规律化的,也可以使用循环获取数据区域。
第7行代码将数据表复制一份,并保存在当前工作簿中的最后位置。
第8行代码获取新创建的工作表对象。
第9行代码获取第一个数据区域。
第10行代码将数据区域的值加载到数组中。
第11行代码获取数据的列数。
第12行代码获取首行数据区域,注意此处不保护首列。
第13行代码获取首行数据区域中的最小日期。
第14~26行代码循环处理后续数据区域。
第15行代码获取数据区域。
第16行代码将数据加载到数组中。
第17行代码声明一个用于保存结果的数组。
第18~19行代码用于读取数据区域的首列两个单元格内容。
第20~24行代码循环处理后续数据。
第21行代码获取当前日期所在列的序号。
第22~23行代码用于将指定列两个单元格内容填充到对应的列,实现日期对齐。
第25行代码将整理后的数据区域写入工作表。
第28~31行代码循环遍历数据区域,将数据单元格区域组合为一个Range对象allDateRng。
第32行代码创建一个线图。
第33行代码调整图表的位置。
第34行代码获取图表对象。
第35行代码设置图表的数据源单元格区域。

运行示例代码,效果如下图所示。

在这里插入图片描述

这篇关于使用VBA快速创建非规则数据图表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107538

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与