Por que usar CONCATENATE vs e no Excel?

38

Percebi que "EXEC MySproc," & "arg, " & "arg2"é essencialmente o mesmo que =CONCATENATE("EXEC MySproc,", "arg,", "arg2") incluir a capacidade de usar avaliações, funções etc. Qual é a maneira de usar o =CONCATENATE()vs &?

Taylor Ackley
fonte
2
No caso de uma longa sequência de concatenações de cadeias, CONCATENATE () tem o potencial de ser linear em vez de quadrático no comprimento da cadeia final. veja joelonsoftware.com/2001/12/11/back-to-basics
Pieter Geerkens
11
Anedótico, mas geralmente uso CONCATENATE ao juntar mais de três strings, pelo único motivo de que estou mais acostumado a separar argumentos com vírgulas do que com e comercial ... embora, é claro, esse não seja realmente um motivo válido.
Alexandre d'Entraigues
11
@ PieterGeerkens: Não faço ideia do que você quer dizer. OK, uma longa sequência de concatenações de cadeias executadas independentemente tem o potencial de ser linear ou quadrática no comprimento da cadeia final, dependendo de como você armazena as cadeias na memória. Você tem alguma evidência (ou qualquer razão para acreditar) que CONCATENATE()e &são internamente implementada de forma diferente no Excel?
G-Man diz 'Reinstate Monica'

Respostas:

54

É para pessoas que gostam de digitar mais. Provavelmente o mesmo público que faz as coisas, em =Sum((A1*A2)-A3)vez de =(A1*A2)-A3. (Sim, essas pessoas existem, e eu não sei por que elas fazem isso)

Ele também oferece oportunidades maravilhosas para criar sua primeira função definida pelo usuário com o VBA para criar algo mais útil que Concatenate ().

O Excel 2016 (com uma assinatura do Office 365) possui uma nova função chamada TextJoin () , que usa um delimitador e um intervalo como argumentos e é muito mais rápido do que digitar os "e" comercial e os delimitadores como cadeias de texto. Agora, isso é útil.

insira a descrição da imagem aqui

teylyn
fonte
5
Pelo menos SUM pode variar. Obrigado pelo ponteiro em TEXTJOIN. O trabalho ainda não foi atualizado para 2016, mas, quando o fizer, finalmente poderei me aposentar da UDF.
Dranon
4
Você não quis dizer =Sum(A1,A2)(como alternativa =A1+B1)?
xehpuk
8
@xehpuk Não, eu não fiz. Algumas pessoas envolvem uma função Sum () em cálculos simples. Eles poderiam usar, =A1+A2mas por algum motivo, eles escrevem =Sum(A1+A1). Ou =Sum(A1-A2)onde eles poderiam nos =A1-A2. Ou =Sum(A1*A2)onde eles poderiam usar =A1*A2. Algumas pessoas colocam todos os tipos de fórmulas em uma função Sum () e estou tentando entender o porquê.
teylyn
2
@IllusiveBrian é porque você ainda mantém pressionada a tecla Shift quando pressiona a barra de espaço.
Mathieu Guindon
4
-1. Embora a resposta seja engraçada, também é inútil. A pergunta não era "Por que as pessoas estão usando CONCATENATE em vez de &?" mas "Por que alguém deve CONCATENAR em vez de &?". A resposta é "é completamente equivalente, a ajuda online do Excel afirma que & deve ser usado no lugar". A explicação correta (e útil), por exemplo, de Aganju, é que & veio mais tarde e CONCATENATE foi deixado por motivos de compatibilidade, o que é um motivo completamente válido. Tudo isso "as pessoas são estúpidas e querem digitar muito" é completamente desnecessário; lá são razões por que eles fazem isso e não é sua estupidez.
AnoE
22

Provavelmente é porque eles estão usando o botão Inserir Função.

insira a descrição da imagem aqui

Às vezes, faço isso quando estou comendo com a mão esquerda e apenas fazendo algumas fórmulas de baixo nível, ou quando estou usando um dispositivo de toque e não me incomodo em alternar entre símbolos, letras e números na tela de toque .

Nelson
fonte
11
+1 Sim. Eu sempre usei o botão, foi suficiente, então não há incentivo para aprender os operadores.
Kubanczyk
3
Para concatear strings, preciso lembrar de ponto .para perl, pipe ||para SQL, nenhum caractere para cmd e bash, +para Java. Eu realmente preciso &apenas do Excel?
Kubanczyk
2
@kubanczyk se você consegue se lembrar disso ., ||e +então se lembra &. É mais fácil do que concatenate, esp. se alguém não é muito fluente em inglês. Também é usado em VBA
phuclv
3
@ LưuVĩnhPhúc Re fluência em Inglês - tanto quanto eu sei, esses nomes de função são localizadas (por exemplo, é VERKETTENem alemão Excel)
Hagen von Eitzen
2
@HagenvonEitzen outro bom motivo para usar o operador sobre a função!
Mathieu Guindon
17

Possui apenas razões históricas e de compatibilidade. As versões anteriores do Excel não eram compatíveis com um formato e outras ferramentas de planilha (como Google Docs, Apple Numbers ou Open Office) não eram compatíveis com o outro.

Escolha o que você preferir.

Observe que, dependendo do seu formato salvo, o Excel precisa de mais espaço para economizar do CONCATENATE()que &.

Aganju
fonte
Sim. Eu não sabia que &era o substituto CONCATENATEaté agora. Eu raramente usar o Excel, mas quando eu faço normalmente é algo que precisa concatenação
gabe3886
15

Na minha opinião, o uso seletivo de concatenar e comercial, pode levar a fórmulas mais claras.

Essa concatenação dos detalhes do endereço, usando uma mistura de CONCATENATEe &me parece mais clara:

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

