¿Por qué usar CONCATENATE vs & en Excel?


38

Noté que "EXEC MySproc," & "arg, " & "arg2"es esencialmente lo mismo que =CONCATENATE("EXEC MySproc,", "arg,", "arg2") incluir la capacidad de usar evaluaciones, funciones etecetera. ¿Cuál es el caso de uso para usar =CONCATENATE()vs &?


2
En el caso de una larga secuencia de concatenaciones de cadenas, CONCATENATE () tiene el potencial de ser lineal en lugar de cuadrático en la longitud de la cadena final. ver joelonsoftware.com/2001/12/11/back-to-basics
Pieter Geerkens

1
Anecdótico, pero a menudo uso CONCATENAR cuando me uno a tres cadenas, por la única razón de que estoy más acostumbrado a separar los argumentos con comas que con los símbolos de unión ... aunque, por supuesto, esa no es una razón válida.
Alexandre d'Entraigues

1
@PieterGeerkens: No tengo idea de cuál es tu punto. OK, una secuencia larga de concatenaciones de cadenas realizadas independientemente tiene el potencial de ser lineal o cuadrática en la longitud de la cadena final, dependiendo de cómo almacene las cadenas en la memoria. ¿Tiene alguna evidencia (o alguna razón para creer) CONCATENATE()y &se implementan internamente de manera diferente en Excel?
G-Man dice 'reinstalar a Monica' el

Respuestas:


54

Es para las personas que les gusta escribir más. Probablemente la misma audiencia que hace cosas como en =Sum((A1*A2)-A3)lugar de =(A1*A2)-A3. (Sí, estas personas existen, y no sé por qué lo hacen)

También brinda maravillosas oportunidades para crear su primera función definida por el usuario con VBA para crear algo más útil que Concatenate ().

Excel 2016 (con una suscripción a Office 365) tiene una nueva función llamada TextJoin () , que toma un delimitador y un rango como argumentos y es mucho más rápido que escribir los símbolos y los delimitadores como cadenas de texto. Ahora, eso es útil.

ingrese la descripción de la imagen aquí


55
Al menos SUM puede tomar un rango. Gracias por el puntero en TEXTJOIN. El trabajo aún no se ha actualizado a 2016, pero cuando lo hagan, finalmente podré retirar mi UDF.
Dranon

44
¿No quisiste decir =Sum(A1,A2)(como alternativa a =A1+B1)?
xehpuk

8
@xehpuk No, no lo hice. Algunas personas envuelven una función Sum () alrededor de cálculos simples. Podrían usar, =A1+A2pero por alguna razón, escriben =Sum(A1+A1). O =Sum(A1-A2)donde nos pudieron =A1-A2. O =Sum(A1*A2)donde podrían usar =A1*A2. Algunas personas ponen todo tipo de fórmulas en una función Sum () y estoy tratando de entender por qué.
teylyn

2
@IllusiveBrian es porque todavía estás presionando la tecla Shift cuando presionas esa barra espaciadora.
Mathieu Guindon

44
-1. Si bien la respuesta es divertida, tampoco tiene sentido. La pregunta no era "¿Por qué las personas usan CONCATENATE en lugar de &?" pero "¿Por qué debería uno CONCATENAR en lugar de &?". La respuesta es "es completamente equivalente, la ayuda en línea de Excel establece que y debería utilizarse en su lugar". La explicación correcta (y útil), por ejemplo, de Aganju, es que vino más tarde y CONCATENATE se ha dejado por razones de compatibilidad, que es una razón completamente válida. Toda esta "gente es estúpida y quiere escribir mucho" es completamente innecesaria; no son razones por las que lo hacen y no es su estupidez.
AnoE

22

Probablemente sea porque están usando el botón Insertar función.

ingrese la descripción de la imagen aquí

A veces hago esto cuando estoy comiendo con la mano izquierda y solo estoy haciendo algunas fórmulas de bajo nivel, o cuando estoy usando un dispositivo táctil y no me molesto en cambiar entre los símbolos, letras y números en la pantalla táctil .


1
+1 Sip. Siempre he usado el botón, era suficiente, por lo que no hay incentivo para aprender operadores.
kubanczyk

3
Para concatenar cadenas, necesito recordar dot .para perl, pipe-pipe ||para SQL, no char para cmd y bash, +para Java. ¿Realmente necesito &solo para Excel?
kubanczyk

2
@kubanczyk si puedes recordarlos ., ||y +luego puedes recordarlos &. Es más fácil que concatenate, especialmente. si uno no habla inglés con fluidez. También se usa en VBA
phuclv

3
@ LưuVĩnhPhúc Re fluidez en inglés - que yo sepa, esos nombres de funciones están localizados (por ejemplo, está VERKETTENen Excel alemán)
Hagen von Eitzen

2
@HagenvonEitzen ¡otra buena razón para usar el operador sobre la función!
Mathieu Guindon

17

Tiene solo razones históricas y de compatibilidad. Las versiones anteriores de Excel no admitían un formato, y otras herramientas de hoja de cálculo (como Google Docs, Apple Numbers u Open Office) no admitían el otro.

Elige el que prefieras.

Tenga en cuenta que, según su formato de guardado, Excel necesita más espacio para guardar CONCATENATE()que &.


Sip. No sabía que &era el reemplazo CONCATENATEhasta ahora. Yo rara vez uso de Excel, pero cuando lo hago por lo general es algo que necesita la concatenación
gabe3886

15

En mi opinión, el uso selectivo de concatenate y ampersands, puede conducir a fórmulas más claras.

