请帮忙,这是我第一次尝试用VBA编写有用的东西,现在我正在自学。我得到了上面的错误。请帮忙
Sub Bezier()
Dim C As Double, k As Integer, ansx As Double, ansy As Double, t As Double, n As Integer
n = 3
For i = 0 To 100
t = i * 0.01
ansx = 0
ansy = 0
For k = 0 To n
C = (WorksheetFunction.Fact(n) / WorksheetFunction.Fact(k)) / WorksheetFunction.Fact(n - k)
ansx = ansx + Cells(k + 2, 1).Value * C * WorksheetFunction.Power(t, k) * WorksheetFunction.Power(1 - t, n - k)
ansy = ansy + Cells(k + 2, 2).Value * C * WorksheetFunction.Power(t, k) * WorksheetFunction.Power(1 - t, n - k)
Next
Cells(i + 2, 6).Value = ansx
Cells(i + 2, 7).Value = ansy
Next
End Sub
答案 0 :(得分:3)
首先,您应该知道,工作表上使用的某些功能有局限性。所以我的观点是避免在VBA中使用它们,如果没有必要的话
例如,函数POWER()
在尝试将零提升为零时返回错误。另一种方法是使用0 ^ 0
组合,它完全相同,但看起来更简单,操作时没有这样的错误。
但是VBA中没有FACT()
函数的嵌入式替代方法,因此您可以使用它,或者只是添加自己的function factor()
- 它可以帮助您选择。
如果您刚刚开始学习VBA,我建议您使用Option Explicit
。它将帮助您找出哪些变量未定义,有时可以避免与变量名称missprint相关的错误。
以下是您的代码,已修复并进行了一些优化:
Option Explicit' It is an option that turns on check for every used variable to be defined before execution. If this option is not defined, your code below will find undefined variables and define them when they are used. Good practice is to use this option, because it helps you, for example to prevent missprinting errors in variable names.
Sub Bezier()
Dim C as Double , t As Double
Dim k As Long, n As Long, i As Long
n = 3
For i = 0 To 100
t = i * 0.01
Cells(i + 2, 6) = 0
Cells(i + 2, 7) = 0
For k = 0 To n
C = (WorksheetFunction.Fact(n) / WorksheetFunction.Fact(k)) / WorksheetFunction.Fact(n - k)
Cells(i + 2, 6) = Cells(i + 2, 6).Value + Cells(k + 2, 1).Value * C * (t ^ k) * ((1 - t) ^ (n - k))
Cells(i + 2, 7) = Cells(i + 2, 7).Value + Cells(k + 2, 2).Value * C * (t ^ k) * ((1 - t) ^ (n - k))
Next
Next
End Sub
<强>更新强>
以下是一些因子计算的例子。
Public Function fnFact(number) ' a simple cycle example of Factorial function
Dim tmp As Long ' new temporary variable to keep the "number" variable unchanged
tmp = number
fnFact = number
While tmp > 1
tmp = tmp - 1
fnFact = fnFact * tmp
Wend
End Function
Public Function fnFactR(number) ' a simple example of recursive function for Factorial calculation
If number > 0 Then
fnFactR = fnFactR(number - 1) * number ' function calls itself to continue calculations
Else
fnFactR = 1 ' function returns {1} when calculations are over
End If
End Function
Sub Factor_test() 'RUN ME TO TEST ALL THE FACTORIAL FUNCTIONS
Dim number As Long
number = 170 ' change me to find Factorial for a different value
MsgBox "Cycle Factorial:" & vbNewLine & number & "!= " & fnFact(number)
MsgBox "WorksheetFunction Factorial:" & vbNewLine & number & "!= " & WorksheetFunction.Fact(number)
MsgBox "Recursive Factorial:" & vbNewLine & number & "!= " & fnFactR(number)
End Sub
由于结果值较大,所有这些函数仅可用于 170 之前的数字计算因子。
因此,对于我的PC,WorksheetFunction.Fact()
功能的限制也是170
让我知道,如果你的电脑对这个功能有不同的限制,那么这是非常有趣的事情。 :)
<强> UPDATE2 强>
当需要整数(或整数)变量时,建议使用Long
数据类型而不是Integer
每种类型。 Long
稍微快一点,它有更广泛的限制,并且不需要额外的内存。以下是证明链接:
1. MSDN:The Integer, Long, and Byte Data Types
2. ozgrid.com:Long Vs Integer
3. pcreview.co.uk:VBA code optimization - why using long instead of integer?
感谢@Ioannis和@chris neilsen提供有关Long
数据类型和证明链接的信息!
祝你在进一步的VBA行动中好运!
答案 1 :(得分:0)
我在WorksheetFunction
对象上找不到pow
方法。但是有一种Power
方法。也许你的意思是?