Excel VBA:我的程序抛出编译错误ByRef

Excel VBA:我的程序抛出编译错误ByRef,excel,vba,compiler-errors,byref,Excel,Vba,Compiler Errors,Byref,我正在使用一个正在运行的程序。我制作了一份副本,从中测试代码,使代码更加模块化。下面是一个循环中的一个子循环,通过调用第一个子循环而变为两个子循环 Sub Trendline() Dim eqn, name As String Dim cht As ChartObject Dim i As Integer For Each cht in Worksheets(1).ChartObjects If cht.Chart.SeriesCollection(1).Trendlines.Count

我正在使用一个正在运行的程序。我制作了一份副本,从中测试代码,使代码更加模块化。下面是一个循环中的一个子循环,通过调用第一个子循环而变为两个子循环

Sub Trendline()
Dim eqn, name As String
Dim cht As ChartObject
Dim i As Integer
For Each cht in Worksheets(1).ChartObjects
    If cht.Chart.SeriesCollection(1).Trendlines.Count > 0 Then
        cht.Activate
        name = Split(ActiveChart.name)(1)
        i = Worksheets(name).Range("Z2").Value 'indicates what kind of trendline
        eqn = ActiveChart.SeriesCollection(1).Trendlines(1).DataLabel.Text
        'the trendline has both R-square and Equation displayed
        eqn = Split(eqn, Chr(10))(0)
        Worksheets(name).Range("AA1").Value = MakeEqn(i, eqn)
    End If
Next cht
End Sub

Function MakeEqn(i As Integer, eqn As String) As String
'1 is linear, 2 polynomial, 3 polynomial order 3
'4 is power, 5 exponential, 6 logarithmic
    eqn = Replace(eqn, "y = ", "")
If i = 6 Then ' removes 6 from options
    eqn = Replace(eqn, "ln", "*LN")
    'Break
Else
    eqn = Replace(eqn, "x", "*x")
    If i = 1 Then ' removes 1 from options
        'Break
    ElseIf i = 5 Then ' removes 5 from options
        eqn = Replace(eqn, "e", "*EXP(")
        eqn = eqn & ")" ' add ")" to end of string
        ' Break
    ElseIf i = 4 Then ' removes 4 from options
        eqn = Replace(eqn, "x", "x^")
        'Break
    Else ' for both 2 and 3
        eqn = Replace(eqn, "x2", "x^2") ' 2 is now done
        If i = 3 Then
            eqn = Replace(eqn, "x3", "x^3")
        End If
    End If
End If
MakeEqn = eqn
End Function
在这里,MakeEqn调用中的“eqn”被突出显示,并抛出以下编译错误。


我很沮丧,因为我正在将一个字符串传递到一个调用字符串的函数中,但编译器声称存在类型不匹配。我应该在这里做什么?

确实有问题,因为变量
eqn
在示例的第二行隐式声明为变量类型:
Dim eqn,名称为String
。在VBA中,即使在同一行中,也需要显式声明每个变量(除非它确实是变量),如下所示:

Dim eqn As String, name As String

确实存在问题,因为变量
eqn
在示例的第二行被隐式声明为变量类型:
Dim eqn,名称为String
。在VBA中,即使在同一行中,也需要显式声明每个变量(除非它确实是变量),如下所示:

Dim eqn As String, name As String

TrendLine
子例程中,您已将
eqn
声明为
变体

Dim eqn, name As String
MakeEqn
函数中,您希望(通过引用)收到
字符串

Function MakeEqn(i As Integer, eqn As String) As String
Function MakeEqn(i As Integer, ByVal eqn As String) As String
不能将
变量
传递给
ByRef
字符串
。(它将生成“ByRef参数类型不匹配”错误。)


最简单的修复方法是将
eqn
声明为
TrendLine
中的
String
,即

Dim eqn As String, name As String
或者,您可以传递变量
ByVal
,这将强制从
变量
转换为
字符串

Function MakeEqn(i As Integer, eqn As String) As String
Function MakeEqn(i As Integer, ByVal eqn As String) As String

TrendLine
子例程中,您已将
eqn
声明为
变体

Dim eqn, name As String
MakeEqn
函数中,您希望(通过引用)收到
字符串

Function MakeEqn(i As Integer, eqn As String) As String
Function MakeEqn(i As Integer, ByVal eqn As String) As String
不能将
变量
传递给
ByRef
字符串
。(它将生成“ByRef参数类型不匹配”错误。)


最简单的修复方法是将
eqn
声明为
TrendLine
中的
String
,即

Dim eqn As String, name As String
或者,您可以传递变量
ByVal
,这将强制从
变量
转换为
字符串

Function MakeEqn(i As Integer, eqn As String) As String
Function MakeEqn(i As Integer, ByVal eqn As String) As String

您已在
TrendLine
中将
eqn
声明为
变体。将其声明为
字符串
(即
Dim eqn作为字符串,name作为字符串
)。如果
函数
希望收到
字符串
,则不能将
变量
传递到函数
ByRef
。再一次,您的屏幕截图与您发布的代码不匹配。(但至少这次发布的代码包含了足够的相关信息,能够重现和识别错误:))您已在
TrendLine
中将
eqn
声明为
变体。将其声明为
字符串
(即
Dim eqn作为字符串,name作为字符串
)。如果
函数
希望收到
字符串
,则不能将
变量
传递到函数
ByRef
。再一次,您的屏幕截图与您发布的代码不匹配。(但至少这次发布的代码包含了足够的相关信息,能够重现和识别错误:)(哇,这对我来说完全是误传。我不知道。@LKadue不同类型的Visual Basic有不同的规则-在VB.Net中(如果我没记错的话)
Dim eqn,name As String
会声明这两个变量的类型都是
String
。因此,您需要注意的是,您所读/所教的内容与您正在使用的VB的特定“味道”相关。@YowE3K:注意得很好,谢谢。然而,这个问题被标记为excelvba:-)Gene,这是对OP的一个评论,他说了我认为的意思,他/她被教导了一些不同的东西。所以我只是指出,他们可能已经学到了一些与VB.Net相关的东西,他们不应该假设VBA的行为也一样。(你的回答很好——我对此没有异议。)@YowE3K:我认为你的观点是对的:“……他们不应该认为VBA的行为会是一样的”,因为这是不可避免的。再次感谢,一个很好的评论。哦,哇,这对我来说完全是误传。我不知道。@LKadue不同类型的Visual Basic有不同的规则-在VB.Net中(如果我没记错的话)
Dim eqn,name As String
会声明这两个变量的类型都是
String
。因此,您需要注意的是,您所读/所教的内容与您正在使用的VB的特定“味道”相关。@YowE3K:注意得很好,谢谢。然而,这个问题被标记为excelvba:-)Gene,这是对OP的一个评论,他说了我认为的意思,他/她被教导了一些不同的东西。所以我只是指出,他们可能已经学到了一些与VB.Net相关的东西,他们不应该假设VBA的行为也一样。(你的回答很好——我对此没有异议。)@YowE3K:我认为你的观点是对的:“……他们不应该认为VBA的行为会是一样的”,因为这是不可避免的。再次感谢,一个伟大的评论。