ошибка компиляции: несоответствие типа аргумента ByRef, что мне не хватает?

Я не понимаю, в чем проблема.

У меня есть следующий код:

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

Я думал, что если я обновлю тип массива и функции, то это сработает.

Поэтому я изменил функцию на строку, а массивы Brands() также были изменены на строку. Затем я получаю сообщение об ошибке:

Ошибка компиляции: невозможно присвоить массиву

в подразделе SetupForm на строке Brands() = GetTonerBrand(wsToner)

Очевидно, я что-то упускаю, я просто не вижу, что это такое.

ОБНОВЛЕНИЕ

Я видел этот другой вопрос с похожим названием, это бесполезно.


person Mike    schedule 14.11.2017    source источник
comment
Возможно, последняя строка GetTonerBrand должна быть GetTonerBrand = Brands.   -  person    schedule 14.11.2017
comment
Предпоследняя строка должна быть GetTonerBrand = Brands   -  person newacc2240    schedule 14.11.2017
comment
GetTonerBrand говорит, что возвращает строку, но вы возвращаете массив строк, поэтому также измените на As String()   -  person Alex K.    schedule 14.11.2017
comment
Похоже, вы пытаетесь присвоить строку массиву (Brands() = GetTonerBrand(wsToner)). Brands() — это массив, а ваша функция — просто строка.   -  person mooseman    schedule 14.11.2017


Ответы (1)


В комментариях к вашему вопросу были сделаны хорошие замечания, но ни один из них не касался того факта, что VBA не будет волшебным образом преобразовывать ваши словарные ключи, массив Variant, в массив String.

Я предлагаю вам изменить вашу функцию, чтобы она возвращала массив 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.

person Excelosaurus    schedule 14.11.2017