我是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
非常感谢您的关注和帮助。
答案 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
仍然是您键入公式的单元格。