Зачем использовать CONCATENATE vs & в Excel?


38

Я заметил, что "EXEC MySproc," & "arg, " & "arg2"по сути это то же самое, что в =CONCATENATE("EXEC MySproc,", "arg,", "arg2") том числе возможность использовать оценки, функции etecetera. Какая польза от использования =CONCATENATE()против &?


2
В случае длинной последовательности конкатенаций строк CONCATENATE () потенциально может быть линейным, а не квадратичным по длине конечной строки. см. joelonsoftware.com/2001/12/11/back-to-basics
Питер Гиркенс

1
Неоднозначно, но я часто использую CONCATENATE при объединении трех строк, по той единственной причине, что я больше привык разделять аргументы запятыми, чем с амперсандами ... хотя, конечно, это не совсем правильная причина.
Александр d'Entraigues

1
@PieterGeerkens: Понятия не имею, в чем ваша точка зрения. ОК, длинная последовательность независимо выполняемых конкатенаций строк может быть линейной или квадратичной по длине конечной строки, в зависимости от того, как вы храните строки в памяти. Есть ли у вас какое - либо доказательство (или какое - либо основание полагать) , что CONCATENATE()и &являются внутренне реализованы по- разному в Excel?
G-Man говорит: «Восстановите Монику»

Ответы:


54

Это для людей, которые любят печатать больше. Вероятно, та же аудитория, которая делает вещи, =Sum((A1*A2)-A3)а не =(A1*A2)-A3. (Да, эти люди существуют, и я не знаю, почему они это делают)

Он также предоставляет прекрасные возможности для создания самой первой пользовательской функции с помощью VBA для создания чего-то более полезного, чем Concatenate ().

В Excel 2016 (с подпиской на Office 365) есть новая функция TextJoin () , которая принимает в качестве аргументов разделитель и диапазон и намного быстрее, чем ввод амперсандов и разделителей в виде текстовых строк. Теперь это полезно.

введите описание изображения здесь


5
По крайней мере, СУМ может принять диапазон. Спасибо за указатель на TEXTJOIN. Работа еще не обновлена ​​до 2016 года, но когда они это сделают, я наконец смогу удалить свой UDF.
Дранон

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 (), и я пытаюсь понять, почему.
Тейлин

2
@IllusiveBrian, это потому, что вы все еще удерживаете клавишу Shift, когда нажимаете пробел.
Матье

4
-1. Хотя ответ смешной, он также бессмыслен. Вопрос был не в том, «почему люди используют CONCATENATE вместо &?» но "Почему нужно делать CONCATENATE вместо &?" Ответ таков: «Это полностью эквивалентно, в онлайн-справке Excel говорится, что & следует использовать вместо». Правильное (и полезное) объяснение, например, от Аганджу, состоит в том, что & пришло позже, а CONCATENATE оставили в целях совместимости, что является вполне обоснованной причиной. Все эти «люди глупы и хотят много печатать» совершенно бесполезны; есть есть причины , почему они делают это , и это не их глупость.
AnoE

22

Вероятно, потому, что они используют кнопку Вставить функцию.

введите описание изображения здесь

Я иногда делаю это, когда я ем левой рукой и просто делаю некоторые формулы низкого уровня, или когда я использую сенсорное устройство, и меня не беспокоит переключение между символами, буквами и цифрами на сенсорном экране ,


1
+1 Да Я всегда использовал кнопку, этого было достаточно, поэтому нет стимула изучать операторов.
Кубанчик

3
Для объединения строк мне нужно запомнить точку .для perl, pipe-pipe ||для SQL, без char для cmd и bash +для Java. Мне действительно нужно &только для Excel?
Кубанчик

2
@kubanczyk, если вы можете вспомнить их ., ||а +затем вы можете вспомнить &. Это проще, чем concatenate, ESP. если вы не очень хорошо владеете английским языком. Это также используется в VBA
phuclv

3
@ LưuVĩnhPhúc Re свободное владение английским языком - насколько я знаю, названия этих функций локализованы (например, VERKETTENв немецком Excel)
Хаген фон

