VBA用户定义函数中的循环错误

时间:2017-09-12 08:38:24

标签: excel vba excel-vba excel-udf

我是VBA编程的新手,并编写了一个用于插值的VBA函数。 我试图从单元格C17和C列中的其他单元格获得输入函数" WindPressure"

然后该函数从C列获得输入(高于地面z(m)的高度)并进行插值以获得设计风压,但由于圆形误差,我失败了。

代码如下:

Function WindPressure(z As Double) As Double

      Dim Row_Nos As Integer

      Dim x1 As Double
      Dim x2 As Double
      Dim x3 As Double

      Dim y1 As Double
      Dim y2 As Double
      Dim y3 As Double

      ' Select first line of data.
      Range("T13").Select

      ' Set Nos of row to interploate
      Row_Nos = 12

      ' Interpolation for Design Wind pressure
      For i = 0 To Row_Nos

         ' Case 1: <= 5m
         If i = 0 And z <= ActiveCell.Value Then

            WindPressure = ActiveCell.Offset(0, 1).Value

            ' Shifting Back
            ActiveCell.Offset(0, -1).Select

            'Exit If Enter this if statement
            Exit Function

         ElseIf i >= 0 And z <= ActiveCell.Value Then


         ' Case 2: > 5m
            x1 = z

            x2 = ActiveCell.Offset(-1, 0).Value

            x3 = ActiveCell.Offset(2, 0).Value

            y2 = ActiveCell.Offset(-2, 1).Value

            y3 = ActiveCell.Offset(2, 0).Value

            y1 = ((x1 - x3) / (x2 - x3) * (y2 - y3)) + y3
            WindPressure = y1

            ' Shifting Back
            ActiveCell.Offset(-1, -1).Select

            'Exit If Enter this if statement
            Exit Function

         End If
            ActiveCell.Offset(1, 0).Select
      Next i


End Function
  1. 有人能告诉我我的剧本中哪一步错了
  2. 有没有方便测试功能?因为它不像通过单击F5按钮直接执行的过程
  3. 非常感谢您的关注和帮助。

2 个答案:

答案 0 :(得分:2)

这是如何使用 F5 F8 作为程序调试它:

Public Sub TestMe()

    Debug.Print windpressure(7)

End Sub

Function windpressure(z As Double) As Double

    Stop
    'the rest of the function
'    Dim Row_Nos As Integer
'    Dim x1 As Double
'    Dim x2 As Double
'    Dim x3 As Double

End Function

现在按 F8 运行TestMe并享受调试。

另一种方法是在即时窗口中编写?WindPressure(7)并在VB编辑器中设置停止符号。它将逐行进行。

关于错误,从功能中删除Select部分,VBA不允许您在那里使用它。

答案 1 :(得分:1)

正如@ YowE3K指出的那样,当函数试图修改环境时,调试没有帮助。

因此,您的代码会尝试选择它在UDF中无法执行的范围T13。在此之后,对ActiveCell的任何引用都是错误的,并且尝试更改活动单元格失败,因为您无法修改环境。

另一方面,你也没有把Option Explicit放在模块的顶部,否则它也会抱怨你没有宣布变量i

因此,不要只更改ActiveCell,而只需设置对所需单元格的引用。无论何时使用ActiveCell,都要使用该范围引用。

Option Explicit

Function WindPressure(z As Double) As Double

      Dim Row_Nos As Integer

      Dim x1 As Double
      Dim x2 As Double
      Dim x3 As Double

      Dim y1 As Double
      Dim y2 As Double
      Dim y3 As Double

      Dim i As Long
      Dim rT13 As Range

      ' Select first line of data.
      'Range("T13").Select '**** Won't work in a UDF ****
      Set rT13 = Range("T13") 'Set a reference to T13 instead.


      ' Set Nos of row to interploate
      Row_Nos = 12

      ' Interpolation for Design Wind pressure
      For i = 0 To Row_Nos

         ' Case 1: <= 5m
         If i = 0 And z <= rT13.Value Then

            WindPressure = rT13.Offset(0, 1).Value

            'Exit If Enter this if statement
            Exit Function

         ElseIf i >= 0 And z <= rT13.Value Then


         ' Case 2: > 5m
            x1 = z

            x2 = rT13.Offset(-1, 0).Value

            x3 = rT13.Offset(2, 0).Value

            y2 = rT13.Offset(-2, 1).Value

            y3 = rT13.Offset(2, 0).Value

            y1 = ((x1 - x3) / (x2 - x3) * (y2 - y3)) + y3
            WindPressure = y1

            'Exit If Enter this if statement
            Exit Function

         End If
      Next i

End Function

要检查您的代码,您可以在Range("T13").Select上设置一个断点,并在ActiveCell.Address上添加一个监视 - 当代码到达该行时,您会看到ActiveCell仍然是您键入公式的单元格。