Tại sao nên sử dụng CONCATENATE so với & trong Excel?


38

Tôi nhận thấy rằng "EXEC MySproc," & "arg, " & "arg2"về cơ bản là giống như =CONCATENATE("EXEC MySproc,", "arg,", "arg2") bao gồm khả năng sử dụng các đánh giá, chức năng etecetera. Usecase để sử dụng =CONCATENATE()vs là &gì?


2
Trong trường hợp một chuỗi dài các chuỗi nối, CONCATENATE () có tiềm năng là tuyến tính thay vì bậc hai theo chiều dài của chuỗi cuối cùng. xem joelonsoftware.com/2001/12/11/back-to-basics
Pieter Geerkens

1
Giai thoại, nhưng tôi thường sử dụng CONCATENATE khi nối trên ba chuỗi, vì lý do duy nhất là tôi quen phân tách các đối số bằng dấu phẩy hơn là với ampersands ... mặc dù tất nhiên đó không thực sự là một lý do hợp lệ.
Alexandre d'Entraigues

1
@PieterGeerkens: Tôi không biết quan điểm của bạn là gì. OK, một chuỗi dài các chuỗi nối được thực hiện độc lập có khả năng là tuyến tính hoặc bậc hai theo độ dài của chuỗi cuối cùng, tùy thuộc vào cách bạn lưu trữ các chuỗi trong bộ nhớ. Bạn có bất kỳ bằng chứng nào (hoặc bất kỳ lý do nào để tin) điều đó CONCATENATE()&được triển khai nội bộ khác nhau trong Excel không?
G-Man nói 'Phục hồi Monica'

Câu trả lời:


54

Nó dành cho những người thích gõ nhiều hơn. Có lẽ cùng một đối tượng làm những điều như =Sum((A1*A2)-A3)thay vì =(A1*A2)-A3. (Vâng, những người này tồn tại và tôi không biết tại sao họ làm vậy)

Nó cũng cung cấp các cơ hội tuyệt vời để tạo Hàm do người dùng xác định đầu tiên của bạn với VBA để tạo ra thứ gì đó hữu ích hơn so với Concatenate ().

Excel 2016 (có đăng ký Office 365) có một chức năng mới gọi là TextJoin () , lấy một dấu phân cách và một phạm vi làm đối số và nhanh hơn rất nhiều so với việc gõ các ký hiệu và dấu phân cách làm chuỗi văn bản. Bây giờ, THAT là hữu ích.

nhập mô tả hình ảnh ở đây


5
Ít nhất SUM có thể mất một phạm vi. Cảm ơn con trỏ trên TEXTJOIN. Công việc chưa được nâng cấp lên năm 2016, nhưng khi họ làm thì cuối cùng tôi cũng có thể rút UDF của mình.
Dranon

4
Ý bạn không phải =Sum(A1,A2)(thay thế cho =A1+B1)?
xehpuk

8
@xehpuk Không, tôi không có. Một số người bọc hàm Sum () xung quanh các phép tính đơn giản. Họ có thể sử dụng =A1+A2nhưng vì một số lý do, họ viết =Sum(A1+A1). Hoặc =Sum(A1-A2)nơi họ có thể chúng ta =A1-A2. Hoặc =Sum(A1*A2)nơi họ có thể sử dụng =A1*A2. Một số người đặt tất cả các loại công thức vào hàm Sum () và tôi đang cố gắng hiểu tại sao.
teylyn

2
@IllusiveBrian đó là vì bạn vẫn đang giữ phím Shift khi bạn nhấn phím cách đó.
Mathieu Guindon

4
-1. Trong khi câu trả lời là buồn cười, nó cũng là vô nghĩa. Câu hỏi không phải là "Tại sao mọi người sử dụng CONCATENATE thay vì &?" nhưng "Tại sao người ta phải CONCATENATE thay vì &?". Câu trả lời là "nó hoàn toàn tương đương, trợ giúp trực tuyến Excel nói rằng & nên được sử dụng thay thế". Giải thích chính xác (và hữu ích), ví dụ từ Aganju, là & đến sau và CONCATENATE đã bị bỏ lại vì lý do tương thích, đó là một lý do hoàn toàn hợp lệ. Tất cả điều này "mọi người là ngu ngốc và muốn gõ nhiều" là hoàn toàn chưa được thực hiện; có những lý do tại sao họ làm điều đó và đó không phải là sự ngu ngốc của họ.
AnoE

22

Có lẽ vì họ đang sử dụng nút Chèn Hàm.

nhập mô tả hình ảnh ở đây

