我正在尝试使用此公式进行范围单元格的标准偏差
Private Sub cmdStandardDeviation_Click()
txtStandardDeviation = StDev(Range("A19:I19"))
End Sub
但最后我意识到这可能会导致进一步的错误,因为我正在处理这么多的细胞。
我想要做的是通过使用VB Excel中的用户窗体,我希望用户选择所需的单元格范围,然后用户通过单击按钮计算标准偏差,结果将被发布到txtStandardDeviation的输入框。而不是使用上面的语法对其进行编码,因为如果添加新单元格,我写的代码将不再有效。
我认为经过几次试验后这很简单,但我仍然无法做到这一点。非常感谢你的帮助!
答案 0 :(得分:2)
你可以从几个不同的角度来解决这个问题。
如果用户可以直接访问工作表,可能的解决方案是让他们选择他们想要计算的单元格。然后可以使用Selection
在该范围内运行任何函数。
另一种方法是让用户输入文本并将其解析为范围。您可以包含各种类型的字段,如果这些字段可以帮助用户。例如,他们也可以输入要从计算中排除的范围。
如果用户不需要控制特定单元格,则可以在没有任何用户输入的情况下使用动态范围。如果您需要计算所有细胞或已知细胞组,这将很有效。这里我在第二张纸上有两个公式,用COUNTA
计算范围的高度和宽度。
或者您可以使用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