Perché usare CONCATENATE vs & in Excel?


39

Ho notato che "EXEC MySproc," & "arg, " & "arg2"è essenzialmente lo stesso di =CONCATENATE("EXEC MySproc,", "arg,", "arg2") includere la capacità di usare valutazioni, funzioni, ecc. Qual è il caso d'uso per usare =CONCATENATE()vs &?


2
Nel caso di una lunga sequenza di concatenazioni di stringhe, CONCATENATE () ha il potenziale per essere lineare anziché quadratico nella lunghezza della stringa finale. vedi joelonsoftware.com/2001/12/11/back-to-basics
Pieter Geerkens

1
Aneddotico, ma uso spesso CONCATENATE quando mi unisco a più di tre stringhe, per il solo motivo che sono più abituato a separare argomenti con virgole che con e commerciali ... anche se ovviamente non è un motivo valido.
Alexandre d'Entraigues,

1
@PieterGeerkens: non ho idea di quale sia il tuo punto. OK, una lunga sequenza di concatenazioni di stringhe eseguite in modo indipendente ha il potenziale di essere lineare o quadratica nella lunghezza della stringa finale, a seconda di come si memorizzano le stringhe in memoria. Hai qualche prova (o qualche motivo per credere) che CONCATENATE()e &siano implementati internamente in modo diverso in Excel?
G-Man,

Risposte:


54

È per le persone a cui piace scrivere di più. Probabilmente lo stesso pubblico che fa cose come =Sum((A1*A2)-A3)invece di =(A1*A2)-A3. (Sì, queste persone esistono e non so perché lo facciano)

Offre inoltre meravigliose opportunità per creare la tua primissima funzione definita dall'utente con VBA per creare qualcosa di più utile di Concatenate ().

Excel 2016 (con un abbonamento a Office 365) ha una nuova funzione chiamata TextJoin () , che accetta un delimitatore e un intervallo come argomenti ed è molto più veloce rispetto alla digitazione delle e commerciali e dei delimitatori come stringhe di testo. Ora, QUELLO è utile.

inserisci qui la descrizione dell'immagine


5
Almeno SUM può assumere un intervallo. Grazie per il puntatore su TEXTJOIN. Il lavoro non è stato ancora aggiornato al 2016, ma quando lo faranno potrò finalmente ritirare il mio UDF.
Dranon,

4
Non intendevi =Sum(A1,A2)(in alternativa a =A1+B1)?
xehpuk,

8
@xehpuk No, non l'ho fatto. Alcune persone avvolgono una funzione Sum () attorno a semplici calcoli. Potrebbero usare =A1+A2ma per qualche motivo, scrivono =Sum(A1+A1). O =Sum(A1-A2)dove potrebbero noi =A1-A2. O =Sum(A1*A2)dove potrebbero usare =A1*A2. Alcune persone mettono tutti i tipi di formule in una funzione Sum () e sto cercando di capire il perché.
teylyn,

2
@IllusiveBrian è perché stai ancora tenendo premuto il tasto Maiusc quando premi la barra spaziatrice.
Mathieu Guindon,

4
-1. Mentre la risposta è divertente, è anche inutile. La domanda non era "Perché le persone usano CONCATENATE invece di &?" ma "Perché si CONCATENA invece di &?". La risposta è "è completamente equivalente, la guida in linea di Excel afferma che invece dovrebbe essere usato". La spiegazione corretta (e utile), ad esempio di Aganju, è che è arrivata più tardi e CONCATENATO è stato lasciato per motivi di compatibilità, che è un motivo completamente valido. Tutto questo "le persone sono stupide e vogliono scrivere molto" è assolutamente impossibile; ci sono ragioni per cui lo fanno e non è la loro stupidità.
AnoE

23

Probabilmente è perché stanno usando il pulsante Inserisci funzione.

inserisci qui la descrizione dell'immagine

