Excel VBA中的简单直方图?

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

我将数据存储在某个列中(比如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) = 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)

对于该方法的有效性不是100%肯定,但是

  • 删除作为您呼叫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进行此操作的原因是什么?使用公式可以轻松创建动态直方图