Недавно потребовалось сделать смарт-шейп... Такой весь из-себя управляемый данными. И формулы получались довольно сложными. Вот например, есть список типов
принтер;МФУ;копир;сканер;терминал;инж.сист.;факс;дупликатор
и задание к нему - в зависимости от типа отображать одну из 5 картинок. В итоге требование вылилось вот в такую формулу с вложенными IF, OR и STRSAME.
IF(STRSAME(Prop._VisDM_Тип_устр,"Принтер",1),4,IF(STRSAME(Prop._VisDM_Тип_устр,"Инж.сист.",1),3,IF(OR(STRSAME(Prop._VisDM_Тип_устр,"Сканер",1),STRSAME(Prop._VisDM_Тип_устр,"Факс",1)),2,IF(OR(STRSAME(Prop._VisDM_Тип_устр,"МФУ",1),STRSAME(Prop._VisDM_Тип_устр,"Копир",1),STRSAME(Prop._VisDM_Тип_устр,"Дупликатор",1)),1,0))))
Написал, проверил - получил ошибку. Исправил - опять ошибка. Ну невозможно сходу и без ошибок создать такое.
Естественно возникает мысль, как бы упростить такую работу. Напрашивается - придумать что-то с подстановками. То есть разложить условие на несколько более простых и проверяемых строчек, которые потом программно соберутся вместе. Вроде бы такое можно реализовать хоть на VBA, но возникает проблема с кавычками. Их придется либо задваивать, либо вообще добавлять CHR(34), что явно снизит уровень удобства.
В итоге наиболее удобным оказался Excel. В ячейки можно занести все подстановки (здесь кавычки не мешают), а собрать потом можно простейшим макросом.
Выбрал формат из двух колонок: слева метка, справа подстановка. Метки обозначил произвольно, взял комбинацию, которая в тексте больше не встречается: ww1, ww2... Можно было и другие придумать - это не так важно.
Макрос получился тоже довольно примитивным. Последовательно просматривает селектированную область и подставляет вместо меток их значения из второго столбца. В конце выводит результат в следующую строку под селектированной областью. Остается только скопировать ее в Visio.
Sub ttt()
Dim i1 As Long, i2 As Long, s As String
s = ""
i1 = Selection.Cells(1).Row
i2 = Selection.Cells(Selection.Cells.Count).Row
s = Cells(i1, 2)
For i = i1 + 1 To i2
s = Replace(s, Cells(i, 1), Cells(i, 2))
Next
Cells(i, 2) = s
End Sub
Вот так это выглядит в работе.
Так как макрос обрабатывает только селектированную область, то на одном листе Excel можно собрать и даже сохранить на всякий случай множество таких формул. На весь смарт-шейп хватит, а то и на несколько.
Таким образом, будет полезно иметь под рукой файл Excel с макросом, которым можно будет воспользоваться для формирования сложных формул. Будет такой технологический инструмент на всякий случай. Можно даже оставить в нем несколько примеров, чтобы через некоторое время не вспоминать, как это работает.
Кстати, Excel все-таки не очень удобен для работы с текстом. Поэтому я приловчился сначала формировать нужную таблицу подстановок в блокноте (отделяя метки табуляцией), потом копировать ее в Excel и запускать макрос. Так получается быстрее всего.
P.S.: В заключение хотелось бы добавить, что иногда вместо формулы с вложенными IF можно использовать конструкцию LOOKUP-INDEX, как показано ниже на рисунке.
Здесь решается аналогичная задача, но управляющее значение поступает не через источник данных, а выбирается пользователем из фиксированного списка. В этом случае можно функцией LOOKUP определить номер выбранного значения, а потом функцией INDEX выбрать результат с тем же порядковым номером уже из второго списка. Но это уже другая тема...