A volte lo faccio quando mangio con la mano sinistra e sto solo facendo alcune formule di basso livello, o quando sto usando un dispositivo touch e non potrei essere disturbato a passare da simboli, lettere e numeri sul touchscreen .


1
+1 Yup. Ho sempre usato il pulsante, era sufficiente, quindi non c'è incentivo per imparare gli operatori.
Kubanczyk,

3
Per concatenare le stringhe devo ricordare punto .per perl, pipe-pipe ||per SQL, nessun carattere per cmd e bash, +per Java. Ho davvero bisogno &solo di Excel?
Kubanczyk,

2
@kubanczyk se riesci a ricordare quelli ., ||e +poi puoi ricordare &. È più facile di concatenate, esp. se uno non parla abbastanza bene l'inglese. È anche usato in VBA
phuclv il

3
@ LưuVĩnhPhúc Re fluenza in inglese - per quanto ne so, quei nomi di funzioni sono localizzati (ad esempio, è VERKETTENin tedesco Excel)
Hagen von Eitzen,

2
@HagenvonEitzen un altro buon motivo per usare l'operatore sulla funzione!
Mathieu Guindon,

18

Ha solo ragioni storiche e di compatibilità. Le versioni precedenti di Excel non supportavano un formato e altri strumenti per fogli di calcolo (come Google Docs, Apple Numbers o Open Office) non supportavano l'altro.

Scegli quello che preferisci.

Si noti che a seconda del formato di salvataggio, Excel ha bisogno di più spazio per risparmiare CONCATENATE()di &.


Sì. Fino ad ora non sapevo che &fosse il sostituto CONCATENATE. Uso raramente Excel, ma quando lo faccio di solito è per qualcosa che necessita di concatenazione
gabe3886

16

A mio avviso, l'uso selettivo di concatenati e e commerciali, può portare a formule più chiare.

Questa concatenazione dei dettagli dell'indirizzo, usando una combinazione di CONCATENATEe &mi sembra più chiara:

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

Di un uso esclusivo di &:

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

E l'uso esclusivo diCONCATENATE

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

