CONCATENATE vs & Excel'de neden kullanılır?


39

Bunun "EXEC MySproc," & "arg, " & "arg2", =CONCATENATE("EXEC MySproc,", "arg,", "arg2") değerlendirme kullanma, işlevler etecetera'nın dahil edilmesi ile aynı olduğunu fark ettim . =CONCATENATE()Vs kullanmak için usecase nedir &?


2
Uzun bir dizi dizisi birleştirme durumunda, CONCATENATE (), son dizenin uzunluğunda kuadratik yerine doğrusal olma potansiyeline sahiptir. bkz joelonsoftware.com/2001/12/11/back-to-basics
Pieter Geerkens

1
Anekdot, ancak genellikle üç farklı dizgeye katılırken CONCATENATE'i kullanıyorum, çünkü sadece bağımsız değişkenleri virgüllerle ayırmaya daha çok alışkın olduğum için ... ve elbette geçerli bir neden olmasa da.
Alexandre d'Entraigues

1
@ PieterGeerkens: Amacınızın ne olduğu hakkında hiçbir fikrim yok. Tamam, bağımsız bir şekilde gerçekleştirilen dizi birleştirme dizilerinin uzun bir dizisi , dizeleri bellekte nasıl sakladığınıza bağlı olarak, son dizenin uzunluğu boyunca doğrusal veya ikinci dereceden olma potansiyeline sahiptir. Eğer herhangi bir kanıt (veya var mı herhangi inanmak için nedenlerimiz) o CONCATENATE()ve &edilir içten uygulanan Excel'de farklı?
G-Man

Yanıtlar:


54

Daha fazla yazmayı seven insanlar için. Muhtemelen, =Sum((A1*A2)-A3)onun yerine şeyleri yapan izleyicilerin aynısı =(A1*A2)-A3. (Evet, bu insanlar var ve neden böyle yaptıklarını bilmiyorum)

Ayrıca, Concatenate () işlevinden daha kullanışlı bir şey oluşturmak için VBA ile ilk Kullanıcı Tanımlı İşlevinizi oluşturmak için harika fırsatlar sunar.

Excel 2016 (bir Office 365 aboneliğiyle), sınırlayıcıyı ve argüman olarak bir aralık alan ve işareti ve sınırlayıcıları metin dizeleri olarak yazmaktan çok daha hızlı olan TextJoin () adlı yeni bir işleve sahiptir . Şimdi, BU yararlıdır.

görüntü tanımını buraya girin


5
En azından SUM aralık alabilir. TEXTJOIN’deki işaretçi için teşekkürler. İş henüz 2016 yılına yükselmedi, ancak yaptıklarında sonunda UDF'mi emekli edebileceğim.
Dranon

4
Bunu kastetmedin mi =Sum(A1,A2)(alternatif olarak =A1+B1)?
xehpuk

8
@ xehpuk Hayır yapmadım. Bazı insanlar basit hesaplamalar etrafına bir Sum () işlevi ekler. Kullanabilirlerdi, =A1+A2ama bir sebepten, yazarlar =Sum(A1+A1). Ya =Sum(A1-A2)da bizi yapabildikleri yer =A1-A2. Veya =Sum(A1*A2)kullanabilecekleri yer =A1*A2. Bazı insanlar her türlü formülü Sum () fonksiyonuna koyar ve nedenini anlamaya çalışıyorum.
teylyn

2
@IllusiveBrian, çünkü bu boşluk çubuğuna bastığınızda Shift tuşunu hala basılı tutuyorsunuz.
Mathieu Guindon

4
-1. Cevap komik olsa da, anlamsız. Soru, "İnsanlar neden & yerine CONCATENATE kullanıyor?" Sorusu değildi. fakat "Neden biri & yerine CONCATENATE yapmalı?". Yanıt, "tamamen eşdeğerdir, Excel çevrimiçi yardımı, bunun yerine & kullanılması gerektiğini" belirtir. Doğru (ve faydalı) açıklama, örneğin Aganju'dan, daha sonra geldi ve daha sonra geldi ve CONCATENATE uyumluluk nedeniyle tamamen geçerli bir neden olarak bırakıldı. Tüm bu "insanlar aptaldır ve çok yazmak ister" tamamen habersizdir; Orada olan onlar bunu nedenleri ve onların aptallık değil.
AnoE

23

Muhtemelen Ekle İşlevi düğmesini kullandıkları için.