Esta concatenación de detalles de dirección, usando una mezcla de CONCATENATEy me &parece más clara:

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

Que el uso exclusivo de &:

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

Y el uso exclusivo deCONCATENATE

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

Por otra parte, diría que un UDF como BuildAddresssería una mejor solución (y estaría mejor ubicado para manejar las sutilezas del formato de direcciones en dominios de internacionalización, aunque no lo he implementado) ...

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

Pero quizás otro ejemplo, que incluye el uso de & dentro del literal de cadena, demuestre mejor la dificultad de leer una fórmula que se obliga a usar exclusivamente operadores:

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

Podría escribirse mejor como:

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

Pero el rendimiento es lo que importa, y dependiendo del número de argumentos que se concatenan y la longitud de cada argumento, la CONCATENATEfunción parecería superar al operador de concatenación en un factor de entre 4 y 6. Es cierto que este ejemplo es extremo, con 255 argumentos siendo concatenados, 10,000 veces. No recomiendo usar una longitud de cadena de argumento mayor que 32, o puede quedarse sin memoria / bloquear Excel.

Aquí hay un mecanismo de tiempo crudo:

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

Y los resultados, de acuerdo con la longitud de las cadenas 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

Pero entonces, ni siquiera hemos discutido el elefante en la habitación. Estás construyendo un comando SQL usando concatenación. No hagas eso. Estás ejecutando un procedimiento almacenado que acepta parámetros. A menos que haya desinfectado sus entradas (y supongo que no), construir una cadena SQL usando concatenación requiere un ataque de inyección SQL. También podrías exponer un UDF llamado JohnnyDropTables...


Estás haciendo una cantidad saludable de suposiciones en esa última parte ...
Taylor Ackley

4

Es una diferencia de dominio semántico. Concatenar es el nombre de una función de hoja de cálculo. El Ampersand es un operador de concatenación prestado de Visual Basic. Las personas que nunca abren el uso de VBA encontrarían una función mucho más fácil de usar que la sintaxis de VBA. Es la misma razón por la que hay una tecla de acceso rápido, un icono y una opción de menú para guardar, lo que hace que el software sea más fácil de usar.


1

Yo uso ambos.

Para las listas largas que podría necesitar revisar visualmente, una coma ocupa menos espacio para los ojos que un signo de unión.

Es más fácil leer una lista de celdas separadas por comas que por ampersand, especialmente porque un ampersand se parece (después de un día de 15 horas) a un $.

Esto proporciona un papel significativo para CONCATENAR.

Pero, de acuerdo, no hay beneficio de velocidad ni diferencia funcional.


0

Un caso de uso particular es que =CONCATENATE(A1:A10)es mucho más corto que =A1&A2&A3&A4&A4&A6&A7&A8&A9&A10. También es mucho más obviamente correcto (de hecho, la &versión de ejemplo tiene un error deliberado).

Lo intenté primero, pero estaba usando la oficina Excel, que está en alemán. TEXTKETTEse comporta como lo describo, pero la documentación muestra que es una función nueva y reemplaza VERKETTEN(que será el equivalente alemán de CONCATENATE).


3
@Vylix: No, quiero decir que el CONCATENATEformulario es más obviamente correcto. Si desea concatenar todos los elementos de un rango, dar el rango es mucho menos propenso a errores, que dar a cada elemento uno por uno.
Martin Bonner apoya a Monica el

66
El ejemplo específico del &formulario tiene un error deliberado.
Martin Bonner apoya a Monica el

66
@MartinBonner =CONCATENATE(A1:A10) no funciona en Excel. Si tiene esa función, es un UDF personalizado, no Excel nativo. Pero no puede ser un UDF con el mismo nombre que la función nativa.
teylyn

3
@MartinBonner Su argumento podría ser válido para una función SUMy operadores similares +, pero no se aplica a la CONCATENATEfunción de Excel . nunca=CONCATENATE(A1:A2) es el mismo resultado que=A1&A2
ThunderFrame

=CONCATENATE(A1:A10)da el resultado de A1, por lo que obviamente no solo es más corto sino diferente
phuclv

0

No vi las respuestas verdaderas aquí, pero tengo alguna idea. (para cualquiera que pueda buscar esta respuesta en el futuro)

"Concatenar" es una función heredada más antigua, que hace lo mismo que "&", "&" se agregó más adelante para mantener la coherencia en los lenguajes de programación. Sin embargo, "Concatenate" ha sido reemplazado por "Concat" para admitir rangos, por lo que puede combinar A1: A10 sin necesidad de ningún script personalizado. El "&" aún no permite un rango y solo toma la primera celda de la misma manera que las funciones "Concatenar". Entonces, si combina un rango, el "Concat" proporciona un cambio de función adicional sobre los 2 estilos anteriores que se codifican de manera diferente. Hacer que "Concatenar" y "&" sean esencialmente una preferencia cuando se utilizan cadenas combinadas que no son de rango sobre cómo desea escribirlo.

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


-6

RTFM Microsoft dice que use el &.

Por cierto, obtendrá diferentes respuestas cuando utilice el operador SUM.

ingrese la descripción de la imagen aquí


"CONCATENATE puede no estar disponible en futuras versiones de Excel". Jaja, cierto. Todavía admiten =alternativas: ingresar funciones como @CONCATENATE(A1,A2)y cálculos como +A5+A6o -A5+A6.
Džuris

2
"Leer el manual de F'n" no es exactamente de lo que se trata ser amable .
Mathieu Guindon

2
@ Mat'sMug The F también puede significar Fine :)
DavidPostill
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.