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


38

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


2
在较长的字符串连接序列中,CONCATENATE()在最终字符串的长度上可能是线性的,而不是二次的。参见joelonsoftware.com/2001/12/11/back-to-basics
Pieter Geerkens

1
轶事,但我在连接三个字符串时经常使用CONCATENATE,唯一的原因是我更习惯使用逗号而不是&来分隔参数……尽管这当然不是真正的理由。
Alexandre d'Entraigues

1
@PieterGeerkens:我不知道你的意思是什么。好的,一长串独立执行的字符串串联在最终字符串的长度上可能是线性的或二次的,具体取决于您如何在内存中存储字符串。你有什么证据(或任何理由相信)CONCATENATE(),并&内部实现在Excel中不同?
G-Man说'Resstate Monica''July

Answers:


54

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

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

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

在此处输入图片说明


5
至少SUM可以取一个范围。感谢您在TEXTJOIN上使用指针。工作尚未升级到2016年,但是当他们完成工作后,我终于可以退休我的UDF。
德兰农'17

4
您不是要=Sum(A1,A2)(代替=A1+B1)吗?
xehpuk

8
@xehpuk不,我没有。有些人将Sum()函数包装在简单的计算周围。他们可以使用,=A1+A2但是由于某种原因,他们写道=Sum(A1+A1)。或者=Sum(A1-A2)他们可以在我们这里=A1-A2。或者=Sum(A1*A2)他们可以在哪里使用 =A1*A2。有人将各种公式放入Sum()函数中,而我试图理解原因。
teylyn

2
@IllusiveBrian,这是因为当您按下空格键时,您仍然按住Shift键。
Mathieu Guindon

4
-1。虽然答案很有趣,但也毫无意义。问题不是“为什么人们使用CONCATENATE而不是&?”。但是“为什么要用CONCATENATE代替&?”。答案是“它完全等效,Excel联机帮助指出应使用&代替”。正确的(且有用的)解释(例如来自Aganju的解释)是&后来出现的,并且出于兼容性原因而将CONCATENATE留在了那里,这是一个完全有效的理由。所有这些“人们很愚蠢,想打字很多”是完全没有必要的。还有原因,他们做到这一点,这不是他们的愚蠢。
AnoE

22

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

在此处输入图片说明

当我用左手进餐并且只是在做一些低级的配方时,或者当我使用触摸设备而又不想打扰在触摸屏上的符号,字母和数字之间切换时,有时会这样做。


1
+1。我一直使用该按钮,它足够了,因此没有动力学习操作员。
kubanczyk

3
要连接字符串,我需要.为perl 记住点,||对于SQL 需要记住pipe-pipe ,+对于Java则需要记住char和cmd 。我真的&只需要Excel吗?
kubanczyk

2
@kubanczyk如果你能记得那些.||+那么你就可以记住&。比concatenateesp 容易。如果英语不太流利。在VBA中也使用了它
phuclv

3
@LưuVĩnhPhúc英语的流利程度-据我所知,这些函数名称已本地化(例如,VERKETTEN在德语Excel中)
Hagen von Eitzen

2
@HagenvonEitzen在函数上使用运算符的另一个很好的理由!
Mathieu Guindon

17

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

选择您喜欢的任何一个。

请注意,根据您的保存格式,Excel需要CONCATENATE()比保存更多的空间&


对。直到现在我还不知道这&是替代品CONCATENATE。我很少使用excel,但是当我这样做时通常是将其用于需要级联的事情
gabe3886

15

我认为,有选择地使用串联和“&”号可以产生更清晰的公式。

地址详细信息的这种组合,使用的混合形式CONCATENATE&对我来说似乎更清晰:

=CONCATENATE(StreetNumber," ",StreetName," ",StreetType) & CHAR(10) & CONCATENATE(CityName," ",StateCode," ",ZipCode) & CHAR(10) & CountryName

独家使用&

=StreetNumber & " " & StreetName & " " & StreetType & CHAR(10) & CityName & " " & StateCode & " " & ZipCode & CHAR(10) & CountryName

独家使用CONCATENATE

