为什么在 Excel 中使用 CONCATENATE 与 &?

Tay*_*ley 40 microsoft-excel

我注意到这"EXEC MySproc," & "arg, " & "arg2"=CONCATENATE("EXEC MySproc,", "arg,", "arg2") 包括使用评估、函数等的能力基本相同。使用=CONCATENATE()vs的用例是什么&

tey*_*lyn 56

它适用于喜欢打字的人。可能是相同的受众做类似的事情=Sum((A1*A2)-A3)而不是=(A1*A2)-A3. (是的,这些人存在,我不知道他们为什么这样做)

它还提供了使用 VBA 创建您的第一个用户定义函数以创建比 Concatenate() 更有用的东西的绝佳机会。

Excel 2016(带有 Office 365 订阅)有一个名为TextJoin()的新函数,它接受一个分隔符和一个范围作为参数,并且比将&符号和分隔符作为文本字符串输入要快得多。现在,这很有用。

在此处输入图片说明

  • @xehpuk 不,我没有。有些人将 Sum() 函数封装在简单的计算中。他们可以使用`=A1+A2`,但出于某种原因,他们写了`=Sum(A1+A1)`。或者`=Sum(A1-A2)`,他们可以使用`=A1-A2`。或者`=Sum(A1*A2)`,他们可以使用`=A1*A2`。有些人将各种公式放入 Sum() 函数中,我试图理解为什么。 (8认同)
  • -1. 虽然答案很有趣,但也毫无意义。问题不是“为什么人们使用 CONCATENATE 而不是 &?” 但是“为什么要使用 CONCATENATE 而不是 &?”。答案是“完全等效,Excel 联机帮助指出应该使用 & 代替”。正确(且有用)的解释,例如来自 Aganju 的解释是 & 稍后出现,并且出于兼容性原因保留了 CONCATENATE,这是一个完全有效的原因。所有这些“人们都很笨,想打很多字”都是完全没有必要的;他们这样做是有*原因的,这不是他们的愚蠢。 (6认同)
  • 至少 SUM 可以取一个范围。感谢 TEXTJOIN 上的指点。工作还没有升级到 2016 年,但是当他们升级时,我终于可以退休我的 UDF。 (5认同)
  • 你不是说`=Sum(A1,A2)`(作为`=A1+B1`的替代)吗? (5认同)
  • @IllusiveBrian 那是因为当您按下空格键时,您仍在按住 Shift 键。 (2认同)
  • @teylyn 是不是像那些喜欢输入更多并过度使用括号的人一样,因为他们了解运算符,但不了解 BODMAS?`=(A1*A2)-A3` 可能比 `=Sum((A1*A2)-A3)` 更简洁(也更合乎逻辑),但 `=A1*A2-A3` 比 `= 更简洁(A1*A2)-A3` ;-) (2认同)
  • @LưuVĩnhPhúc,对不起,我的记忆在这里失败了;我现在检查了旧的 Excel 2.0 手册。Excel 2.0 有 `&` 但没有 `CONCATENATE`。所以我认为 * 确实 * 有一个很好的理由为什么稍后引入 `CONCATENATE`,可能是为了与其他一些以 `CONCATENATE` 开始的产品兼容。我不知道(并且不想阅读 Excel 3、4、5... 的所有手册;)何时添加了`CONCATENATE`。 (2认同)

Nel*_*son 21

这可能是因为他们正在使用“插入功能”按钮。

在此处输入图片说明

当我用左手吃饭并且只是在做一些低级公式时,或者当我使用触摸设备并且无法在触摸屏上的符号、字母和数字之间切换时,我有时会这样做.

  • 要连接字符串,我需要记住点 `.` 用于 perl,管道`||` 用于 SQL,没有字符用于 cmd 和 bash,`+` 用于 Java。我真的需要`&` 只用于Excel 吗? (3认同)
  • @LưuVĩnhPhúc 流利的英语 - 据我所知,这些函数名称是本地化的(例如,它是德语 Excel 中的“VERKETTEN”) (3认同)
  • @kubanczyk 如果你能记住那些`.`、`||` 和`+`,那么你就能记住`&`。它比`concatenate`更容易,尤其是。如果英语不是很流利。它也用于 VBA (2认同)
  • @HagenvonEitzen 在函数上使用运算符的另一个好理由! (2认同)

