Код VBA для нескольких операторов if в массиве

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

У меня много сценариев с комбинацией условий И/ИЛИ.
В конце, если ни один из сценариев не удовлетворяется, то в столбце «С» должно быть «не определено».

Dim Cl As Range
Dim Dic As Object
Dim Sp As Variant
Dim i As Long
  
Set Dic = CreateObject("Scripting.dictionary")
With Sheets("Analysis")
    For Each Cl In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
        Sp = Split(Cl.Offset(, 1).Value, ",")
        Select Case Cl.Offset(, 1).Value
            Case Is = " "
                C1.Offset(, 2).Value = " "
            Case Is = "Production"
                C1.Offset(, 2).Value = "Prod"
            Case Is = "Production" And "Development" Or "Training"
                C1.Offset(, 2).Value = "Dev/Prod"
        End Select
    Next Cl
End With
End Sub

Пример данных, в которых столбец A имеет идентификатор, а столбец B имеет категорию.

ИДЕНТИФИКАТОР КАТЕГОРИЯ 131 Производство 124 Производство, разработка, постановка, тестирование, обучение, UserAcceptanceTest 283 Разработка, Тест 1138 пустой.

Я ищу приведенный ниже результат в столбце «C» для указанных ниже сценариев. Если столбец «Категория» показан ниже, то значения столбца «C» должны быть следующими после «-».

  1. пустой - нет
  2. Разработка – Дев
  3. Производство - Продукт
  4. Тест - Тест
  5. Постановка - постановка
  6. Обучение - Обучение
  7. UserAcceptanceTest — UAT
  8. Разработка И Тестирование И Производство ИЛИ любая другая категория - Все
  9. Разработка и тестирование ИЛИ любая другая категория (кроме производства) — разработка/тестирование
  10. Тестирование И производство ИЛИ любая другая категория (кроме разработки) — Dev/Test
  11. Разработка И любая другая категория (кроме производства и тестирования) - Dev
  12. Производство И любая другая категория (кроме разработки и тестирования) - Prod
  13. Тест И любая другая категория (Кроме разработки и производства) - Тест
  14. любой другой сценарий - Не определено

Действительно поможет вашему вопросу показать некоторые образцы входных данных и ожидаемый результат.

Tim Williams 14.12.2020 07:36

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

Tim Williams 14.12.2020 07:46

Взгляните на этот ответ

horst 14.12.2020 07:48

Привет, Хорст, это похоже на поиск одной строки в массиве, но мне нужно искать несколько строк с условиями И и ИЛИ, что мне трудно сделать.

Wafee77 14.12.2020 07:58

да, просто используйте функцию IsInArray несколько раз в выражении If или case. Нравится If IsInArray("Foo", arr) And IsInArray("Bar", arr) Then...

horst 14.12.2020 08:00

Спасибо, Хорст, нужно ли нам разбивать массив, если мы используем IsInArray? Можете ли вы помочь мне в том, как выполнить итерацию по каждому массиву в столбце B и получить результат в столбце C. Я могу повторно использовать запись всех своих условий. И как проверить случай, когда в массиве находится только искомая строка и больше ничего.

Wafee77 14.12.2020 08:12

2-7 означают только одну запись? Не могли бы вы уточнить (переосмыслить) 8-13, т. е. 8. Разработка, Тестирование, Что угодно, 9. Разработка, Что угодно (кроме) 10. Тестирование, Что угодно (кроме), что означало бы что-то другое, если бы вы заменили ИЛИ на И . Порядок установлен в 8-13? Подумайте о equal и contains.

VBasic2008 14.12.2020 09:12

Я не думаю, что это будет работать без демонстрационных данных, которые четко покажут все случаи.

VBasic2008 14.12.2020 09:22
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
8
295
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя функцию IsInArray из этого ответа:

Я заполнил его несколькими примерами, чтобы дать вам представление о том, как это сделать.

Sub Category()

For Each cl In Range("A2:A" & Range("A2").End(xlDown).Row)

    Sp = Split(tempString , ", ")

    Select Case True    
        Case UBound(Sp) = -1
            cl.Offset(0, 2).Value = "No"
        Case UBound(Sp) = 0 And Sp(0) = " "
            cl.Offset(0, 2).Value = "No"
        Case UBound(Sp) = 0 And Sp(0) = "Development"
            cl.Offset(0, 2).Value = "Dev"
        Case IsInArray("Development", Sp) And IsInArray("Test", Sp) And IsInArray("Production", Sp)
            cl.Offset(0, 2).Value = "All"
        Case IsInArray("Development", Sp) And Not IsInArray("Production", Sp) And Not IsInArray("Test", Sp)
            cl.Offset(0, 2).Value = "Dev"
        Case Else
            cl.Offset(0, 2).Value = "Not Defined"
    End Select

Next cl
End Sub


Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function

Привет, Хорст, это работает как жемчужина, за исключением строки - Case UBound(Sp) = 0 And Sp(0) = " " выдает ошибку Run-tume '9': Subscript out of range . Пока он не найдет первую пустую ячейку в категории, он работает отлично.

Wafee77 14.12.2020 09:15

Добавил кейс на пустую ячейку ubound(Sp) = -1

horst 14.12.2020 09:21

Другие вопросы по теме