=CONCATENATE(StreetNumber," ",StreetName," ",StreetType,CHAR(10),CityName," ",StateCode," ",ZipCode,CHAR(10),CountryName)

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

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

但是也许还有另一个示例,其中包括& 字符串文字中的使用,可以更好地说明难以读取强制自己专门使用运算符的公式的困难:

=A1&"A2&A3&A4"&A5

最好写成:

=CONCATENATE(A1,"A2&A3&A4",A5)

但是性能才是最重要的,并且取决于要连接的参数的数量以及每个参数的长度,该CONCATENATE函数的性能似乎比连接运算符高4到6倍。串联255个参数10,000次。我不建议使用长度大于32的参数字符串,否则您可能会用完内存/崩溃Excel。

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

Option Explicit

Const ConcatenationOperatorFormula As String = _
  "=$A$1&$A$2&$A$3&$A$4&$A$5&$A$6&$A$7&$A$8&$A$9&$A$10&$A$11&$A$12&$A$13&$A$14&$A$15&$A$16&$A$17&$A$18&$A$19&$A$20&$A$21&$A$22&$A$23&$A$24&$A$25&$A$26&$A$27&$A$28&$A$29&$A$30&$A$31&$A$32&$A$33&$A$34&$A$35&$A$36&$A$37&$A$38&$A$39&$A$40&$A$41&$A$42&$A$43&$A$44&$A$45&$A$46&$A$47&$A$48&$A$49&$A$50&$A$51&$A$52&$A$53&$A$54&$A$55&$A$56&$A$57&$A$58&$A$59&$A$60&$A$61&$A$62&$A$63&$A$64&$A$65&$A$66&$A$67&$A$68&$A$69&$A$70&$A$71&$A$72&$A$73&$A$74&$A$75&$A$76&$A$77&$A$78&$A$79&$A$80&$A$81&$A$82&$A$83&$A$84&$A$85&$A$86&$A$87&$A$88&$A$89&$A$90&$A$91&$A$92&$A$93&$A$94&$A$95&$A$96&$A$97&$A$98&$A$99&$A$100&" & _
  "$A$101&$A$102&$A$103&$A$104&$A$105&$A$106&$A$107&$A$108&$A$109&$A$110&$A$111&$A$112&$A$113&$A$114&$A$115&$A$116&$A$117&$A$118&$A$119&$A$120&$A$121&$A$122&$A$123&$A$124&$A$125&$A$126&$A$127&$A$128&$A$129&$A$130&$A$131&$A$132&$A$133&$A$134&$A$135&$A$136&$A$137&$A$138&$A$139&$A$140&$A$141&$A$142&$A$143&$A$144&$A$145&$A$146&$A$147&$A$148&$A$149&$A$150&$A$151&$A$152&$A$153&$A$154&$A$155&$A$156&$A$157&$A$158&$A$159&$A$160&$A$161&$A$162&$A$163&$A$164&$A$165&$A$166&$A$167&$A$168&$A$169&$A$170&$A$171&$A$172&$A$173&$A$174&$A$175&$A$176&$A$177&$A$178&$A$179&$A$180&$A$181&$A$182&$A$183&$A$184&$A$185&$A$186&$A$187&$A$188&$A$189&$A$190&$A$191&$A$192&$A$193&$A$194&$A$195&$A$196&$A$197&$A$198&$A$199&$A$200&" & _
  "$A$201&$A$202&$A$203&$A$204&$A$205&$A$206&$A$207&$A$208&$A$209&$A$210&$A$211&$A$212&$A$213&$A$214&$A$215&$A$216&$A$217&$A$218&$A$219&$A$220&$A$221&$A$222&$A$223&$A$224&$A$225&$A$226&$A$227&$A$228&$A$229&$A$230&$A$231&$A$232&$A$233&$A$234&$A$235&$A$236&$A$237&$A$238&$A$239&$A$240&$A$241&$A$242&$A$243&$A$244&$A$245&$A$246&$A$247&$A$248&$A$249&$A$250&$A$251&$A$252&$A$253&$A$254&$A$255"

