Навіщо використовувати CONCATENATE vs та в Excel?


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 під час з'єднання над трьома рядками з єдиної причини, що я більше звик розділяти аргументи комами, ніж з амперсандами ... хоча це, звичайно, не є дійсно вагомою причиною.
Олександр д'Ентрайгус

1
@PieterGeerkens: Я поняття не маю, в чому твій погляд. Гаразд, довга послідовність незалежно виконаних рядкових конкатенацій може бути лінійною або квадратичною по довжині остаточного рядка, залежно від того, як ви зберігаєте рядки в пам'яті. Чи є у вас якийсь - або доказ (або яке - або підставу вважати) , що CONCATENATE()і &є внутрішньо реалізовані по- різному в Excel?
G-Man каже: "Відновіть Моніку"

Відповіді:


54

Це для людей, які люблять набирати більше. Напевно, та сама аудиторія, яка робить такі речі, як =Sum((A1*A2)-A3)замість =(A1*A2)-A3. (Так, ці люди існують, і я не знаю, чому вони так роблять)

Він також надає чудові можливості створити свою першу функцію, визначену користувачем за допомогою VBA, щоб створити щось більш корисне, ніж Concatenate ().

Excel 2016 (з підпискою на Office 365) має нову функцію під назвою TextJoin () , яка приймає роздільник та діапазон як аргументи і набагато швидше, ніж набирати розширення та роздільники як текстові рядки. Тепер, що корисно.

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


5
Принаймні SUM може приймати діапазон. Дякуємо за вказівник на TEXTJOIN. Робота ще не оновилася до 2016 року, але коли вони завершаться, я нарешті зможу вийти на пенсію зі свого АДС.
Дранон

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 замість &?" але "Чому слід КОНЦЕНТУВАТИ замість &?". Відповідь "цілком еквівалентний, в онлайн-довідці Excel зазначено, що замість цього потрібно використовувати". Правильне (і корисне) пояснення, наприклад, від Aganja, полягає в тому, що & прийшло пізніше, і CONCATENATE був залишений з міркувань сумісності, що є цілком поважною причиною. Все це "люди дурні і хочуть багато набирати" абсолютно не вимагається; є є причини , чому вони роблять це , і це не їхня дурість.
AnoE

22

Можливо, тому, що вони використовують кнопку Вставити функцію.

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

Я іноді роблю це, коли їжу лівою рукою і просто виконую формули низького рівня, або коли я користуюся сенсорним пристроєм, і не можу не турбуватися перемикатися між символами, літерами та цифрами на сенсорному екрані .


1
+1 Так. Я завжди користувався кнопкою, її було достатньо, тому немає стимулу вчитися операторам.
kubanczyk

3
Для стислих рядків мені потрібно запам’ятати крапку .для perl, pipe-pipe ||для SQL, немає char для cmd та bash, +для Java. Мені справді потрібно &лише для Excel?
kubanczyk

2
@kubanczyk , якщо ви пам'ятаєте , ті ., ||і +тоді ви можете згадати &. Це простіше, ніж concatenate, особливо. якщо хтось не дуже добре володіє англійською мовою. Він також використовується у VBA
phuclv

3
@ LưuVĩnhPhúc Re вільне володіння англійською мовою - наскільки я знаю, ці назви функцій локалізовані (наприклад, це VERKETTENв німецькій мові Excel)
Hagen von Eitzen

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

Це смислова різниця доменів. Concatenate - назва функції електронних таблиць. 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 з тим самим іменем, що і нативна функція.
teylyn

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

=CONCATENATE(A1:A10)дає результат A1, тому, очевидно, не тільки коротше, але й різне
phuclv

0

Я не бачив справжніх відповідей тут, але маю деяке розуміння. (для всіх, хто може в майбутньому шукати цю відповідь)

"Concatenate" - це старіша застаріла функція, яка робить те саме, що "&", "&" було додано пізніше для послідовності мов програмування. Однак "Concatenate" було замінено на "Concat" для підтримки діапазонів, тому ви можете комбінувати A1: A10, не потребуючи спеціальних сценаріїв. "&" Все ще не дозволяє діапазон і приймає лише першу клітинку таким же чином, як і "Concatenate". Отже, якщо поєднувати діапазон, "Concat" надає додаткові зміни функції в порівнянні з попередніми 2 стилями, які просто кодуються по-різному. Зробити "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 The F також може виступати за Fine :)
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.