Do que o uso exclusivo de &:

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

E o uso exclusivo deCONCATENATE

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

Por outro lado, eu argumentaria que uma UDF como BuildAddressseria uma solução melhor (e estaria melhor posicionada para lidar com as sutilezas da formatação de endereços nos domínios da internacionalização - embora eu não tenha implementado isso) ...

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

Mas talvez outro exemplo, que inclua o uso de & dentro da string literal, demonstre melhor a dificuldade de ler uma fórmula que se obriga a usar exclusivamente operadores:

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

Pode ser melhor escrito como:

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

Mas o desempenho é o que importa e, dependendo do número de argumentos que estão sendo concatenados e do tamanho de cada argumento, a CONCATENATEfunção parece superar o operador de concatenação por um fator entre 4 e 6. É certo que este exemplo é extremo, com 255 argumentos sendo concatenados, 10.000 vezes. Eu não recomendo o uso de um comprimento de seqüência de caracteres maior que 32, ou você pode ficar sem memória / travar o Excel.

Aqui está um mecanismo de tempo bruto:

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

E os resultados, de acordo com o comprimento das sequências de argumentos:

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

Mas então, nem discutimos o elefante na sala. Você está construindo um comando SQL usando concatenação. Não faça isso. Você está executando um procedimento armazenado que aceita parâmetros. A menos que você tenha higienizado suas entradas (e acho que não), a construção de uma string SQL usando concatenação está pedindo um ataque de injeção de SQL. Você também pode expor uma UDF chamada JohnnyDropTables...

ThunderFrame
fonte
Você está fazendo uma boa quantidade de suposições sobre essa última parte ....
Taylor Ackley
4

É uma diferença de domínio semântico. Concatenar é o nome de uma função de planilha. O Ampersand é um operador de concatenação emprestado do Visual Basic. Pessoas que nunca abrem o uso do VBA acham uma função muito mais fácil de usar do que a sintaxe do VBA. É a mesma razão pela qual há uma tecla de atalho, um ícone e uma opção de menu para salvar, o que facilita o uso do software.

Andrew Neely
fonte
1

Eu uso os dois.

Para listas longas que talvez eu precise revisar visualmente, uma vírgula ocupa menos espaço nos olhos do que um e comercial.

É mais fácil ler uma lista de células separadas por vírgulas do que por e comercial, especialmente porque um e comercial se parece (depois de 15 horas por dia) com um valor muito alto.

Isso fornece um papel significativo para CONCATENATE.

Mas - concordo - não há benefício de velocidade ou diferença funcional.

Justin Neville-Rolfe
fonte
0

Um caso de uso específico =CONCATENATE(A1:A10)é muito menor que =A1&A2&A3&A4&A4&A6&A7&A8&A9&A10. Também é muito mais obviamente correto (na verdade, a &versão de exemplo tem um erro deliberado).

Eu tentei isso primeiro, mas estava usando o escritório Excel, que está em alemão. TEXTKETTEse comporta como eu descrevo, mas a documentação mostra que é uma função nova e substitui VERKETTEN(que será o equivalente alemão de CONCATENATE).

Martin Bonner apoia Monica
fonte
3
@Vylix: Não, quero dizer que o CONCATENATEformulário está mais obviamente correto. Se você deseja concatenar todos os elementos de um intervalo, fornecer o intervalo é muito menos propenso a erros do que fornecer cada elemento um por um.
Martin Bonner apoia Monica
6
O exemplo específico do &formulário tem um erro deliberado.
Martin Bonner apoia Monica
6
@MartinBonner =CONCATENATE(A1:A10) não funciona no Excel. Se você tem essa função, é uma UDF personalizada, não um Excel nativo. Mas não pode ser um UDF com o mesmo nome que a função nativa.
teylyn
3
@MartinBonner Seu argumento pode valer para uma função como SUMe como operadores +, mas não se aplica à CONCATENATEfunção do Excel . nunca=CONCATENATE(A1:A2) é o mesmo resultado que=A1&A2
ThunderFrame
=CONCATENATE(A1:A10)dá o resultado de A1, então obviamente não é apenas mais curto, mas diferente
phuclv 07/07
0

Não vi as respostas verdadeiras aqui, mas tenho algumas dicas. (para qualquer pessoa que possa, no futuro, procurar esta resposta)

"Concatenar" é uma função legada mais antiga, que faz as mesmas coisas que o "&", "&" foi adicionado posteriormente para consistência nas linguagens de programação. No entanto, "Concatenar" foi substituído por "Concat" para oferecer suporte a intervalos, para que você possa combinar A1: A10 sem precisar de nenhum script personalizado. O "&" ainda não permite um intervalo e leva apenas a primeira célula da mesma maneira que as funções "Concatenar". Portanto, se você combinar um intervalo, o "Concat" oferecerá essa alteração extra de função nos 2 estilos anteriores, que são codificados de maneira diferente. Tornar "Concatenar" e "&" essencialmente uma preferência ao usar strings combinadas necessárias sem alcance sobre como você deseja digitá-lo.

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

Adrian Loelke
fonte
-6

RTFM A Microsoft diz que usa o &.

BTW, você obterá respostas diferentes ao usar o operador SUM.

insira a descrição da imagem aqui

THBBFT
fonte
"CONCATENATE pode não estar disponível em versões futuras do Excel." Haha, certo. Eles ainda suportam =alternativas - inserir funções como @CONCATENATE(A1,A2)e cálculos como +A5+A6ou -A5+A6.
Džuris 6/07/07
2
"Leia o manual do F'n" não é exatamente o que é legal .
Mathieu Guindon
2
@ Mat'sMug O F também pode ser bom :) :)
DavidPostill