Excel VBA错误438:对象不支持此属性或方法

时间:2014-08-15 15:54:31

标签: vba excel-vba excel

请帮忙,这是我第一次尝试用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

2 个答案:

答案 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方法。也许你的意思是?