Thỉnh thoảng tôi làm điều này khi tôi ăn bằng tay trái và chỉ đang thực hiện một số công thức cấp thấp hoặc khi tôi đang sử dụng thiết bị cảm ứng và không thể bận tâm chuyển đổi giữa các ký hiệu, chữ cái và số trên màn hình cảm ứng .


1
1 năm Tôi đã luôn sử dụng nút này, nó là đủ, vì vậy không có động lực để tìm hiểu các nhà khai thác.
kubanchot

3
Để nối chuỗi, tôi cần nhớ dấu chấm .cho perl, pipe-pipe ||cho SQL, không có char cho cmd và bash, +cho Java. Tôi có thực sự cần &chỉ cho Excel không?
kubanchot

2
@kubanchot nếu bạn có thể nhớ những cái đó ., ||+sau đó bạn có thể nhớ &. Nó dễ hơn concatenate, đặc biệt. nếu một người không thành thạo tiếng Anh. Nó cũng được sử dụng trong VBA
phuclv

3
@ LưuVTHERPhúc Re thông thạo tiếng Anh - theo như tôi biết, các tên hàm đó được bản địa hóa (ví dụ: VERKETTENtrong Excel tiếng Đức)
Hagen von Eitzen

2
@HagenvonEitzen một lý do tốt để sử dụng toán tử trên hàm!
Mathieu Guindon

17

Nó chỉ có lý do lịch sử và tương thích. Các phiên bản cũ của Excel không hỗ trợ một định dạng và các công cụ bảng tính khác (như Google Docs, Apple Numbers hoặc Open Office) không hỗ trợ định dạng khác.

Chọn bất cứ điều gì bạn thích.

Lưu ý rằng tùy thuộc vào định dạng lưu của bạn, Excel cần nhiều dung lượng hơn để lưu CONCATENATE()hơn &.


Vâng Tôi không biết rằng đó &là sự thay thế cho CONCATENATEđến bây giờ. Tôi hiếm khi sử dụng excel, nhưng khi tôi làm điều đó thường là cho thứ gì đó cần sự kết hợp
gabe3886

15

Theo tôi, việc sử dụng có chọn lọc concatenate ampersands, có thể dẫn đến các công thức rõ ràng hơn.

Nối này chi tiết địa chỉ, sử dụng một hỗn hợp của CONCATENATE&dường như rõ ràng hơn đối với tôi:

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

Hơn việc sử dụng độc quyền của &:

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

việc sử dụng độc quyềnCONCATENATE

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

Sau đó, một lần nữa, tôi lập luận rằng một UDF like BuildAddresssẽ là một giải pháp tốt hơn (và sẽ được đặt tốt hơn để xử lý sự tinh tế của định dạng địa chỉ trong các miền quốc tế hóa - mặc dù tôi đã không thực hiện điều đó) ...

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

Nhưng có lẽ một ví dụ khác, bao gồm việc sử dụng & trong chuỗi ký tự, thể hiện rõ hơn sự khó khăn khi đọc một công thức buộc chính nó phải sử dụng các toán tử độc quyền :

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

Có thể được viết tốt hơn là:

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

Nhưng hiệu suất mới là vấn đề quan trọng và tùy thuộc vào số lượng đối số được nối và độ dài của mỗi đối số, CONCATENATEhàm sẽ xuất hiện tốt hơn toán tử ghép theo hệ số từ 4 đến 6. Phải thừa nhận, ví dụ này là cực kỳ, với 255 đối số được nối, 10.000 lần. Tôi không khuyên bạn nên sử dụng độ dài chuỗi đối số lớn hơn 32 hoặc bạn có thể hết bộ nhớ / sập Excel.

Đây là một cơ chế thời gian thô:

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

Và kết quả, theo độ dài của chuỗi đối số:

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

Nhưng sau đó, chúng tôi thậm chí không thảo luận về con voi trong phòng. Bạn đang xây dựng một lệnh SQL bằng cách sử dụng phép nối. Đừng làm vậy. Bạn đang thực hiện một thủ tục được lưu trữ chấp nhận các tham số. Trừ khi bạn đã vệ sinh các đầu vào của mình (và tôi đoán là bạn chưa có), việc xây dựng một chuỗi SQL bằng cách sử dụng phép nối là yêu cầu một cuộc tấn công tiêm SQL. Bạn cũng có thể tiết lộ một UDF được gọi là JohnnyDropTables...


Bạn đang thực hiện một số giả định lành mạnh về phần cuối cùng đó ....
Taylor Ackley

4

