Могу ли я иметь логическое И внутри формулы массива в Excel? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть лист, подобный следующему

ID|AVAILABILITY|PRICE
1 |1           |10,00
1 |1           |15,00
1 |0           |12,00
2 |1           |10,00

И в том же листе Я делаю следующее в MIN PRICE, чтобы получить минимальную цену. Цена доступна только для продуктов

Я сохраняю его как формулу массива

ID|MIN PRICE
1 |=MIN(IF(AND(table1[AVAILABILITY]=1;table1[ID]=L2);table1[PRICE]))
2 |

Но я получаю 0, есть ли способ обойти это?

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Я пытаюсь создать код VBA.Любые исправления, все уточнения приветствуются!

Option Explicit

Sub test()

    Dim LastrowA As Long, LastrowE As Long, i As Long, ID As Long, Availability As Long, y As Long
    Dim LowestPrice As Double
    Dim strValues As String
    Dim arr As Variant, element As Variant, IDarr As Variant

    With ThisWorkbook.Worksheets("Sheet1")

        LastrowA = .Cells(.Rows.Count, "A").End(xlUp).Row

        strValues = ""

        For i = 2 To LastrowA

            ID = .Range("A" & i).Value
            Availability = .Range("B" & i).Value

            If Availability > 0 And (InStr(strValues, ID) = 0) Then
                If i = LastrowA Then
                    strValues = strValues & ID
                Else
                    strValues = strValues & ID & "|"
                End If
            End If

        Next i

        arr = Split(strValues, "|")

        For Each element In arr

            IDarr = element
            LowestPrice = 0

            For y = 2 To LastrowA
                If CStr(.Range("A" & y).Value) = IDarr Then
                    If LowestPrice = 0 Then
                        LowestPrice = .Range("C" & y).Value
                    Else:
                        If LowestPrice > .Range("C" & y).Value Then
                            LowestPrice = .Range("C" & y).Value
                        End If
                    End If
                End If
            Next y

            LastrowE = .Cells(.Rows.Count, "E").End(xlUp).Row

            .Range("E" & LastrowE + 1).Value = IDarr
            .Range("F" & LastrowE + 1).Value = LowestPrice

        Next

    End With

End Sub

Результат:

enter image description here

0 голосов
/ 07 февраля 2019

Если вы используете Excel для Office 365, Excel для Office 365 для Mac, Excel 2019 или Excel 2019 для Mac , вы можете использовать функцию MINIFS .

Если вы используете более старую версию Excel, вы можете попробовать заменить ее на.

Используя 1 критерий, вы можете использовать их.

  • MAXIFS: =MAX(INDEX(range-(criterion<>criterion_range)*1E300,0))
  • МИНИФЫ: =MIN(INDEX(range+(criterion<>criterion_range)*1E300,0))

То есть, если критерий не выполняется, вычтите / добавьте огромное число, чтобы вывести соответствующее значение из диапазона из рассмотрения.Это не формулы массивов.

Для 2 или более критериев

  • MAXIFS: =MAX(IF(criterion1=criterion1_range,IF(criterion2=criterion2_range,range)))
  • MINIFS: =MIN(IF(criterion1=criterion1_range,IF(criterion2=criterion2_range,range)))

Идея вложенных вызовов IF заключается в том, что когда 1-й критерий не удовлетворен, нет необходимости проверять последующие критерии.Это выполняет наименьшее количество сравнений.В идеале сначала нужно поставить наименее часто удовлетворяемый критерий, затем следующий наименее часто удовлетворяемый критерий и т. Д.

0 голосов
/ 07 февраля 2019

Вы можете сделать что-то вроде этой формулы массива:

enter image description here

0 голосов
/ 07 февраля 2019

В этом случае вам не понадобится AND, просто:

{=MIN(IF(A:A=1;IF(B:B=1;C:C)))}

См. здесь для получения дополнительной информации об этом!

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