UDF для возврата отформатированного числа

Иногда мне нравится отображать числа вместе с текстом в одной ячейке. Для этого я специально форматирую ячейку, например, 0,00 "test", например. ячейка A1 с формулой =PI(), но отформатированная в пользовательском формате 0.00" test", вернет отображаемый результат 3.14 test.

Важно отметить, что значение ячейки не изменилось при форматировании — вы все еще можете выполнить =A1 * 3 в другой ячейке и получить результат — поскольку значение A1 по-прежнему равно Pi, изменилось только его отображение.

Для пользовательской функции, которая возвращает числовое значение (в моем случае Long, но это может быть любое число), есть ли способ вернуть ячейку, чтобы она отображалась одним способом, но это было фактическое значение (я полагаю, что .Value2 в VBA) - это число, а не текст.

Я пробовал Format( в VBA, но он возвращает текстовую строку. Я бы просто отформатировал свою ячейку так, как я хочу, вручную, но, как вы можете видеть из приведенного ниже кода, форматирование зависит от промежуточных результатов (я пытаюсь вернуть значение, отформатированное с учетом времени вычисления).

UDF_RESULT = Format(valueResult.Length, IIf(tElapsed < timeout, "0" & " """ & Round(tElapsed, 2) & "s""", "0"))

Это было бы легко сделать с помощью макроса, но в UDF это сложнее. Я мог бы объявить все промежуточные значения на уровне модуля, тогда макрос Worksheet_Calculate() сможет получить доступ к этим значениям и применить пользовательское форматирование, но подход с оболочкой UDF был бы намного лучше.


person Greedo    schedule 29.03.2017    source источник


Ответы (1)


No.

Вы путаете значение ячейки с ее числовым форматом. Пользовательская функция может вычислить значение, и ячейка может форматировать это значение по мере необходимости.

Итак, если UDF возвращает число, значение ячейки является результатом этой функции — числом.

Просто отформатируйте ячейку по мере необходимости. Функция ничего не форматирует.

person Mathieu Guindon    schedule 29.03.2017
comment
Конечно, я бы хотел, но форматирование зависит от промежуточного результата, поэтому это сложно сделать из-за пределов UDF. Я пытался использовать Application.Caller, чтобы попытаться обмануть систему, но это оказалось относительно бесплодным. Есть ли такие лазейки? Как Excel узнает, что нужно остановить выполнение этой строки кода, и могу ли я отключить эту информацию? Будут ли последствия? - person Greedo; 29.03.2017
comment
Excel ничего не останавливает от выполнения; однако он знает, что он находится в середине вычисления рабочего листа, и если ячейка вызывает UDF, то он знает, каков контекст выполнения, и если он жестко зашит, чтобы выдавать ошибку, когда тот или иной метод вызывается в контексте вычисления UDF, то вы мало что можете с этим поделать. Если вам нужен макрос, почему бы не написать макрос? - person Mathieu Guindon; 29.03.2017
comment
Вы можете изменить формат из общего макроса, но не из функции, которая вызывается из значения ячейки. Вы могли бы установить в своей функции какую-то глобальную переменную, которая проверяется подсистемой, которая запускается постфактум, чтобы подпрограмма могла выполнять форматирование для вас. Может быть, даже подключился к событию worksheet_change? - person Rich Holton; 29.03.2017