编译错误:ByRef参数类型不匹配,我缺少什么?

时间:2017-11-14 16:32:00

标签: excel vba excel-vba excel-2016

我不明白问题所在。

我有以下代码:

Public Sub SetupForm()
    Dim wbMain As Workbook
    Dim wsToner As Worksheet
    Set wbMain = ActiveWorkbook
    Set wsToner = wbMain.Sheets("Toner")
    With DashboardForm
        'Parent nodes
        Dim Brands() As String
        Brands() = GetTonerBrand(wsToner)

最后一行是调用以下函数:

Private Function GetTonerBrand(wsSheet As Worksheet) As String
    Dim col, Counter
    Dim LastCol
    Counter = 0
    Dim LastRow
    Dim Brands() As String
    With wsSheet
        LastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        Dim RowCount
        RowCount = LastRow
    End With
    Dim dict
    Set dict = CreateObject("Scripting.Dictionary")
    Do While RowCount > 3
        If Not dict.exists(wsToner.Cells(RowCount, 2).Value) Then
            dict.Add wsToner.Cells(RowCount, 2).Value, 0
        End If
        RowCount = RowCount - 1
    Loop
    ReDim Brands(0 To dict.Count)
    Brands() = dict.keys()
    GetTonerBrand Brands
End Function

当我尝试运行此操作时,我收到以下错误:

  

编译错误:ByRef参数类型不匹配

我认为如果我更新数组和函数的类型,那么它就可以工作。

所以我将Function更改为String,并将Brands()数组更改为String。然后我收到一个错误:

  

编译错误:无法分配给数组

SetupForm

行上的Brands() = GetTonerBrand(wsToner)子广告中

显然我错过了一些东西,我只是不知道它是什么。

更新

我看到这个other question名称相似,但没有帮助。

1 个答案:

答案 0 :(得分:1)

在您的问题的评论中提出了很好的观点,但没有一个解决了VBA不会将您的字典键(Variant数组)神奇地转换为String数组的事实。< / p>

我建议您修改函数以返回Variant数组。在您的主叫代码中,您必须修改声明:

'Parent nodes
Dim Brands() As Variant

在下面的代码中,请注意消除了超级变量,而使用合适的类型声明了剩余的变量。最后,为了返回值,函数的名称被赋予字典键。

Private Function GetTonerBrand(wsSheet As Worksheet) As Variant()
    Dim row As Long
    Dim tonerBrands As Object
    Dim tonerBrand As String

    With wsSheet
        row = .Cells(.Rows.Count, 2).End(xlUp).row
    End With

    Set tonerBrands = CreateObject("Scripting.Dictionary")

    Do While row > 3
        tonerBrand = CStr(wsToner.Cells(row, 2).Value)
        If Not tonerBrands.Exists(tonerBrand) Then
            tonerBrands.Add tonerBrand, 0
        End If
        row = row - 1
    Loop

    GetTonerBrand = tonerBrands.Keys()
End Function

关于变体数组的一个很酷的事情是,您可以使用变量类型变量迭代它们,并使用简单的For Each