Получить N-й индекс массива в VBA - PullRequest
0 голосов
/ 06 мая 2019

Я новичок в VBA и не могу найти способ получить элемент массива по заданному индексу ... Хотя это может быть легко для вас.

У меня есть файл Excelс двумя столбцами, «Электронная почта» и «Категории», и я хочу отфильтровать все электронные письма для данной категории.

Я до сих пор получил следующий код:

Sub filterEmails()

    Dim tbl As ListObject
    Dim emails As Variant
    Dim email As String
    Dim categories As Variant
    Dim category As String
    Dim i As Integer

    Set tbl = ActiveWorkbook.Worksheets("Feuil1").ListObjects("Tableau1")
    emails = tbl.ListColumns("EMAILS").DataBodyRange.Value
    categories = tbl.ListColumns("SERVICES").DataBodyRange.Value

    i = 1
    For Each email In emails

        category = ???

        If category = "some service" Then
            MsgBox email
        End If

        i = i + 1
    Next email

End Sub

Я пробовал много способов получить i-й элемент из массива категорий, например categories(i), но безуспешно.Это может быть потому, что я не смог инициализировать переменные с правильным типом.

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Я бы сделал это так:

Sub filterEmails()

    Dim tbl As ListObject
    Dim emails As Variant
    Dim email As String
    Dim categories As Variant
    Dim category As String
    Dim i As Long '<< always best to prefer Long over Integer

    Set tbl = ActiveWorkbook.Worksheets("Feuil1").ListObjects("Tableau1")

    'Both "emails" and "categories" will be 2-D arrays
    emails = tbl.ListColumns("EMAILS").DataBodyRange.Value
    categories = tbl.ListColumns("SERVICES").DataBodyRange.Value


    For i = lbound(emails,1) to ubound(emails, 1) 

        category = categories(i, 1)

        If category = "some service" Then
            MsgBox email
        End If
    Next i

End Sub
1 голос
/ 06 мая 2019

Вот ваш код, немного его поменял, теперь должно работать:

    Option Explicit

    Sub filterEmails()

    Dim tbl As ListObject
    Dim emails As Variant
    Dim email As Variant
    Dim categories As Variant
    Dim category As String
    Dim i As Integer

    Set tbl = ActiveWorkbook.Worksheets("Feuil1").ListObjects("Tableau1")
    emails = tbl.ListColumns("EMAILS").DataBodyRange.Value
    categories = Application.Transpose(tbl.ListColumns("SERVICES").DataBodyRange.Value)

    i = 1
    For Each email In emails

        category = categories(i)

        If category = "some service" Then
            MsgBox email
        End If

        i = i + 1
    Next email

End Sub

Комментарии:

categories(i)

Эта команда не будет работать, потому что categories - это двухмерный массив, я сохраняю его как одномерный массив, используя команду Application.transpose.

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