【问题标题】:How can I perform an operation in excel vba for an user-defined range?如何在 excel vba 中为用户定义的范围执行操作?
【发布时间】:2019-03-07 17:15:53
【问题描述】:

我有一系列带有值的单元格,即

我想要一个 for 循环,对 A 列 (1) 中的第一个值、B 列 (3) 中的相邻值和 C 列 (74) 中的相邻值进行平均。我需要用户使用 msgbox 选择这个范围。

到目前为止,我可以在宏记录的帮助下编写此代码:

Sub averager()
    Dim ran As Range, average As Variant, cell1 As Variant, cell2 As Variant
    Dim i As Variant

    Set ran = Application.InputBox(Prompt:="Enter range values: ", Type:=8)

    For i = 0 To i = 8
        ran.Offset(0, 13).Select
        ActiveCell.FormulaR1C1 = "=AVERAGE(RC[-13]:RC[-11])"
        average = WorksheetFunction.average(ran.Text)
    Next i
End Sub

但是,此代码不执行循环,它只返回我选择的偏移位置的第一个三次的平均值。

循环如何对所有值执行操作?

【问题讨论】:

  • 你为什么不直接使用公式并将它们复制下来?
  • 我要学VBA! =D
  • “我想学习 VBA!=D” 然后阅读 How to avoid using Select in Excel VBA 并将该技术应用于您的代码,可能是最好的开始。 • 随后阅读For...Next statement 以获取For 循环的正确语法。
  • 避免使用Variant,这是您可以选择的最糟糕的类型(有时您无法避免,但如果您可以使用更合适的类型)。将上述内容应用于您的代码和edit 并更新您的问题(它可能会改变您的问题,因此您可能需要问其他问题)。
  • 我试图四处阅读,但我没有设法为我的案例实现代码。我希望有一些好的 vba 经验的人可以帮助我。

标签: excel vba for-loop average


【解决方案1】:
  1. 在用户按下 Cancel 按钮时捕获错误。
  2. 您不需要循环,可以一次将公式写入多个单元格。

Option Explicit

Public Sub Averager()        
    Dim ValueRange As Range
    On Error Resume Next 'if user presses cancel this throws an error
    Set ValueRange = Application.InputBox(Prompt:="Select range values: ", Type:=8)
    On Error GoTo 0

    If Not ValueRange Is Nothing Then
        ValueRange.Offset(ColumnOffset:=6).Resize(ColumnSize:=1).FormulaR1C1 = "=AVERAGE(RC[-6]:RC[-4])"
    End If
End Sub

【讨论】:

  • 既然您提出了学习VBA的观点,也许我们可以更好地处理这里的错误? Resume NextGoto 0 可以抑制其他错误,这使调试成为一项挑战。 OP 可能会在更大的上下文中使用这个小宏。
  • @Parfait 我不知道InputBox 行(这是我的错误处理之间的唯一一个)如何在按下取消按钮时抛出任何其他错误。由于该框验证地址本身,它只能返回一个有效的范围对象或False,以防取消(然后由于Set 而引发异常)。实际上我在这里没有看到任何问题,您能否提供更多详细信息以进行调查? • 由于InputBox 要么返回一个对象(需要Set),要么返回一个布尔值False(不允许Set),我认为无论如何都无法在这里处理错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多