Const ConcatenateFunctionFormula As String = _
  "=CONCATENATE($A$1,$A$2,$A$3,$A$4,$A$5,$A$6,$A$7,$A$8,$A$9,$A$10,$A$11,$A$12,$A$13,$A$14,$A$15,$A$16,$A$17,$A$18,$A$19,$A$20,$A$21,$A$22,$A$23,$A$24,$A$25,$A$26,$A$27,$A$28,$A$29,$A$30,$A$31,$A$32,$A$33,$A$34,$A$35,$A$36,$A$37,$A$38,$A$39,$A$40,$A$41,$A$42,$A$43,$A$44,$A$45,$A$46,$A$47,$A$48,$A$49,$A$50,$A$51,$A$52,$A$53,$A$54,$A$55,$A$56,$A$57,$A$58,$A$59,$A$60,$A$61,$A$62,$A$63,$A$64,$A$65,$A$66,$A$67,$A$68,$A$69,$A$70,$A$71,$A$72,$A$73,$A$74,$A$75,$A$76,$A$77,$A$78,$A$79,$A$80,$A$81,$A$82,$A$83,$A$84,$A$85,$A$86,$A$87,$A$88,$A$89,$A$90,$A$91,$A$92,$A$93,$A$94,$A$95,$A$96,$A$97,$A$98,$A$99,$A$100," & _
  "$A$101,$A$102,$A$103,$A$104,$A$105,$A$106,$A$107,$A$108,$A$109,$A$110,$A$111,$A$112,$A$113,$A$114,$A$115,$A$116,$A$117,$A$118,$A$119,$A$120,$A$121,$A$122,$A$123,$A$124,$A$125,$A$126,$A$127,$A$128,$A$129,$A$130,$A$131,$A$132,$A$133,$A$134,$A$135,$A$136,$A$137,$A$138,$A$139,$A$140,$A$141,$A$142,$A$143,$A$144,$A$145,$A$146,$A$147,$A$148,$A$149,$A$150,$A$151,$A$152,$A$153,$A$154,$A$155,$A$156,$A$157,$A$158,$A$159,$A$160,$A$161,$A$162,$A$163,$A$164,$A$165,$A$166,$A$167,$A$168,$A$169,$A$170,$A$171,$A$172,$A$173,$A$174,$A$175,$A$176,$A$177,$A$178,$A$179,$A$180,$A$181,$A$182,$A$183,$A$184,$A$185,$A$186,$A$187,$A$188,$A$189,$A$190,$A$191,$A$192,$A$193,$A$194,$A$195,$A$196,$A$197,$A$198,$A$199,$A$200," & _
  "$A$201,$A$202,$A$203,$A$204,$A$205,$A$206,$A$207,$A$208,$A$209,$A$210,$A$211,$A$212,$A$213,$A$214,$A$215,$A$216,$A$217,$A$218,$A$219,$A$220,$A$221,$A$222,$A$223,$A$224,$A$225,$A$226,$A$227,$A$228,$A$229,$A$230,$A$231,$A$232,$A$233,$A$234,$A$235,$A$236,$A$237,$A$238,$A$239,$A$240,$A$241,$A$242,$A$243,$A$244,$A$245,$A$246,$A$247,$A$248,$A$249,$A$250,$A$251,$A$252,$A$253,$A$254,$A$255)"

Const ARGUMENT_STRING_LENGTH As Long = 1

Sub test2()

  Dim start As Single

  'Disable app events to exclude UI/calculation artefacts
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Application.Calculation = xlCalculationManual

  Dim inputs As Range
  Set inputs = Range("A1:A255")

  Dim operatorRange As Range
  Set operatorRange = Range("B1:B10000")

  Dim functionRange As Range
  Set functionRange = Range("C1:C10000")

  'Reset the range values/formulas
  inputs.Value2 = ""
  operatorRange.Formula = ConcatenationOperatorFormula
  functionRange.Formula = ConcatenateFunctionFormula

  'Change the inputs to invalidate the calculation results
  inputs.Value2 = String(ARGUMENT_STRING_LENGTH, "B")

  'Time the calculation of operator formulas
  start = Timer
  operatorRange.Calculate
  Debug.Print "Operator Calculation", ARGUMENT_STRING_LENGTH, FormatNumber(Timer - start, 8)

  'Time the calculation of function formulas
  start = Timer
  functionRange.Calculate
  Debug.Print "Function Calculation", ARGUMENT_STRING_LENGTH, FormatNumber(Timer - start, 8)

  'Reset the range values to empty
  inputs.Value2 = ""
  operatorRange.Value2 = vbNullString
  functionRange.Value2 = vbNullString

  'Restore App defaults
  Application.ScreenUpdating = True
  Application.EnableEvents = True
  Application.Calculation = xlCalculationAutomatic

