Если И условие с массивами

У меня есть три столбца A B и C. В некоторых случаях значение имеет только B. В приведенном ниже примере следует рассматривать только строки 2 и 4, а затем в зависимости от их значения соответствующей ячейке в столбце D присваивается определенное значение (соответствующее двум массивам ниже).

     A      B       C       D
1    x      y       z
2           b               2
3    t              v
4           e               5
5    g      h       i

Я не уверен, что это лучший подход для этого. Я объявил нужные массивы, но не знаю, как выполнить условие "если ячейка в A и ячейка в C пусты...".

    Dim Kol() As Variant: Kol = VBA.Array(1,2,3) ' I don't know if it makes sense to include columns A and C here
    Dim Faelle() As Variant: Faelle = VBA.Array( _
        "a", "b", "c", "d", "e")
    Dim Werte() As Variant: Werte = VBA.Array( _
        "1", "2", "3", "4", "5")

Вам нужно было использовать VBA и массивы? Это можно сделать с помощью формулы в ячейке =IF(CONCAT(A2:C2) = B2, ROW(B2),"") По сути, если объединение всех ячеек = тому, что находится в B, то все столбцы в строке пусты. если true получить номер строки, если false ничего не выводить. Та же логика может быть реализована с помощью VBA и массивов.

JosephC 24.11.2022 20:40

@JosephC Я только что понял, что выбрал неправильные значения для примера. На самом деле значения не похожи на символы и целые числа, соответствующие номерам строк. И я должен использовать VBA, и я думаю, что массивы предпочтительнее, так как лист может достигать 2k строк

maliebina 24.11.2022 20:43

"присваивается определенное значение" ничего не значит. Ваш псевдокод, не относящийся к приведенному выше примеру, тоже ничего не проясняет. Итак, если вам действительно нужна помощь, вы должны отредактировать свой вопрос и попытаться четко объяснить словами, ЧТО ВЫ ПЫТАЕТЕСЬ ДОСТИЧЬ.

FaneDuru 24.11.2022 20:57

@FaneDuru значения включены в массив.

maliebina 24.11.2022 21:01

Пожалуйста отредактируйте свой вопрос, чтобы уточнить его

cybernetic.nomad 24.11.2022 21:03

Какие «ценности» включены? Вы показываете 2D-массив, вы говорите о столбцах дерева (A, B, C) и показываете кусок кода с 1D-массивами, каждый из 5 и 3 элементов. Откуда вы извлекли Array(1,2,3), Array( "a", "b", "c", "d", "e") и Array( "1", "2", "3", "4", "5")? Вы действительно понимаете, что такое массив?

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

Ответы 1

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

Поиск данных: массивы вариантов с Application.Match

Sub LookupData()
    
    Dim Faelle() As Variant: Faelle = VBA.Array("a", "b", "c", "d", "e")
    Dim Werte() As Variant: Werte = VBA.Array(1, 2, 3, 4, 5)

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    Dim rg As Range: Set rg = ws.Range("A1").CurrentRegion
    
    Dim rCount As Long: rCount = rg.Rows.Count - 1 ' exclude headers
    Dim srg As Range: Set srg = rg.Resize(rCount).Offset(1) ' no headers
    Dim sData() As Variant: sData = srg.Resize(, 3).Value ' first 3 columns
    
    Dim dData() As Variant: ReDim dData(1 To rCount, 1 To 1)
    
    Dim nIndex As Variant, r As Long, rString As String
    
    For r = 1 To rCount
        rString = CStr(sData(r, 1))
        If Len(rString) = 0 Then
            rString = CStr(sData(r, 3))
            If Len(rString) = 0 Then
                rString = CStr(sData(r, 2))
                If Len(rString) > 0 Then
                    nIndex = Application.Match(rString, Faelle, 0)
                    If IsNumeric(nIndex) Then dData(r, 1) = Werte(nIndex - 1)
                End If
            End If
        End If
    Next r
    
    Dim drg As Range: Set drg = srg.Columns(4)
    drg.Value = dData

End Sub

Конечно, вы можете сократить цикл, потеряв переменную rString и используя оператор And следующим образом:

For r = 1 To rCount
    If Len(CStr(sData(r, 1))) = 0 And Len(CStr(sData(r, 3))) = 0 _
            And Len(CStr(sData(r, 2))) > 0 Then
        nIndex = Application.Match(CStr(sData(r, 2)), Faelle, 0)
        If IsNumeric(nIndex) Then dData(r, 1) = Werte(nIndex - 1)
    End If
Next r

Благослови тебя человек!!

maliebina 25.11.2022 12:52

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