Я пытаюсь разбить массив в столбце 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 имеет категорию.
Я ищу приведенный ниже результат в столбце «C» для указанных ниже сценариев. Если столбец «Категория» показан ниже, то значения столбца «C» должны быть следующими после «-».
Вы можете отредактировать свой вопрос и отформатировать данные так, как они будут отображаться на листе.
Взгляните на этот ответ
Привет, Хорст, это похоже на поиск одной строки в массиве, но мне нужно искать несколько строк с условиями И и ИЛИ, что мне трудно сделать.
да, просто используйте функцию IsInArray
несколько раз в выражении If
или case
. Нравится If IsInArray("Foo", arr) And IsInArray("Bar", arr) Then...
Спасибо, Хорст, нужно ли нам разбивать массив, если мы используем IsInArray? Можете ли вы помочь мне в том, как выполнить итерацию по каждому массиву в столбце B и получить результат в столбце C. Я могу повторно использовать запись всех своих условий. И как проверить случай, когда в массиве находится только искомая строка и больше ничего.
2-7 означают только одну запись? Не могли бы вы уточнить (переосмыслить) 8-13, т. е. 8. Разработка, Тестирование, Что угодно, 9. Разработка, Что угодно (кроме) 10. Тестирование, Что угодно (кроме), что означало бы что-то другое, если бы вы заменили ИЛИ на И . Порядок установлен в 8-13? Подумайте о equal
и contains
.
Я не думаю, что это будет работать без демонстрационных данных, которые четко покажут все случаи.
Используя функцию 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 . Пока он не найдет первую пустую ячейку в категории, он работает отлично.
Добавил кейс на пустую ячейку ubound(Sp) = -1
Действительно поможет вашему вопросу показать некоторые образцы входных данных и ожидаемый результат.