Aga*_*nju 17

它只有历史和兼容性原因。以前版本的 Excel 不支持一种格式,其他电子表格工具(如 Google Docs、Apple Numbers 或 Open Office)也不支持另一种格式。

选择您喜欢的任何一个。

请注意,根据您的保存格式,Excel 需要CONCATENATE()&.


Thu*_*ame 15

在我看来,有选择地使用连接和与符号可以使公式更清晰。

的详细地址这串联,使用混合CONCATENATE&看起来更清晰的对我说:

=CONCATENATE(StreetNumber," ",StreetName," ",StreetType) & CHAR(10) & CONCATENATE(CityName," ",StateCode," ",ZipCode) & CHAR(10) & CountryName
Run Code Online (Sandbox Code Playgroud)

独家使用&

=StreetNumber & " " & StreetName & " " & StreetType & CHAR(10) & CityName & " " & StateCode & " " & ZipCode & CHAR(10) & CountryName
Run Code Online (Sandbox Code Playgroud)

并且独家使用CONCATENATE

=CONCATENATE(StreetNumber," ",StreetName," ",StreetType,CHAR(10),CityName," ",StateCode," ",ZipCode,CHAR(10),CountryName)
Run Code Online (Sandbox Code Playgroud)

再说一次,我认为像 UDF 这样的BuildAddress解决方案是更好的解决方案(并且可以更好地处理国际化域中地址格式的微妙之处 - 尽管我还没有实现)...

=CONCATENATE(StreetNumber," ",StreetName," ",StreetType) & CHAR(10) & CONCATENATE(CityName," ",StateCode," ",ZipCode) & CHAR(10) & CountryName
Run Code Online (Sandbox Code Playgroud)

但也许另一个例子,包括& 字符串文字中的使用,更好地展示了阅读强制自己专门使用运算符的公式的难度:

=StreetNumber & " " & StreetName & " " & StreetType & CHAR(10) & CityName & " " & StateCode & " " & ZipCode & CHAR(10) & CountryName
Run Code Online (Sandbox Code Playgroud)

可能更好地写成:

=CONCATENATE(StreetNumber," ",StreetName," ",StreetType,CHAR(10),CityName," ",StateCode," ",ZipCode,CHAR(10),CountryName)
Run Code Online (Sandbox Code Playgroud)

性能才是最重要的,根据连接的参数数量和每个参数的长度,该CONCATENATE函数似乎比连接运算符的性能好 4 到 6 倍。不可否认,这个例子是极端的,有255 个参数被连接,10,000 次。我不建议使用大于 32 的参数字符串长度,否则可能会耗尽内存/导致 Excel 崩溃。

这是一个粗略的计时机制:

Public Function BuildAddress(ByVal StreetNumber As String, ByVal StreetName As String, _
    ByVal StreetType As String, ByVal CityName As String, ByVal StateCode As String, _
    ByVal ZipCode As String, ByVal CountryName As String) As String


    BuildAddress = StreetNumber & " " & StreetName & " " & StreetType & vbCrLf & _
                   CityName & " " & StateCode & " " & ZipCode & vbCrLf & _
                   CountryName

End Function
Run Code Online (Sandbox Code Playgroud)

结果,根据参数字符串的长度:

=A1&"A2&A3&A4"&A5
Run Code Online (Sandbox Code Playgroud)

但是,我们甚至还没有讨论房间里的大象。您正在使用串联构建 SQL 命令。不要那样做。您正在执行一个接受参数的存储过程。除非您已经清理了您的输入(我猜您还没有),否则使用串联构建 SQL 字符串就是要求进行 SQL 注入攻击。您不妨公开一个名为JohnnyDropTables...的UDF


And*_*ely 5

这是语义域差异。Concatenate 是电子表格函数的名称。与号是从 Visual Basic 借用的连接运算符。从不使用 VBA 的人会发现一个函数比 VBA 语法更容易使用。这与为什么有一个热键、一个图标和一个保存菜单选项的原因相同,这使软件更易于使用。