Есть ли эквивалент printf или String.Format в Excel
Я, кажется, трачу большую часть своего времени на электронные таблицы, работающие над такими формулами, как:
="some text '" & A1 & "', more text: '" & A2 &" etc."
Было бы гораздо быстрее использовать строку printf или String.Format, например
=String.Format ("Some text '{0}', more text: '{1}'",A1,A2)
Есть ли что-то подобное в Excel, или я могу вызвать CLR без написания макроса?
Ответы
Ответ 1
Нет, но вы можете создать наивный просто достаточно, добавив следующее в модуль VBA
public function printf(mask As String, ParamArray tokens()) as String
dim i as Long
for i = 0 To ubound(tokens)
mask = replace$(mask, "{" & i & "}", tokens(i))
next
printf = mask
end Function
...
=printf("Some text '{0}', more text: '{1}'", A1, A2)
Ответ 2
Вы можете использовать функцию ТЕКСТ -
Вы можете сохранить строку формата где-нибудь в ячейке, как я сделал
У меня есть значение "BUY "#" CREDITS"
в моей ячейке D1
В моей ячейке A5 у меня значение 5000.
когда я хочу отобразить форматированную строку, которую я использую, =TEXT(A5,$D$1)
Он установит значение ячейки в BUY 5000 CREDITS
Ответ 3
Я обновил код Alex, чтобы вы могли использовать %s
для каждой вставки.
Вместо:
=printf("Some text '{0}', more text: '{1}'", A1, A2)
Вы можете использовать:
=printf("Some text '%s', more text: '%s'", A1, A2)
Как и оригинальный sprintf
.
Обновленный код:
Public Function Printf(mask As String, ParamArray tokens()) As String
Dim i As Long
For i = 0 To UBound(tokens)
mask = Replace$(mask, "%s", tokens(i), , 1)
Next
Printf = mask
End Function
Ответ 4
на самом деле нет функции CONCATENATE
=CONCATENATE("some text '",A1,"', more text: '",A2," etc.")
но это не лучше, чем использование &
по-моему
Ответ 5
Интересный вопрос... Я думал то же самое.. как построить строку без необходимости прерывать длинное предложение в некоторых отдельных частях между Числами.
И поскольку я не хочу создавать функцию VBA (которая будет намного умнее)
= > вот мое решение...
ПОДСТАВИТЬ (P253; O252; "A1A" ; 1)
где
= > P253 - моя длинная строка с меткой "A1A" для # 1
= > O252 - это значение метки # 1
и т.д. (даже если не моя потребность), если другие значения..
= ПОДСТАВИТЬ (ПОДСТАВИТЬ (ПОДСТАВИТЬ (P253; O251; "A1A" ; 1); O252; "А2"; 1); O253; "А2О"; 1)
Ну, я полагаю, даже в #C должна существовать многополярная примитивная функция для sprintf (....% s,% s,% d..)
Ник