End Sub

然后根据参数字符串的长度得出结果:

Method                 String Length   Seconds
---------------------  --------------  -----------
Function Calculation   1               0.06640625
Operator Calculation   1               0.21484380
Function Calculation   10              0.09765625
Operator Calculation   10              0.47265630
Function Calculation   32              0.17578130
Operator Calculation   32              1.17968800

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


您对最后一部分做出假设,一个健康的金额....
泰勒阿克莱

4

这是语义领域的差异。串联是电子表格功能的名称。与号是从Visual Basic借用的串联运算符。从未开放使用VBA的人们会发现,该功能比VBA语法更易于使用。这与保存热键,图标和菜单选项的原因相同,这使得软件更易于使用。


1

我都用。

对于我可能需要进行视觉检查的长列表,逗号比“&”符号占用更少的眼睛空间。

阅读用逗号分隔的单元格列表要比用&符号分隔的单元格更容易阅读,尤其是因为一个&符号看起来(一天15小时后)太像$。

这为CONCATENATE提供了有意义的作用。

但是-同意-没有速度优势,也没有任何功能差异。


0

一种特殊的用例是=CONCATENATE(A1:A10)比短很多=A1&A2&A3&A4&A4&A6&A7&A8&A9&A10。它显然也更正确(事实上,示例&版本有故意的错误)。

我首先尝试了此方法,但是我使用的是德语的Office Excel。 TEXTKETTE的行为与我描述的相同,但文档显示它是一个新功能,并且将VERKETTEN其替换(将与等效于德语CONCATENATE)。


3
@Vylix:不,我的意思是CONCATENATE表格显然更正确。如果你想连接一个范围的所有元素,给人的范围是多少不太容易出错,不是给一个每个元素之一。
马丁·邦纳

6
&表格的具体示例有故意的错误。
马丁·邦纳

6
@MartinBonner =CONCATENATE(A1:A10) 在Excel中不起作用。如果您具有此类功能,则它是自定义UDF,而不是本机Excel。但是它不能是与本机函数同名的UDF。
teylyn

3
@MartinBonner您的参数可能适用于像SUM和这样的运算符+,但不适用于Excel的CONCATENATE函数。=CONCATENATE(A1:A2)从来没有相同的结果=A1&A2
ThunderFrame

=CONCATENATE(A1:A10)给出的结果A1,因此显然不仅更短而且有所不同
phuclv

0

我没有在这里看到真正的答案,但确实有一些见识。(对于以后可能会查询此答案的任何人)

“连接”是一个较旧的遗留函数,其功能与“&”相同,后来又添加了“&”以确保编程语言的一致性。但是,“ Concatenate”已被“ Concat”替换为支持范围,因此您可以组合A1:A10而不需要任何自定义脚本。“&”仍然不允许范围,仅采用与“连接”功能相同的方式获取第一个单元格。因此,如果组合了一个范围,则“ Concat”将为之前两种编码方式不同的样式带来额外的功能更改。在使用非范围必需的组合字符串(如您希望将其键入)时,基本上使“ Concatenate”和“&”成为首选项。

https://support.office.com/zh-cn/article/concat-function-9b1a9a3f-94ff-41af-9736-694cbd6b4ca2


-6

Microsoft说RTFM使用&

顺便说一句,使用SUM运算符时,您将获得不同的答案。

在此处输入图片说明


“ CONCATENATE在将来的Excel版本中可能不可用。” 哈哈,对。它们仍然支持=替代方法-输入函数,如@CONCATENATE(A1,A2)和计算,如+A5+A6-A5+A6
Džuris

2
“阅读F'N手册”不正是很好左右。
Mathieu Guindon

2
@ Mat'sMug F也可以代表Fine :)
DavidPostill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.