Inoltre, direi che un UDF come BuildAddresssarebbe una soluzione migliore (e sarebbe nella posizione migliore per gestire le sottigliezze della formattazione degli indirizzi nei domini di internazionalizzazione - anche se non l'ho implementato) ...

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

Ma forse un altro esempio, che include l'uso & all'interno della stringa letterale, dimostra meglio la difficoltà di leggere una formula che si costringe a usare esclusivamente operatori:

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

Potrebbe essere meglio scritto come:

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

Ma le prestazioni sono ciò che conta e, a seconda del numero di argomenti concatenati e della lunghezza di ciascun argomento, la CONCATENATEfunzione sembrerebbe sovraperformare l'operatore di concatenazione di un fattore compreso tra 4 e 6. Certamente, questo esempio è estremo, con 255 argomenti concatenati, 10.000 volte. Non è consigliabile utilizzare una lunghezza della stringa dell'argomento maggiore di 32, oppure potresti esaurire la memoria / crash di Excel.

Ecco un meccanismo di cronometraggio grezzo:

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 i risultati, in base alla lunghezza delle stringhe di argomento:

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

Ma poi, non abbiamo nemmeno discusso dell'elefante nella stanza. Stai creando un comando SQL usando la concatenazione. Non farlo. Stai eseguendo una procedura memorizzata che accetta parametri. A meno che tu non abbia sanificato i tuoi input (e suppongo di non averlo fatto), costruire una stringa SQL usando la concatenazione richiede un attacco SQL injection. Potresti anche esporre un UDF chiamato JohnnyDropTables...


Stai facendo una buona quantità di ipotesi su quest'ultima parte ....
Taylor Ackley il

4

È una differenza di dominio semantico. Concatenare è il nome di una funzione di foglio di calcolo. La e commerciale è un operatore di concatenazione preso in prestito da Visual Basic. Le persone che non aprono mai usano VBA troveranno una funzione molto più facile da usare rispetto alla sintassi VBA. È lo stesso motivo per cui è necessario salvare un tasto di scelta rapida, un'icona e un'opzione di menu, che semplifica l'utilizzo del software.


1

Uso entrambi.

Per elenchi lunghi che potrei aver bisogno di rivedere visivamente, una virgola occupa meno spazio per gli occhi di una e commerciale.

È più facile leggere un elenco di celle separate da virgole che separate da e commerciali, soprattutto perché una e commerciale (dopo una giornata di 15 ore) assomiglia troppo a $.

Ciò fornisce un ruolo significativo a CONCATENATE.

Ma - d'accordo - non ci sono vantaggi in termini di velocità o differenze funzionali.


0

Un caso d'uso particolare =CONCATENATE(A1:A10)è molto più breve di =A1&A2&A3&A4&A4&A6&A7&A8&A9&A10. È anche molto più evidentemente corretto (in effetti la &versione di esempio ha un errore deliberato).

L'ho provato prima, ma stavo usando l'ufficio Excel, che è in tedesco. TEXTKETTEsi comporta come descrivo, ma la documentazione mostra che è una funzione nuova e sostituisce VERKETTEN(che sarà l'equivalente tedesco di CONCATENATE).


3
@Vylix: No, intendo che il CONCATENATEmodulo è ovviamente più corretto. Se si desidera concatenare tutti gli elementi di un intervallo, fornire l'intervallo è molto meno soggetto a errori, piuttosto che assegnare ogni elemento uno per uno.
Martin Bonner,

6
L'esempio specifico del &modulo ha un errore deliberato.
Martin Bonner,

6
@MartinBonner =CONCATENATE(A1:A10) non funziona in Excel. Se hai una tale funzione, è un UDF personalizzato, non Excel nativo. Ma non può essere un UDF con lo stesso nome della funzione nativa.
Teylyn,

3
@MartinBonner Il tuo argomento potrebbe valere per una funzione come SUMe per operatori come +, ma non si applica alla CONCATENATEfunzione di Excel . non=CONCATENATE(A1:A2) è mai lo stesso risultato di=A1&A2
ThunderFrame del

=CONCATENATE(A1:A10)dà il risultato di A1, quindi ovviamente non è solo più breve ma diverso
phuclv

0

Non ho visto le vere risposte qui, ma ho qualche intuizione. (per chiunque possa in futuro cercare questa risposta)

"Concatenare" è una funzione legacy precedente, che fa le stesse cose di "&", "&" che è stata aggiunta in seguito per coerenza nei linguaggi di programmazione. Tuttavia, "Concatenate" è stato sostituito da "Concat" per supportare gli intervalli, quindi è possibile combinare A1: A10 senza la necessità di script personalizzati. "&" Non consente ancora un intervallo e accetta solo la prima cella nello stesso modo in cui "Concatena" funziona. Quindi, se si combina un intervallo, il "Concat" offre quel cambio di funzione extra rispetto ai 2 stili precedenti che sono appena codificati in modo diverso. Rendere "Concatenare" e "&" essenzialmente una preferenza quando si utilizzano stringhe combinate richieste non di intervallo su come si desidera scriverlo.

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


-6

RTFM Microsoft afferma di utilizzare il &.

A proposito, otterrai risposte diverse quando usi l'operatore SUM.

inserisci qui la descrizione dell'immagine


"CONCATENATE potrebbe non essere disponibile nelle versioni future di Excel." Haha, giusto. Supportano ancora =alternative: inserire funzioni come @CONCATENATE(A1,A2)e calcoli come +A5+A6o -A5+A6.
Džuris,

2
"Leggi il manuale di F'n" non è esattamente ciò che è bello .
Mathieu Guindon,

2
@ Mat'sMug La F può anche significare Fine :)
DavidPostill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.