如何使用Excel VBA对所需的单元格范围进行标准偏差?

我正在尝试使用此公式来执行测距单元的标准偏差

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

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

我想要做的是通过使用从VB Excel的用户表单,我希望用户select所需的单元格范围,然后用户计算一个button的点击标准差,结果将被张贴到input框txtStandardDeviation。 而不是我使用上面的语法编码,因为如果添加新的单元格,我写的代码不再有效。

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

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

  • 使用select
  • 让用户以文本formsinput范围
  • 从命名范围或VBAdynamic获取范围

select

如果用户直接访问工作表,可能的解决scheme是让他们select他们希望计算的单元格。 然后可以使用Selection在该范围上运行任何函数。

使用选择作为范围

文本input

另一种方法是让用户input文本并将其parsing为范围。 你可以包括各种types的领域,如果这是帮助用户的东西。 例如,他们也可以input范围从计算中排除。

使用文本作为范围

命名范围

如果用户不需要控制特定的单元格,则可以使用dynamic范围,而无需任何用户input。 如果您需要计算所有单元格或已知的一组单元格,这将工作得很好。 在这里,我有第二个表格上的两个公式,用COUNTA计算范围的高度和宽度。

名称经理

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