Как узнать, содержит ли массив строку [duplicate]

49

Возможный дубликат:
Как искать строку в массиве MS Access VBA

В настоящее время я работаю над макросом Excel, и я не мог найти способ сделать это if array.contains(mystring)

Я написал следующее, и он дает мне сообщение "Invaild Qualifier" и выделяет Mainfram сразу после If

Dim Mainfram(4) As String

Mainfram(0) = "apple"

Mainfram(1) = "pear"

Mainfram(2) = "orange"

Mainfram(3) = "fruit"

    For Each cel In Selection
        If Mainfram.Contains(cel.Text) Then
            Row(cel.Row).Style = "Accent1"
        End If
    Next cel

Выбор - это столбец

Кто-нибудь может помочь?

Привет, JP Я попробовал ваше предложение, и он сказал, что требуется объект. И выделите   Если IsInArray (cell.Text, Mainfram) Затем Heres мой полный код

Sub changeRowColor()

Columns("B:B").Select

Dim cel As Excel.Range
Dim Mainfram(4) As String

Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "Banana"

For Each cel In Selection
    If IsInArray(cell.Value, Mainfram) Then
        Rows(cel.Row).Style = "Accent1"
    End If
Next cel

End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean

    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)

End Function

Nevermind, я обнаружил, что эта глупая ошибка... В любом случае, спасибо

  • 0
    FYI, это было предложено и ответил здесь .
  • 1
    @JP .: Ага, тогда давайте закроем это как точную копию.
Показать ещё 4 комментария
Теги:
arrays
substring

4 ответа

113
Лучший ответ

Используя код из моего ответа на очень похожий вопрос:

Sub DoSomething()
Dim Mainfram(4) As String
Dim cell As Excel.Range

Mainfram(0) = "apple"
Mainfram(1) = "pear"
Mainfram(2) = "orange"
Mainfram(3) = "fruit"

For Each cell In Selection
  If IsInArray(cell.Value, MainFram) Then
    Row(cell.Row).Style = "Accent1"
  End If
Next cell

End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
  • 0
    Я помню это. Я проголосовал за это, и я вотин за это :).
  • 1
    +1 Хороший как обычно :)
Показать ещё 10 комментариев
14

Еще один простой способ: JOIN и INSTR

Sub Sample()
    Dim Mainfram(4) As String, strg As String
    Dim cel As Range
    Dim Delim As String

    Delim = "#"

    Mainfram(0) = "apple"
    Mainfram(1) = "pear"
    Mainfram(2) = "orange"
    Mainfram(3) = "fruit"

    strg = Join(Mainfram, Delim)
    strg = Delim & strg

    For Each cel In Selection
        If InStr(1, strg, Delim & cel.Value & Delim, vbTextCompare) Then _
        Rows(cel.Row).Style = "Accent1"
    Next cel
End Sub
  • 0
    Да, но это может привести к сбою, если искомая строка содержит символ, используемый в качестве произвольного разделителя ( # или любой другой выбранный).
  • 1
    Хм, может я что-то упустил? Можете ли вы дать мне пример?
Показать ещё 9 комментариев
6

Используйте метод Filter() - http://msdn.microsoft.com/en-us/library/aa164525(v=office.10).aspx

  • 7
    Хороший ответ. Пример кода сделает это еще лучше!
  • 0
    Действительно ли ответы, которые содержат ссылки, действительно «хорошие ответы»? Мнение большинства кажется «нет».
Показать ещё 3 комментария
1

Боюсь, я не думаю, что есть ярлык для этого - если только кто-то напишет обертку linq для VB6!

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

Вот пример статьи, в которой приведены некоторые подробности здесь: http://www.vb6.us/tutorials/searching-arrays-visual-basic-6

Ещё вопросы

Сообщество Overcoder
Наверх
Меню