如何使用Excel VBA对所需的细胞范围进行标准偏差?

时间:2015-06-22 07:55:13

标签: excel excel-vba vba

我正在尝试使用此公式进行范围单元格的标准偏差

Private Sub cmdStandardDeviation_Click() 
txtStandardDeviation = StDev(Range("A19:I19"))
End Sub

但最后我意识到这可能会导致进一步的错误,因为我正在处理这么多的细胞。

我想要做的是通过使用VB Excel中的用户窗体,我希望用户选择所需的单元格范围,然后用户通过单击按钮计算标准偏差,结果将被发布到txtStandardDeviation的输入框。而不是使用上面的语法对其进行编码,因为如果添加新单元格,我写的代码将不再有效。

我认为经过几次试验后这很简单,但我仍然无法做到这一点。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

你可以从几个不同的角度来解决这个问题。

  • 使用选择
  • 让用户输入范围为文本
  • 从命名范围或VBA
  • 动态获取范围

选择

如果用户可以直接访问工作表,可能的解决方案是让他们选择他们想要计算的单元格。然后可以使用Selection在该范围内运行任何函数。

Using Selection as range

文字输入

另一种方法是让用户输入文本并将其解析为范围。您可以包含各种类型的字段,如果这些字段可以帮助用户。例如,他们也可以输入要从计算中排除的范围。

Using Text as range

命名范围

如果用户不需要控制特定单元格,则可以在没有任何用户输入的情况下使用动态范围。如果您需要计算所有细胞或已知细胞组,这将很有效。这里我在第二张纸上有两个公式,用COUNTA计算范围的高度和宽度。

Name Manager

VBA

或者您可以使用VBA指定要完全计算的范围。在此示例中,我使用SpecialCells(xlCellTypeConstants)获取所有值。

示例设置

Option Explicit

Private Function ParseRangeInput(textInput As String) As Range
On Error GoTo ErrHandler:
  Dim rangeOutput As Range
  Set rangeOutput = ActiveSheet.Range(textInput)
  Set ParseRangeInput = rangeOutput
Exit Function
ErrHandler:
  Debug.Print textInput & " Could not be converted to range."
  Set ParseRangeInput = Null
End Function

Private Function StDevWithSelection() As Double
On Error GoTo ErrHandler:
  StDevWithSelection = WorksheetFunction.StDev(Selection)
Exit Function
ErrHandler:
  Debug.Print "Couldn't get StDev with selection."
  StDevWithSelection = 0
End Function

Private Function StDevWithManualRange() As Double
On Error GoTo ErrHandler:
  Dim rangeTarget As Range
  Set rangeTarget = ParseRangeInput(TextManual.Text)
  StDevWithManualRange = WorksheetFunction.StDev(rangeTarget)
Exit Function
ErrHandler:
  Debug.Print "Couldn't get StDev with manual range."
  StDevWithManualRange = 0
End Function

Private Function StDevWithNamedRange() As Double
On Error GoTo ErrHandler:
  Dim rangeTarget As Range
  Set rangeTarget = ActiveSheet.Range("Numbers")
  StDevWithNamedRange = WorksheetFunction.StDev(rangeTarget)
Exit Function
ErrHandler:
  Debug.Print "Couldn't get StDev with named range."
  StDevWithNamedRange = 0
End Function

Private Function StDevWithVBARange() As Double
On Error GoTo ErrHandler:
  Dim rangeTarget As Range
  Set rangeTarget = ActiveSheet.Range("A:Z").Cells _
                               .SpecialCells(xlCellTypeConstants)
  StDevWithVBARange = WorksheetFunction.StDev(rangeTarget)
Exit Function
ErrHandler:
  Debug.Print "Couldn't get StDev with VBA range."
  StDevWithVBARange = 0
End Function

Private Sub ButtonGo_Click()
  If OptionSelection.Value = True Then
    TextResults.Text = StDevWithSelection
  ElseIf OptionManual.Value = True Then
    TextResults.Text = StDevWithManualRange
  ElseIf OptionNamed.Value = True Then
    TextResults.Text = StDevWithNamedRange
  ElseIf OptionVBA.Value = True Then
    TextResults.Text = StDevWithVBARange
  Else
    Debug.Print "No option selected."
  End If
End Sub