使用 Excel VBA 将离散数据点转换为直方图
本文介绍了一种使用 Excel VBA 将离散数据点转换为直方图的方法。
引言
本文介绍了一种使用 Excel VBA 将离散数据点转换为直方图的方法。 它利用 VBA 中的用户窗体从 Excel 本身的工作表或单独存储的文本文件中检索数据。
背景
在许多工程领域中,通常会从各种系统收集大量测试数据。 此数据可以是压力、温度、电压、电流、速度或需要收集的任何其他类型的数据。 通常,用于收集和存储此数据的测试设备会将每个数据点作为特定时间的离散点集进行跟踪。 这种类型的数据通常称为时程数据,因为它显示了所收集数据的基于时间的历史记录。 PC 上的性能监视器上的滚动线就是这种类型数据的示例。
但在许多情况下,这种时程类型的数据对于数学或工程分析来说并不是很有用。 这就是直方图发挥作用的地方。 时程数据可以转换为通常称为水平时间数据或直方图的数据。
直方图显示了被检查数据落在指定范围内的次数。 通常使用多个范围或箱,以便可以表示整个数据范围。
像大多数工程师一样,我需要将时程数据转换为水平时间数据,因此解决方案是创建一个 Excel 加载项来帮助自动化此任务。 有许多商业软件可以快速有效地完成此任务,但我没有这些预算,而且可以使用 Excel。
我几年前开发了这个解决方案,并决定将其制作成 Code Project 文章,以回应 StackOverflow 上的这个问题。
使用代码
此项目中的大部分代码是用户界面,用于让 Excel 帮助用户选择要转换的数据并指定应如何划分数据。 创建用户窗体和对其上的控件进行编程的实际机制不是本文的主要主题。
上面的用户窗体允许用户选择多个选项
- 1 通道或 2 通道数据转换
- 数据源,可以是文本文件或工作表上的单元格区域
- 数据应排序到的箱数
用户选择数据后,将找到最小值和最大值。 然后,用户可以输入要将数据排序到的箱数。 输入箱数后,将计算并显示箱大小。
要传达的关键信息是将时程数据实际转换为水平时间数据的代码。
PutDataInBins()
方法用于该功能,以下代码摘录是实际转换发生的地方:
'Calculate what bin the data belongs in.
For RowNumber = 0 To NumberOfDataLines - 1
BinNumber0 = Int((DataValueList(RowNumber, 0) - MinimumValue(0)) / BinSize(0))
If chanDimension = 2 Then
BinNumber1 = Int((DataValueList(RowNumber, 1) - MinimumValue(1)) / BinSize(1))
Else
BinNumber1 = 0
End If
BinCount(BinNumber0, BinNumber1) = BinCount(BinNumber0, BinNumber1) + 1
Next
进行转换的关键计算只有一行代码
BinNumber0 = Int((DataValueList(RowNumber, 0) - MinimumValue(0)) / BinSize(0))
BinNumber0
表示放置当前数据点的箱的编号。 DataValueList
是当前数据点的值。 MinimumValue
表示该通道中所有数据点的最小值,BinSize
是每个箱的计算大小。 这些计算确定哪个箱号应该为此数据点添加计数。
上面的用户窗体屏幕截图中显示的示例使用示例数据文件 testdata.txt,它是 zip 文件下载的一部分。 这是保存为时程数据或顺序数据点的一个数据通道。 下面显示了这些 10000 个数据点的图形表示
然后,该加载项将数据转换为水平时间或直方图格式,并将数据放置在 10 个离散的箱中。 下面显示了输出和从输出数据创建的图表
该加载项可以按原样使用,也可以修改为自动化单通道转换的图表创建过程。
兴趣点
Excel VBA 充满了各种陷阱和注意事项,但这个项目足够简单,不会遇到任何更严重的问题。
请记住,除非您明确告知 VBA 不同的内容,否则所有数组和集合都是基于 1 的,而不是基于 0 的。 即使您声明数组是基于 0 的,内置的 Excel 集合对象仍然是基于 1 的。