我似乎在电子表格中花费了大量时间来处理以下公式:
="some text '" & A1 & "', more text: '" & A2 &" etc."
使用printf或String.Format字符串(如
)要快得多=String.Format ("Some text '{0}', more text: '{1}'",A1,A2)
在Excel中内置了这样的内容,还是可以在不编写宏的情况下调用CLR?
答案 0 :(得分:74)
不,但您可以通过将以下内容添加到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)
答案 1 :(得分:13)
我已更新了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
答案 2 :(得分:10)
您可以使用TEXT功能 -
您可以将格式字符串存储在像我一样的单元格中
我的D1单元格中有"BUY "#" CREDITS"
的值
在我的A5细胞中,我有5000的价值。
当我想显示我使用的格式化字符串=TEXT(A5,$D$1)
它会将单元格的值设置为BUY 5000 CREDITS
答案 3 :(得分:6)
不是真的 - 有CONCATENATE函数
=CONCATENATE("some text '",A1,"', more text: '",A2," etc.")
但在我看来并不比使用&
答案 4 :(得分:1)
有趣的问题......我在想同样的事情..如何建立一个字符串而不必在数字之间的某些单个部分中切断长句。 而且因为我不想创建一个VBA功能(这将更加智能)
=>这是我的解决方案......
SUBSTITUTE(P253; O252;" A1A&#34 ;; 1)
其中
=> P253是我的长串,#A1; A1A"为#1标签 => O252是#1标签的值
依旧......(即使不是我的需要)如果其他值.. = SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(P253; O251;" A1A&#34 ;; 1); O252;" A2A&#34 ;; 1); O253;" A2A&#34 ;; 1)
嗯,我认为,即使在#C中,sprintf也应该有多替换原语函数(....%s,%s,%d ..)
尼克
答案 5 :(得分:0)
@AlexK 提供的“防弹”版本,允许:
printf("{0}{1}", "test {1}", 2) -> "test {1}2" (NOT "test 22")
printf("{}{}", "a", "b") -> "ab"
Public Function printf(ByVal mask As String, ParamArray tokens() As Variant) As String
Dim i As Long
For i = 0 To UBound(tokens)
Dim escapedToken As String
escapedToken = Replace$(tokens(i), "}", "\}") 'only need to replace closing bracket since {i\} is already invalid
If InStr(1, mask, "{}") <> 0 Then
'use positional mode {}
mask = Replace$(mask, "{}", escapedToken, Count:=1)
Else
'use indexed mode {i}
mask = Replace$(mask, "{" & i & "}", escapedToken)
End If
Next
mask = Replace$(mask, "\}", "}")
printf = mask
End Function
用法如前:
=printf("Some text '{0}', more text: '{1}'", A1, A2)
OR 位置(从左到右)
=printf("Some text '{}', more text: '{}'", A1, A2)