Saya tidak mengerti apa masalahnya.

Saya memiliki kode berikut:

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)

Baris terakhir memanggil fungsi berikut:

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

Ketika saya mencoba menjalankan ini, saya mendapatkan kesalahan di bawah ini:

Kesalahan kompilasi: ketidakcocokan tipe argumen ByRef

Saya pikir jika saya memperbarui jenis array dan fungsinya maka itu akan berhasil.

Jadi saya mengubah Fungsi menjadi String dan array Brands() juga diubah menjadi String. Lalu saya mendapatkan kesalahan:

Kesalahan kompilasi: Tidak dapat menetapkan ke array

Di sub SetupForm pada baris Brands() = GetTonerBrand(wsToner)

Jelas saya kehilangan sesuatu, saya hanya tidak melihat apa itu.

PERBARUI

Saya telah melihat pertanyaan lain ini dengan nama yang mirip, itu tidak membantu.

0
Mike 14 November 2017, 19:31

1 menjawab

Jawaban Terbaik

Poin bagus dibuat dalam komentar untuk pertanyaan Anda, tetapi tidak ada yang membahas fakta bahwa VBA tidak akan secara ajaib melemparkan kunci kamus Anda, larik Variant, ke larik String.

Saya sarankan Anda memodifikasi fungsi Anda untuk mengembalikan array Variant. Dalam kode panggilan Anda, Anda harus mengubah deklarasi Anda:

'Parent nodes
Dim Brands() As Variant

Dalam kode di bawah ini, perhatikan bahwa variabel superflous dihilangkan, sedangkan variabel yang tersisa dideklarasikan dengan tipe yang sesuai. Pada akhirnya, untuk mengembalikan nilai, nama fungsi diberikan kunci kamus.

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

Hal yang keren tentang array varian adalah Anda dapat mengulanginya menggunakan variabel tipe varian, dengan For Each sederhana.

1
Excelosaurus 14 November 2017, 18:29