Проблемы с передачей значений массива - PullRequest
0 голосов
/ 25 марта 2019

У меня есть подпрограмма, которая заполняет массив списком определенных пользователем значений из фиксированного диапазона в моей электронной таблице.Я хочу вызвать этот саб из другого, и использовать значения в массиве для запуска цикла For Each.

Когда я вызываю sub getInvoiceList, я вижу, что он заполняет массив invoiceList пользовательскими значениями.Но они не возвращаются в подводную лодку, с которой я звоню

Public Sub columnLoop()

    Dim i As Long, j As Long
    getInvoiceList
    Stop 'to view array values

    Sheets("Calculator").Columns(10).Font.Color = vbBlack

    For i = 0 To UBound(invoiceList)

    'Loops through column for specific value(as declared)
    'Recolors text when current cell value = specific value
        For j = 3 To Range("NumFilledRows").Value
            If Sheets("Calculator").Cells(j, 10).Value = invoiceList(i) Then
            Sheets("Calculator").Cells(j, 10).Font.Color = vbRed
        End If
    Next j
Next i

End Sub

'Fill array from fixed range
Public Sub getInvoiceList()
    Dim invoiceList() As Variant
    invoiceList = Sheet2.Range("C4:C14")

    Stop 'allows review of array.
End Sub

Когда я вызываю sub 'getInvoiceList', я вижу, что он заполняет массив invoiceList значениями пользователя.Но они не возвращаются в подводную лодку, с которой я звоню

Run-time error '13': Type Mismatch Отладка выводит меня на строку For i = 0 to UBound.Окно Locals показывает invoiceList, но имеет value = empty как в строке Stop, так и после нажатия отладки.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Вы можете передавать переменные в / из подпрограмм.

Public Sub columnLoop()

    Dim i As Long, j As Long, InvoiceList As Variant
    getInvoiceList  InvoiceList
    Stop 'to view array values

    Sheets("Calculator").Columns(10).Font.Color = vbBlack

    For i = 0 To UBound(InvoiceList)

    'Loops through column for specific value(as declared)
    'Recolors text when current cell value = specific value
        For j = 3 To Range("NumFilledRows").Value
            If Sheets("Calculator").Cells(j, 10).Value = InvoiceList(i) Then
            Sheets("Calculator").Cells(j, 10).Font.Color = vbRed
        End If
    Next j
Next i

End Sub

'Fill array from fixed range
Public Sub getInvoiceList(ByRef InvoiceList As Variant)

    InvoiceList = Application.Transpose(Sheet2.Range("C4:C14").Value)

    Stop 'allows review of array.
End Sub
0 голосов
/ 25 марта 2019

Вероятно, было бы проще использовать коллекцию. Попробуйте мой код ниже.

Public Sub columnLoop()
    Dim i As Long, j As Long
    Dim coll As New Collection

    'add items to collection
    For Each cell In Sheets(2).Range("C4:C14")
        coll.Add cell
    Next
    Stop 'to view array values

    Sheets("Calculator").Columns(10).Font.Color = vbBlack

    Dim itm As Variant

    For Each itm In coll
        'Loops through column for specific value(as declared)
        'Recolors text when current cell value = specific value
        For j = 3 To Range("NumFilledRows").Value
            If Sheets("Calculator").Cells(j, 10).Value = itm Then 'checks values against items in collection
                Sheets("Calculator").Cells(j, 10).Font.Color = vbRed
            End If
        Next j
    Next itm

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...