görüntü tanımını buraya girin

Bunu bazen sol elimle yediğimde ve bazı düşük seviyeli formüller yaptığımda veya bir dokunmatik cihaz kullanırken ve dokunmatik ekrandaki semboller, harfler ve sayılar arasında geçiş yapmaktan rahatsızlık duyduğumda yapıyorum. .


1
+1 Yup. Düğmeyi her zaman kullandım, yeterliydi, bu yüzden operatörleri öğrenmeye teşvik yok.
kubanczyk

3
Dizeleri birleştirmek için Java .için perl için nokta , ||SQL için boru , cmd ve bash için hiçbir karakter hatırlamam gerekiyor +. Gerçekten &sadece Excel'e ihtiyacım var mı?
kubanczyk

2
@kubanczyk onları hatırlıyorsun eğer ., ||ve +o zaman hatırlıyorum &. Daha kolay concatenate, esp. biri İngilizceyi akıcı bir şekilde bilmiyorsa. Ayrıca VBA'da da kullanılır
phuclv,

3
@ LưuVĩnhPhúc İngilizcede akıcılık - bildiğim kadarıyla, bu işlev adları yerelleştirilir (örneğin, VERKETTENAlmanca Excel'dedir)
Hagen von Eitzen

2
@HagenvonEitzen işleci işlev üzerinde kullanmak için başka iyi bir neden!
Mathieu Guindon

18

Sadece tarihsel ve uyumluluk sebepleri var. Eski Excel sürümleri bir biçimi desteklemiyordu ve diğer elektronik tablo araçları (Google Dokümanlar, Apple Numaraları veya Open Office gibi) diğerini desteklemiyordu.

Hangisini tercih ederseniz seçin.

Kaydetme biçiminize bağlı olarak, Excel'in kaydetmek için CONCATENATE()daha fazla alana ihtiyacı olduğunu unutmayın &.


Evet. Bunun şu &ana CONCATENATEkadar yedek olduğunu bilmiyordum . Nadiren excel kullanıyorum, fakat bunu yaptığımda genellikle birleştirme ihtiyacı olan bir şey için
gabe3886

16

Benim düşünceme göre, birleşik ve işaretli işaretlerin seçici kullanımı, daha açık formüllere yol açabilir.

Bir kullanarak adres detayların Bu birleştirme, karışım içinde CONCATENATEve &bana daha net görünüyor:

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

Daha münhasır kullanımı &:

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

Ve özel kullanımıCONCATENATE

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

Sonra yine, bir UDF'nin BuildAddressdaha iyi bir çözüm olacağını (ve uluslararasılaşma alanlarında adres formatlama inceliklerini idare etmek için daha iyi bir yer alacağını) iddia edecektim ...

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

Fakat belki de değişmez dizgenin & içinde kullanımını içeren başka bir örnek, kendisini yalnızca işleçleri kullanmaya zorlayan bir formülü okuma zorluğunu daha iyi göstermektedir :

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

Aşağıdaki gibi daha iyi yazılmış olabilir:

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

Ancak, performans önemli olan ve birleştirilmiş argümanların sayısına ve her bir argümanın uzunluğuna bağlı olarak, CONCATENATEişlev birleştirme operatörünün 4 ila 6 arasında bir faktörden daha iyi performans gösterdiği anlaşılıyor. 255 argüman birleştirildi, 10.000 kez. 32'den büyük bir bağımsız değişken dizesi uzunluğu kullanmanızı önermiyorum, aksi takdirde bellek / kilitlenme Excel'iniz tükenebilir.

İşte ham bir zamanlama mekanizması:

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

Ve argüman dizelerinin uzunluğuna göre sonuçlar:

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

Ama o zaman, odadaki filden bile bahsetmedik. Birleştirme kullanarak bir SQL komutu oluşturuyorsunuz. Yapma bunu. Parametreleri kabul eden saklı bir prosedür uyguluyorsunuz. Girdilerinizi sterilize etmediğiniz sürece (ve sanırım yapmadınız sanırım), birleştirme kullanarak bir SQL dizesi oluşturmak bir SQL-enjeksiyon saldırısı istiyor. Adında bir UDF'yi gösterebilirsin JohnnyDropTables...


Bu son bölümde sağlıklı miktarda varsayımlarda bulunuyorsunuz ....
Taylor Ackley

4

Bu bir anlamsal alan farkıdır. Birleştir, bir elektronik tablo işlevinin adıdır. Ampersand, Visual Basic'ten ödünç alınan bir birleştirme işlecidir . Asla açmamış olan kişiler VBA kullanmaktadırlar, VBA Sözdizimi'nden çok daha kolay bir işlev kullanırlar. Yazılımın kullanımını kolaylaştıran bir kısayol tuşu, bir simge ve bir menü seçeneğinin bulunmasının nedeni budur.


1

İkisini de kullanırım.

Görsel olarak gözden geçirmem gerekebilecek uzun listelerde virgül, bir işaretten daha az yer kaplar.

Özellikle bir ve işareti (15 saatlik bir günün sonunda) bir $ 'a çok yaklaştığından, virgülle ayrılmış hücrelerin listesini ve işaretlerini ayırmaktan daha kolaydır.

Bu CONCATENATE için anlamlı bir rol sağlar.

Ancak - katılıyorum - hız kazancı veya herhangi bir işlevsel fark yok.


0

Özel kullanım durumlarından biri, =CONCATENATE(A1:A10)bundan çok daha kısa olmasıdır =A1&A2&A3&A4&A4&A6&A7&A8&A9&A10. Aynı zamanda çok daha açık bir şekilde doğrudur (aslında örnek &versiyonun kasıtlı bir yanılgısı vardır).

Önce bunu denedim, ama Almanca olan Excel ofisini kullanıyordum. TEXTKETTEtanımladığım gibi davranır, ancak belgelendirme bunun yeni bir işlev olduğunu gösterir ve bunun yerine VERKETTEN(bunun Almanca karşılığı olacak CONCATENATE) değiştirilir.


3
@Vylix: Hayır, CONCATENATEformun daha açıkçası doğru olduğunu söylüyorum . Bir aralığın tüm öğelerini birleştirmek istiyorsanız, aralığı vermek her öğeye birer birer vermekten çok daha az hata eğilimlidir.
Martin Bonner

6
&Formun belirli bir örneği kasıtlı bir hata var.
Martin Bonner,

6
@ MartinBonner Excel'de =CONCATENATE(A1:A10) çalışmıyor. Böyle bir işleve sahipseniz, yerel bir Excel değil, özel bir UDF. Ancak yerel işlevle aynı ada sahip bir UDF olamaz.
teylyn

3
@MartinBonner Argümanınız gibi bir işlev SUMve benzeri operatörler için geçerli olabilir +, ancak Excel'in CONCATENATEişlevi için geçerli değildir . =CONCATENATE(A1:A2)olduğu asla aynı sonucu=A1&A2
ThunderFrame

=CONCATENATE(A1:A10)sonucunu verir A1, bu yüzden belli ki sadece kısa değil, farklı
phuclv

0

Burada doğru cevapları görmedim ama bazı içgörüleri var. (Gelecekte bu cevaba bakabilecek herkes için)

"Birleştir", programlama dillerinde tutarlılık için daha sonra eklenen "&", "&" ile aynı şeyleri yapan eski bir işlevdir. Ancak, aralıkları desteklemek için "Concatenate" yerine "Concat" eklenmiştir, böylece A1: A10'u herhangi bir özel komut dosyasına gerek kalmadan birleştirebilirsiniz. "&" Hala bir aralığa izin vermiyor ve yalnızca ilk hücreyi "Birleştir" işlevleriyle aynı şekilde alıyor. Bu nedenle, bir aralığı birleştirmek, "Concat", sadece farklı kodlanmış önceki 2 stilleri üzerinde ekstra fonksiyon değişikliği verir. Nasıl yazmak istediğinize ilişkin aralık dışı gerekli birleştirilmiş dizeleri kullanırken esas olarak "Birleştir" ve "&" yapmak.

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


-6

RTFM Microsoft kullanımı diyor &.

BTW, SUM operatörünü kullanırken farklı cevaplar alırsınız.

görüntü tanımını buraya girin


"CONCATENATE Excel'in gelecekteki sürümlerinde bulunmayabilir." Haha, doğru. Hala =alternatifleri destekliyorlar - gibi fonksiyonlara @CONCATENATE(A1,A2)ve +A5+A6ya da gibi hesaplamalar girerek -A5+A6.
Džuris

2
"F'n El Kitabını Oku" tam olarak neyin güzel olduğu ile ilgili değil.
Mathieu Guindon

2
@ Mat'sMug F ayrıca Fine için durabilir :)
DavidPostill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.