Excel VBA中的简单直方图?
我将数据存储在某个列中(比如A列)。列A的长度不是固定的(取决于代码中前面的步骤) 我需要a列中的值的直方图,并将其放在同一张表中。我需要取A列中的值,自动计算M个箱子,然后给出图Excel VBA中的简单直方图?,excel,vba,histogram,Excel,Vba,Histogram,我将数据存储在某个列中(比如A列)。列A的长度不是固定的(取决于代码中前面的步骤) 我需要a列中的值的直方图,并将其放在同一张表中。我需要取A列中的值,自动计算M个箱子,然后给出图 Sub Hist(M As Long, arr() As Single) Dim i As Long, j As Long Dim Length As Single ReDim breaks(M) As Single ReDim freq(M) As Single For i = 1 To M freq(i
Sub Hist(M As Long, arr() As Single)
Dim i As Long, j As Long
Dim Length As Single
ReDim breaks(M) As Single
ReDim freq(M) As Single
For i = 1 To M
freq(i) = 0
Next i
Length = (arr(UBound(arr)) - arr(1)) / M
For i = 1 To M
breaks(i) = arr(1) + Length * i
Next i
For i = 1 To UBound(arr)
If (arr(i) <= breaks(1)) Then freq(1) = freq(1) + 1
If (arr(i) >= breaks(M - 1)) Then freq(M) = freq(M) + 1
For j = 2 To M - 1
If (arr(i) > breaks(j - 1) And arr(i) <= breaks(j)) Then freq(j) = freq(j) + 1
Next j
Next i
For i = 1 To M
Cells(i, 1) = breaks(i)
Cells(i, 2) = freq(i)
Next i
End Sub
我在网上寻找一个“简单”的代码,但所有的代码都非常花哨,有很多我不需要的细节,甚至我都无法使用它。(我是VBA初学者。)
我发现下面的代码似乎可以完成这项工作,但我甚至无法调用该函数。此外,它只做计算,不做绘图
Sub Hist(M As Long, arr() As Single)
Dim i As Long, j As Long
Dim Length As Single
ReDim breaks(M) As Single
ReDim freq(M) As Single
For i = 1 To M
freq(i) = 0
Next i
Length = (arr(UBound(arr)) - arr(1)) / M
For i = 1 To M
breaks(i) = arr(1) + Length * i
Next i
For i = 1 To UBound(arr)
If (arr(i) <= breaks(1)) Then freq(1) = freq(1) + 1
If (arr(i) >= breaks(M - 1)) Then freq(M) = freq(M) + 1
For j = 2 To M - 1
If (arr(i) > breaks(j - 1) And arr(i) <= breaks(j)) Then freq(j) = freq(j) + 1
Next j
Next i
For i = 1 To M
Cells(i, 1) = breaks(i)
Cells(i, 2) = freq(i)
Next i
End Sub
不是100%确定该方法的有效性,但是
- 删除作为您呼叫sub的Paren<代码>历史M,arr
声明为M
,但函数接收为double
;这不起作用,所以在调用例程中将其声明为long
long
- 您需要将
arr()作为变量接收
生成一个二维数组,因此元素是Range->Array
arr(1,1)。。arr(n,1)
- 删除作为您呼叫sub的Paren<代码>历史M,arr
声明为M
,但函数接收为double
;这不起作用,所以在调用例程中将其声明为long
long
- 您需要将
arr()作为变量接收
生成一个二维数组,因此元素是Range->Array
arr(1,1)。。arr(n,1)
- 有点晚了,但我还是想分享我的解决方案。我创建了一个直方图函数,可以在excel电子表格中使用。注意:您必须按
CTRL+SHIFT+ENTER
将公式输入工作簿。输入是直方图的值范围和箱数M。输出范围必须有M行和两列。一列用于存储单元值,一列用于存储单元频率
Option Explicit
Option Base 1
Public Function Histogram(arr As Range, M As Long) As Variant
On Error GoTo ErrHandler
Dim val() As Variant
val = arr.Value
Dim i As Long, j As Integer
Dim Length As Single
ReDim breaks(M) As Single
ReDim freq(M) As Integer
Dim min As Single
min = WorksheetFunction.min(val)
Dim max As Single
max = WorksheetFunction.max(val)
Length = (max - min) / M
For i = 1 To M
breaks(i) = min + Length * i
freq(i) = 0
Next i
For i = 1 To UBound(val)
If IsNumeric(val(i, 1)) And Not IsEmpty(val(i, 1)) Then
If val(i, 1) > breaks(M) Then
freq(M) = freq(M) + 1
Else
j = Int((val(i, 1) - min) / Length) + 1
freq(j) = freq(j) + 1
End If
End If
Next i
Dim res() As Variant
ReDim res(M, 2)
For i = 1 To M
res(i, 1) = breaks(i)
res(i, 2) = freq(i)
Next i
Histogram = res
ErrHandler:
'Debug.Print Err.Description
End Function
虽然有点晚了,但我还是想分享我的解决方案。我创建了一个直方图函数,可以在excel电子表格中使用。注意:您必须按
CTRL+SHIFT+ENTER
将公式输入工作簿。输入是直方图的值范围和箱数M。输出范围必须有M行和两列。一列用于存储单元值,一列用于存储单元频率
Option Explicit
Option Base 1
Public Function Histogram(arr As Range, M As Long) As Variant
On Error GoTo ErrHandler
Dim val() As Variant
val = arr.Value
Dim i As Long, j As Integer
Dim Length As Single
ReDim breaks(M) As Single
ReDim freq(M) As Integer
Dim min As Single
min = WorksheetFunction.min(val)
Dim max As Single
max = WorksheetFunction.max(val)
Length = (max - min) / M
For i = 1 To M
breaks(i) = min + Length * i
freq(i) = 0
Next i
For i = 1 To UBound(val)
If IsNumeric(val(i, 1)) And Not IsEmpty(val(i, 1)) Then
If val(i, 1) > breaks(M) Then
freq(M) = freq(M) + 1
Else
j = Int((val(i, 1) - min) / Length) + 1
freq(j) = freq(j) + 1
End If
End If
Next i
Dim res() As Variant
ReDim res(M, 2)
For i = 1 To M
res(i, 1) = breaks(i)
res(i, 2) = freq(i)
Next i
Histogram = res
ErrHandler:
'Debug.Print Err.Description
End Function
您使用VBA进行此操作有什么原因吗?使用公式化可以轻松创建动态直方图。您使用VBA进行此操作的原因是什么?使用公式可以轻松创建动态直方图