在Excel中是否有相应的printf或String.Format

时间:2013-06-21 11:05:25

标签: excel

我似乎在电子表格中花费了大量时间来处理以下公式:

="some text '" & A1 & "', more text: '" & A2 &" etc."

使用printf或String.Format字符串(如

)要快得多
=String.Format ("Some text '{0}', more text: '{1}'",A1,A2)

在Excel中内置了这样的内容,还是可以在不编写宏的情况下调用CLR?

6 个答案:

答案 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)

<子> *使用混合语法`=printf("Some text '{}', more text: '{1}'", A1, A2)`的行为未定义,但替换从左到右,所以`"{}{2}{ 1}"` 等价于 `"{0}{2}{1}"`。 `"{}{1}{}"` 不会做你想做的事