ByRef参数类型不匹配,Excel VBA

时间:2016-05-06 20:53:58

标签: excel vba

VBA相当新,但是已经在java和C中进行了很多编程。

遗憾的是,我有一个似乎是经典的错误。遇到这个问题的其他人似乎没有问题的根源。原因是我在函数调用中发现了所有其他帖子的错误。我在函数定义上的错误标志!

声明:

Dim aktier() As String
ReDim aktier(antalTr) As String
Dim unikaAktier() As String
ReDim unikaAktier(antalTr) As String

Dim antalTr As Integer
Dim Kop As Integer
Kop = 1
Dim Salj As Integer
Salj = 2
Dim antalUnika As Integer
antalUnika = 0

for循环中的函数调用。这里没有错误标志。

For o = 1 To antalUnika
    Cells(o + 1, 3).Value = snittInkopEllerSalj(unikaAktier(o), antalTr, Kop)
    Cells(o + 1, 4).Value = snittInkopEllerSalj(unikaAktier(o), antalTr, Salj)
Next o

功能。在第一行标记。

Function snittInkopEllerSalj(bolag As String, antalTr As Integer, InUt As Integer) As Integer

Dim totKopSalj As Integer
Dim totAktier As Integer
totKopSalj = 0
totAktier = 0

For i = 1 To antalTr
    If Sheet1.Cells(i, 4).Value = bolag Then
        If InUt = 1 Then
            If isCorrectTrans(i, InUt) = True Then
                totKopSalj = totKop + Sheet1.Cells(i, 7)
                totAktier = totAktier + Sheet1.Cells(i, 5)
            End If
        Else
            If isCorrectTrans(i, InUt) = True Then
                totKopSalj = totKop + Sheet1.Cells(i, 7)
                totAktier = totAktier + Sheet1.Cells(i, 5)
            End If
        End If
    End If
Next i

snittInkopEllerSalj = Round(totKopSalj / totAktier)

End Function

我真的不明白为什么我会收到这个错误。我觉得一切都很明确?

1 个答案:

答案 0 :(得分:0)

您应始终将Option Explicit放在所有模块的第一行。这强制要求必须声明所有变量。

如果添加所有缺少的变量声明,则代码应该有效。 此外,在antalTr

中使用ReDim aktier(antalTr) As String之前,必须先声明Integer

与您的问题无关,但是:

  • 你永远不应该使用Long类型。请改用Private。由于VBA中的整数只有16位,但现在的计算机没有16位寄存器,因此它将以32位长的速度存储。另外,您不必担心打破32767边界。
  • 明确确定您的功能范围。如果您不添加PublicByRef,则后者将成为默认值。
  • 默认情况下,所有参数都将通过引用(ByVal)传递。如果您不希望在Sub或Function声明中将FilterAttribute放在参数名称之前。