среда, 3 июня 2015 г.

Комбинации IF(OR) и IF(AND) и их использование в проверке и фильтрации

Проверяя документы с массивами различных данных часто нужна возможность отфильтровать отдельных диапазон по ряду схожих условий. Если таких условий много, фильтровать по отдельности не очень удобно и нужно привести их в сопоставимый вид.
Приведем пример, что имеется в виду. Допустим из массива данных реестра документов по мх нужно отфильтровать на отдельный лист только подтипы списаний, относящиеся к производственным. В данном случае можно сделать добавочный столбец, в котором мы проведем проверку на условия с помощью функции IF(OR) - если значение будет верным будет возвращаться строка "Производственные", иначе "ТЗ" (можно реализовать через возвращение 1 или 0 - так будет проще). Затем уже по этому столбцу можно провести одиночный фильтр по нужному значению.
Рассмотрим код:

 Sub Priznak_Tip
odoc=thiscomponent
oSheet = ThisComponent.Sheets(0)
oCellCursor = oSheet.createCursor()
oCellCursor.GotoStartOfUsedArea(True)
oCellCursor.GotoEndOfUsedArea(True)
Start_Row = oCellCursor.getRangeAddress.StartRow
End_Row = oCellCursor.getRangeAddress.EndRow
currcell = osheet.getcellbyposition(6, End_Row)
currcell3 = osheet.getcellbyposition(11, End_Row)
oConv = thiscomponent.createInstance("com.sun.star.table.CellAddressConversion")
oConv.Address = currcell.getCellAddress
oConv3 = thiscomponent.createInstance("com.sun.star.table.CellAddressConversion")
oConv3.Address = currcell3.getCellAddress
'Вот собственно сама сложная формула. При построении очень важно соблюдать
'порядок операторов, кавычки, правильно расставлять скобки
 Podstanovka  =  "=IF(OR("& oConv2.UserInterfaceRepresentation & "=" &Chr(34) & "Утиль производства ГМ"&Chr(34) &";"& oConv2.UserInterfaceRepresentation &"=" &Chr(34) &"Анализы СЭС"&Chr(34) &";"& oConv2.UserInterfaceRepresentation &"=" &Chr(34) &"Ингредиенты производства АР"&Chr(34) &";"& oConv2.UserInterfaceRepresentation &"=" &Chr(34) &"Ингредиенты производства ГМ"&Chr(34) &";"& oConv2.UserInterfaceRepresentation &"=" &Chr(34) &"Питание персонала"&Chr(34) &";"& oConv2.UserInterfaceRepresentation &"=" &Chr(34) &"Сертификация"&Chr(34) &";"& oConv2.UserInterfaceRepresentation &"=" &Chr(34) &"Дегустация"&Chr(34) &");"& Chr(34) & "Производственные" & Chr(34) & ";"& Chr(34) & "ТЗ" & Chr(34) & ")"
 currcell3.setFormula (Podstanovka)
odoc.getCurrentController().Select(currcell3)
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args29(1) as new com.sun.star.beans.PropertyValue
args29(0).Name = "By"
args29(0).Value = 1
args29(1).Name = "Sel"
args29(1).Value = true
dispatcher.executeDispatch(document, ".uno:GoUpToStartOfData", "", 0, args29())
dispatcher.executeDispatch(document, ".uno:FillUp", "", 0, Array())
ThisComponent.Sheets(0).getCellByPosition (11, 0).String = "Признак подтипа операции"
 End Sub

Оператор OR означает или - т.е. должно выполняться любое из перечисленных условий, что бы он вернул верное значение. Существует еще оператор AND - при этого использовании должны выполняться все условия, указанные в кавычках, чтобы он вернул верное значение.
Обычно его используют для проверки ошибок в данных. Например, следующая строка проверяет на условие позиция является рецептом, а списание относится к производству (что является ошибкой:

 Podstanovka  =  "=IF(AND("& oConv.UserInterfaceRepresentation & "=" &Chr(34) & "рец."&Chr(34) &";"& oConv2.UserInterfaceRepresentation &"=" &Chr(34) &"Производство" &Chr(34) &");1;0)"

Задача: С помощью оператора IF(AND) проверьте в файле Реестр документов по МХ наличие списаний  подтипом Утиль производства ГМ с МХ Брак-утиль с помощью дополнительного столбца с соот. формулой.

Комментариев нет:

Отправить комментарий