Почему возникает ошибка «Несоответствие типов»? - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь написать функцию VBA, которая принимает таблицу с двумя столбцами в качестве входных данных. Я хочу вернуть элементы в столбце 2, для которых соответствующая строка в столбце 1 равна 3. В основном эквивалент предложения where в SQL.

Логика кода выглядит нормально, однако я получаю ошибку несоответствия типов. Я объявляю функцию As Variant и массив, который я хочу вернуть, также As Variant.

Function FilterTable(tableName As String) As Variant
    Dim table As range
    Dim cell  As range
    Dim names As range
    Dim i     As Integer
    Dim names_2(100) As Variant
    Dim j As Integer
    Dim test As String

    i = 1
    j = 1
    Set table = ActiveSheet.range(tableName).Columns(1)
    Set names = ActiveSheet.range(tableName).Columns(2)

    For Each cell In table.Cells
        If cell = 3 Then
            names_2(i) = names.Cells(j, 1).Value
            i = i + 1
        End If
        j = j + 1
    Next

    FilterTable = names_2
End Function

Почему я получаю ошибку несоответствия типов и как ее исправить?

1 Ответ

0 голосов
/ 06 мая 2018

Есть несколько проблем с вашим кодом, но ни одна из них не должна вызывать несоответствие типов, если в ваших данных нет ошибок рабочего листа (например, # N / A, # DIV / 0 !, и т. Д.).

Вы должны знать, на каком рабочем столе находится ваша таблица; не полагайтесь на активный лист.

1-D массив по умолчанию имеет нулевое значение, а не единичное значение.

Вы должны удалить лишние (пустые) элементы в вашем массиве после его заполнения. Используйте окно Locals или установите Watch на вашем массиве, чтобы увидеть, как он заполняется и изменяет размер при переходе по функции с помощью F8.

Option Explicit

Sub main()
    Dim n As Variant, i As Long
    n = FilterTable("table1")
    For i = LBound(n) To UBound(n)
        Debug.Print n(i)
    Next i
End Sub

Function FilterTable(tableName As String) As Variant
    Dim table As Range, names As Range, cell As Range
    Dim i As Long, j As Long
    Dim names_2 As Variant

    i = 0
    j = 1
    ReDim names_2(100)
    Set table = Worksheets("Sheet3").Range(tableName).Columns(1)
    Set names = Worksheets("Sheet3").Range(tableName).Columns(2)

    For Each cell In table.Cells
        If Not IsError(cell) Then
            If cell = 3 Then
                names_2(i) = names.Cells(j, 1).Value
                i = i + 1
            End If
        End If
        j = j + 1
    Next cell

    ReDim Preserve names_2(i - 1)

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