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

我正在运行一个正在运行的程序。 我做了一个副本,以testing使我的代码更模块化。 下面是一个循环内部的一个子运行,通过调用第一个运行变为两个子运行。

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”突出显示,并引发以下编译错误。 编译错误:ByRef

我感到沮丧,因为我传递一个string到函数调用一个string,但编译器声称有一个types不匹配。 我应该在这里做什么?

在你的TrendLine子程序中,你已经声明eqn是一个Variant

 Dim eqn, name As String 

在您的MakeEqn函数中,您期望接收(通过引用)一个String

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

您不能将Variant传递给ByRef String 。 (它会生成一个“ByRef参数types不匹配”错误。)


最简单的解决方法是在TrendLine声明eqn是一个String ,即

 Dim eqn As String, name As String 

或者,您可以传递variablesByVal ,这将强制从Variant转换为String

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

当然有一个问题,因为variableseqn在你的例子的第二行被隐式声明为一个Varianttypes: Dim eqn, name As String 。 在VBA中,即使在同一行(除非它是一个Variant),您也需要显式声明每个variables,如下所示:

 Dim eqn As String, name As String