Đó là một sự khác biệt về ngữ nghĩa. Concatenate là tên của một chức năng bảng tính. Ampersand là một toán tử ghép được mượn từ Visual Basic. Những người không bao giờ mở sử dụng VBA sẽ tìm thấy một chức năng dễ sử dụng hơn nhiều so với VBA Syntax. Đó là cùng một lý do tại sao có một phím nóng, một biểu tượng và một tùy chọn menu để lưu, điều này làm cho phần mềm dễ sử dụng hơn.


1

Tôi sử dụng cả hai.

Đối với các danh sách dài mà tôi có thể cần xem lại một cách trực quan, dấu phẩy chiếm ít không gian hơn so với dấu và.

Việc đọc danh sách các ô được phân tách bằng dấu phẩy dễ dàng hơn so với phân tách bằng ký hiệu, đặc biệt là khi ký hiệu và giao diện (sau 15 ngày) quá giống với $.

Điều này cung cấp một vai trò có ý nghĩa cho CONCATENATE.

Nhưng - đồng ý - không có lợi ích về tốc độ, hoặc bất kỳ sự khác biệt về chức năng.


0

Một trường hợp sử dụng cụ thể =CONCATENATE(A1:A10)là ngắn hơn rất nhiều =A1&A2&A3&A4&A4&A6&A7&A8&A9&A10. Nó cũng rõ ràng hơn nhiều (trong thực tế &phiên bản ví dụ có lỗi cố ý).

Tôi đã thử điều này trước tiên, nhưng tôi đang sử dụng Excel office, bằng tiếng Đức. TEXTKETTEhành xử như tôi mô tả, nhưng tài liệu cho thấy nó là một chức năng mới và thay thế VERKETTEN(sẽ tương đương với tiếng Đức CONCATENATE).


3
@Vylix: Không, ý tôi là CONCATENATEhình thức rõ ràng hơn. Nếu bạn muốn ghép tất cả các thành phần của một phạm vi, việc đưa ra phạm vi ít bị lỗi hơn nhiều so với việc cung cấp từng yếu tố một.
Martin Bonner hỗ trợ Monica

6
Ví dụ cụ thể của &biểu mẫu có lỗi cố ý.
Martin Bonner hỗ trợ Monica

6
@MartinBonner =CONCATENATE(A1:A10) không hoạt động trong Excel. Nếu bạn có chức năng như vậy, đó là UDF tùy chỉnh, không phải Excel gốc. Nhưng nó không thể là một UDF có cùng tên với hàm riêng.
teylyn

3
@MartinBonner Đối số của bạn có thể giữ cho một hàm như SUMvà các toán tử thích +, nhưng nó không áp dụng cho CONCATENATEhàm của Excel . =CONCATENATE(A1:A2)không bao giờ kết quả tương tự như=A1&A2
ThunderFrame

=CONCATENATE(A1:A10)đưa ra kết quả A1, vì vậy rõ ràng nó không chỉ ngắn hơn mà còn khác biệt
phuclv

0

Tôi không thấy câu trả lời thực sự ở đây, nhưng có một số hiểu biết. (cho bất cứ ai trong tương lai có thể tra cứu câu trả lời này)

"Concatenate" là một chức năng cũ hơn, hoạt động tương tự như "&", "&" đã được thêm vào sau này để thống nhất trong các ngôn ngữ lập trình. Tuy nhiên, "Concatenate" đã được thay thế bằng "Concat" để hỗ trợ các phạm vi, do đó bạn có thể kết hợp A1: A10 mà không cần bất kỳ tập lệnh tùy chỉnh nào. "&" Vẫn không cho phép phạm vi và chỉ lấy ô đầu tiên theo cùng chức năng "Ghép". Vì vậy, nếu kết hợp một phạm vi, "Concat" sẽ thay đổi chức năng bổ sung so với 2 kiểu trước đó được mã hóa khác nhau. Tạo "Ghép" và "&" về cơ bản là một ưu tiên khi sử dụng các chuỗi kết hợp không bắt buộc trong phạm vi về cách bạn muốn nhập nó.

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


-6

RTFM Microsoft cho biết sử dụng &.

BTW, bạn sẽ nhận được các câu trả lời khác nhau khi sử dụng toán tử SUM.

nhập mô tả hình ảnh ở đây


"CONCATENATE có thể không có sẵn trong các phiên bản Excel trong tương lai." Haha, phải rồi Họ vẫn hỗ trợ =các lựa chọn thay thế - nhập các hàm như @CONCATENATE(A1,A2)và tính toán như +A5+A6hoặc -A5+A6.
Džuris

2
"Đọc Hướng dẫn F'n" không chính xác là những gì tốt đẹp về.
Mathieu Guindon

2
@ Mat'sMug F cũng có thể đại diện cho Fine :)
DavidPostill
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.