Я заметил, что "EXEC MySproc," & "arg, " & "arg2"
по существу совпадает с =CONCATENATE("EXEC MySproc,", "arg,", "arg2")
включая возможность использовать оценки, функции etecetera. Какой смысл использовать =CONCATENATE()
против &
?
8 ответов
Это для людей, которые любят печатать больше. Вероятно, та же аудитория, которая делает такие вещи, как =Sum((A1*A2)-A3)
вместо =(A1*A2)-A3
. (Да, эти люди существуют, и я не знаю, почему они это делают)
Он также предоставляет прекрасные возможности для создания самой первой пользовательской функции с помощью VBA для создания чего-то более полезного, чем Concatenate().
В Excel 2016 (с подпиской на Office 365) есть новая функция TextJoin (), которая принимает в качестве аргументов разделитель и диапазон и намного быстрее, чем ввод амперсандов и разделителей в виде текстовых строк. Теперь это полезно.
У него есть только исторические причины и причины совместимости. Предыдущие версии Excel не поддерживали один формат, а другие инструменты для работы с электронными таблицами (такие как Google Docs, Apple Numbers или Open Office) не поддерживали другой.
Выберите тот, который вы предпочитаете.
Обратите внимание, что в зависимости от формата сохранения Excel требуется больше места для сохранения CONCATENATE()
чем &
.
На мой взгляд, выборочное использование конкатенации и амперсандов может привести к более четким формулам.
Это объединение деталей адреса с использованием смеси 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-инъекции. Вы могли бы также представить UDF под названием JohnnyDropTables
...
Это различие семантической области. Конкатенация - это имя функции электронной таблицы. Ampersand - это оператор конкатенации, заимствованный из Visual Basic. Люди, которые никогда не открывают использование VBA, найдут функцию, гораздо более простую в использовании, чем синтаксис VBA. По той же причине существует горячая клавиша, значок и опция меню для сохранения, что упрощает использование программного обеспечения.
Я использую оба.
Для длинных списков, которые мне, возможно, потребуется просмотреть визуально, запятая занимает меньше места, чем амперсанд.
Список ячеек, разделенных запятыми, легче читать, чем амперсанды, тем более что амперсанд выглядит (после 15-часового дня) слишком похожим на $.
Это обеспечивает значимую роль для CONCATENATE.
Но - согласитесь - здесь нет никакого выигрыша в скорости или какой-либо функциональной разницы.
Один из конкретных случаев использования =CONCATENATE(A1:A10)
намного короче, чем =A1&A2&A3&A4&A4&A6&A7&A8&A9&A10
. Это также намного более очевидно правильно (фактически пример &
версия имеют преднамеренную ошибку).
Я попробовал это сначала, но я использовал офис Excel, который на немецком языке. TEXTKETTE
ведет себя так, как я описываю, но документация показывает, что это новая функция и заменяет VERKETTEN
(который будет немецким эквивалентом CONCATENATE
).
RTFM Microsoft говорит использовать &
.
Кстати, вы получите разные ответы при использовании оператора SUM.