2
@HagenvonEitzen еще одна веская причина использовать оператор над функцией!
Матье

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 аргументов объединяются, 10000 раз. Я не рекомендую использовать длину строки аргумента больше 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-инъекции. Вы могли бы также выставить UDF под названием JohnnyDropTables...


Вы делаете достаточное количество предположений в этой последней части ....
Тейлор Экли

4

Это различие семантической области. Конкатенация - это имя функции электронной таблицы. Ampersand - это оператор конкатенации, заимствованный из Visual Basic. Люди, которые никогда не открывают использование VBA, найдут функцию, гораздо более простую в использовании, чем синтаксис VBA. По той же причине существует горячая клавиша, значок и опция меню для сохранения, что упрощает использование программного обеспечения.


1

Я использую оба.

Для длинных списков, которые мне, возможно, потребуется просмотреть визуально, запятая занимает меньше места, чем амперсанд.

Список ячеек, разделенных запятыми, легче читать, чем амперсанды, тем более что амперсанд выглядит (после 15 часового дня) слишком похожим на $.

Это обеспечивает значимую роль для CONCATENATE.

Но - согласитесь - нет никакой выгоды от скорости или какой-либо функциональной разницы.


0

Один конкретный вариант использования =CONCATENATE(A1:A10)намного короче =A1&A2&A3&A4&A4&A6&A7&A8&A9&A10. Это также намного более очевидно правильно (на самом деле &версия примера имеет намеренную ошибку).

Я попробовал это сначала, но я использовал офис Excel, который на немецком языке. TEXTKETTEведет себя так, как я описываю, но документация показывает, что это новая функция, и заменяет VERKETTEN(что будет немецким эквивалентом CONCATENATE).


3
@Vylix: Нет, я имею в виду, что CONCATENATEформа более правильная. Если вы хотите объединить все элементы диапазона, задание диапазона намного менее подвержено ошибкам, чем предоставление каждого элемента по одному.
Мартин Боннер поддерживает Монику

6
Конкретный пример &формы имеет намеренную ошибку.
Мартин Боннер поддерживает Монику

6
@MartinBonner =CONCATENATE(A1:A10) не работает в Excel. Если у вас есть такая функция, это пользовательский UDF, а не собственный Excel. Но это не может быть UDF с тем же именем, что и у нативной функции.
Тейлин

3
@MartinBonner Ваш аргумент может иметь место для функций типа like SUMи операторов +, но он не применяется к CONCATENATEфункции Excel . =CONCATENATE(A1:A2)это никогда не тот же результат=A1&A2
ThunderFrame

=CONCATENATE(A1:A10)дает результат A1, поэтому он, очевидно, не только короче, но и отличается
phuclv

0

Я не видел истинных ответов здесь, но у меня есть некоторое понимание. (для тех, кто может в будущем посмотреть этот ответ)

«Конкатенация» является устаревшей унаследованной функцией, которая выполняет те же действия, что и «&», «&» была добавлена ​​позже для согласованности в языках программирования. Однако «Конкатенация» была заменена на «Конкат» для поддержки диапазонов, поэтому вы можете комбинировать А1: А10 без необходимости каких-либо пользовательских сценариев. Символ «&» по-прежнему не допускает диапазон и занимает только первую ячейку таким же образом, как и функции «Конкатенация». Таким образом, если объединить диапазон, «Concat» дает это дополнительное изменение функции по сравнению с двумя предыдущими стилями, которые просто кодируются по-разному. Создание «Concatenate» и «&», по сути, предпочтение при использовании не-диапазонов, требующих комбинированных строк о том, как вы хотите печатать.

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


-6

RTFM Microsoft говорит, что использовать &.

Кстати, вы получите разные ответы при использовании оператора SUM.

введите описание изображения здесь


«CONCATENATE может быть недоступен в будущих версиях Excel». Хаха, верно. Они по-прежнему поддерживают =альтернативы - ввод функций вроде @CONCATENATE(A1,A2)и вычислений типа +A5+A6или -A5+A6.
Джурис

2
«Читай руководство F'n» - это не совсем то, о чем приятно .
Матье

2
@ Mat'sMug F также может означать Fine :)
DavidPostill
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.