在VBA中使用Excel FREQUENCY函数生成直方图时遇类型不匹配错误
问题根源
WorksheetFunction.Frequency返回的是一维数组(长度等于区间数+1),不是单个整数。你直接把它赋值给Integer类型的binCount变量,必然触发类型不匹配错误,同时也无法将数组直接赋值给单个单元格。
修正方案
1. 用Variant变量接收频数数组
Variant类型可以容纳数组,先把Frequency的结果存起来:
Dim freqArray As Variant ' 注意:所有Cells引用必须加ws3限定,避免指向ActiveSheet freqArray = WorksheetFunction.Frequency( _ ws3.Range(ws3.Cells(2, emptycol + 1), ws3.Cells(23, emptycol + 1)), _ ws3.Range(ws3.Cells(2, emptycol + 3), ws3.Cells(num_bins, emptycol + 3)) _ )
2. 输出全部频数到工作表
Frequency返回的数组长度为num_bins + 1(最后一个元素是超过最大区间的频数),直接将数组转置后赋值给对应大小的单元格区域:
' 转置数组并输出到emptycol+4列的连续行 ws3.Range(ws3.Cells(2, emptycol + 4), ws3.Cells(2 + UBound(freqArray), emptycol + 4)).Value = Application.Transpose(freqArray)
3. 提取单个区间的频数(如果需要)
如果只需要某个特定区间的频数,直接从数组中提取(数组下标从1开始):
' 提取第一个区间的频数 Dim firstBinCount As Integer firstBinCount = freqArray(1) ws3.Cells(2, emptycol + 4).Value = firstBinCount
关键注意点
- 原代码中
Range(Cells(...))的Cells没有指定工作表,会默认引用ActiveSheet,必须加上ws3.前缀确保指向目标工作表。 - Frequency返回的是水平数组,需要用
Application.Transpose转成垂直方向,才能匹配列方向的单元格。
内容的提问来源于stack exchange,提问作者kca062
相关产品推荐
相关产品推荐

