39

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

8 ответов8

54

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

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

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

23

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

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

18

У него есть только исторические причины и причины совместимости. Предыдущие версии Excel не поддерживали один формат, а другие инструменты для работы с электронными таблицами (такие как Google Docs, Apple Numbers или Open Office) не поддерживали другой.

Выберите тот, который вы предпочитаете.

Обратите внимание, что в зависимости от формата сохранения Excel требуется больше места для сохранения CONCATENATE() чем & .

16

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

Это объединение деталей адреса с использованием смеси 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 ...

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).

-6

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .