ExcelでCONCATENATE vs&を使用する理由


38

これは、 評価、機能などを使用する機能を含むこと"EXEC MySproc," & "arg, " & "arg2"と本質的に同じであることに気付き=CONCATENATE("EXEC MySproc,", "arg,", "arg2")ました。=CONCATENATE()vs を使用するためのユースケースは何&ですか?


2
ストリング連結の長いシーケンスの場合、CONCATENATE()は、最終ストリングの長さが2次ではなく線形になる可能性があります。参照joelonsoftware.com/2001/12/11/back-to-basics
ピーターGeerkens

1
逸話ですが、アンパサンドよりもコンマで引数を分離することに慣れているという唯一の理由のために、3つの文字列を結合するときにCONCATENATEをよく使用します...もちろんそれは実際に有効な理由ではありません。
アレクサンドル・デントライグ

1
@PieterGeerkens:あなたのポイントが何なのか分かりません。OK、独立して実行される文字列連結の長いシーケンスは、文字列をメモリに格納する方法に応じて、最終的な文字列の長さが線形または二次になる可能性があります。あなたは、任意の証拠(または持っていますかいずれかのことを信じるに足る理由)CONCATENATE()&されている内部的に実装 Excelで違いましたか?
G-Manは「Reinstate Monica」と言う

回答:


54

もっとタイプしたい人向けです。おそらくのようなものを行うのと同じ聴衆=Sum((A1*A2)-A3)の代わりに=(A1*A2)-A3。(はい、これらの人々は存在します、そして、彼らがなぜそうするのか分かりません)

また、VBAを使用して最初のユーザー定義関数を作成し、Concatenate()よりも有用なものを作成する素晴らしい機会を提供します。

Excel 2016(Office 365サブスクリプション)にはTextJoin()と呼ばれる新しい関数があります。これは、区切り文字と範囲を引数として受け取り、テキスト文字列としてアンパサンドと区切り文字を入力するよりもはるかに高速です。今、それは便利です。

ここに画像の説明を入力してください


5
少なくともSUMは範囲を取ることができます。TEXTJOINのポインターをありがとう。作業はまだ2016にアップグレードされていませんが、作業が完了すると、ついにUDFを廃止できます。
ドラノン

4
あなたが意味するものではありませんでした=Sum(A1,A2)(の代替として=A1+B1)?
xehpuk

8
@xehpukいいえ、しませんでした。一部の人々は、単純な計算の周りにSum()関数をラップしています。彼らは使用できます=A1+A2が、何らかの理由で、彼らは書いてい=Sum(A1+A1)ます。または=Sum(A1-A2)、彼らが私たちにできる場所=A1-A2。または=Sum(A1*A2)彼らが使用できる場所 =A1*A2。一部の人々はあらゆる種類の式をSum()関数に入れていますが、その理由を理解しようとしています。
テイリン

2
@IllusiveBrianは、スペースキーを押したときにまだShiftキーを押しているためです。
マチューギンドン

4
-1。答えは面白いですが、それも無意味です。質問は「なぜ人々は&ではなくCONCATENATEを使用しているのですか?」ではありませんでした。しかし、「なぜ&の代わりにCONCATENATEを行うべきなのか?」答えは「完全に同等です。Excelオンラインヘルプでは、代わりに&を使用する必要がある」と記載されています。例えば、アガンジュからの正しい(そして有用な)説明は、&が後で来て、互換性の理由でCONCATENATEが残っているということです。これは完全に正当な理由です。この「人々は愚かで、たくさんタイプしたい」ということは、まったく必要ありません。そこにある、彼らはそれを行う理由は、それが彼らの愚かではありません。
AnoE

22

おそらく、彼らがInsert Functionボタンを使用しているからでしょう。

ここに画像の説明を入力してください

私は時々、左手で食べて低レベルの数式を実行しているとき、またはタッチデバイスを使用していて、タッチスクリーンで記号、文字、数字を切り替えるのが面倒だったときにこれを行います。


1
+1うん。私はいつもボタンを使用しました、それは十分だったので、オペレーターを学ぶインセンティブはありません。
クバンチク

3
文字列を連結するには.、perlのドット||、SQLのパイプパイプ+、Javaのcmdとbashのchar を覚えていない必要があります。&Excelだけに本当に必要ですか?
クバンチク

2
あなたがそれらを覚えていることができれば@kubanczyk .||+あなたは覚えています&。それはconcatenate、特に簡単です。英語が流でない場合。また、VBAで使用されます
phuclv

3
@LưuVĩnhPhúc英語の流さ-私の知る限り、これらの関数名はローカライズされています(たとえば、VERKETTENドイツ語のExcelにあります)
ハーゲンフォン

2
@HagenvonEitzenは、関数に対して演算子を使用するもう1つの正当な理由です!
マチューギンドン

17

歴史的および互換性の理由のみがあります。以前のバージョンのExcelは1つの形式をサポートしておらず、他のスプレッドシートツール(Google Docs、Apple Numbers、Open Officeなど)はもう1つの形式をサポートしていませんでした。

好きな方を選択してください。

あなたの保存形式に応じて、Excelが保存するために多くのスペースを必要とすることに注意してくださいCONCATENATE()より&


うん。今までそれ&が代替品だとは知りませんでしたCONCATENATE。私はめったにExcelを使用していないが、私はそれが連結を必要とする何かのために通常だんとき
gabe3886

15

私の意見では、連結およびアンパサンドを選択的に使用する、より明確な式が得られます。

住所の詳細のこの連結は、私との混合物を使用してより明確に思えます:CONCATENATE&

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

排他的使用より&

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

そしての排他的使用CONCATENATE

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

繰り返しますが、UDFのようなものBuildAddressがより良い解決策であると主張します(そして、国際化ドメインの微妙なアドレスフォーマットを処理するためにより良い場所になるでしょう-私はそれを実装していませんが)...

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

しかし、おそらく文字列リテラル& の使用を含む別の例は、演算子を排他的に使用することを強制する式を読み取ることの困難さをよりよく示しています。

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

次のように書いた方がいいかもしれません:

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

しかし、パフォーマンスが重要であり、連結される引数の数と各引数の長さに応じて、CONCATENATE関数は4〜6の係数で連結演算子を上回るように見えます。確かに、この例は極端です。連結された255個の引数、10,000回。32を超える引数文字列の長さを使用することはお勧めしません。そうしないと、メモリ不足やExcelのクラッシュが発生する可能性があります。

大まかなタイミングメカニズムは次のとおりです。

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

そして、引数文字列の長さに応じた結果:

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

しかし、その後、私たちは部屋の象についても議論していません。連結を使用してSQLコマンドを構築しています。それをしないでください。パラメーターを受け入れるストアドプロシージャを実行しています。入力をサニタイズしていない限り(そうでないと思います)、連結を使用してSQL文字列を作成することは、SQLインジェクション攻撃を要求しています。同様にUDFを公開することもできJohnnyDropTablesます...


あなたは....その最後の部分に仮定の健全な量を作っている
テイラーアクレイ

4

これはセマンティックドメインの違いです。連結は、スプレッドシート関数の名前です。アンパサンドは、Visual Basicから借用した連結演算子です。VBAを開かない人は、VBA構文よりも使いやすい関数を見つけるでしょう。これは、保存するホットキー、アイコン、メニューオプションがある理由と同じです。これにより、ソフトウェアが使いやすくなります。


1

私は両方を使用します。

視覚的に確認する必要のある長いリストの場合、コンマはアンパサンドよりも目のスペースを取りません。

アンパサンドは(15時間後に)$のように見えるので、アンパサンドで区切るよりもコンマで区切ったセルのリストを読む方が簡単です。

これは、CONCATENATEに意味のある役割を提供します。

しかし、同意してください-速度の利点や機能の違いはありません。


0

1つの特定のユースケースは、それ=CONCATENATE(A1:A10)よりもはるかに短いこと=A1&A2&A3&A4&A4&A6&A7&A8&A9&A10です。また、はるかに明確です(実際、サンプル&バージョンには意図的な誤りがあります)。

最初にこれを試してみましたが、私はドイツ語のOffice Excelを使用していました。 TEXTKETTE私が説明したように動作しますが、ドキュメントはそれが新しい機能であることを示し、置き換えますVERKETTEN(これはドイツ語でに相当しますCONCATENATE)。


3
@Vylix:いいえ、私はCONCATENATEフォームがより明確であることを意味します。範囲のすべての要素を連結する場合、各要素を1つずつ指定するよりも、範囲を指定する方がエラーが発生しにくくなります。
マーティンボナーはモニカをサポートします

6
&フォームの特定の例には、意図的な誤りがあります。
マーティンボナーはモニカをサポートします

6
@MartinBonner =CONCATENATE(A1:A10) はExcelでは機能しません。このような関数がある場合、それはネイティブExcelではなく、カスタムUDFです。ただし、ネイティブ関数と同じ名前のUDFにすることはできません。
テイリン

3
@MartinBonner引数は、などの関数SUMやのような演算子を保持する+場合がありますが、ExcelのCONCATENATE関数には適用されません。=CONCATENATE(A1:A2)と同じ結果になることはありません=A1&A2
ThunderFrame

=CONCATENATE(A1:A10)結果を与えるA1ので、それは明らかだ、だけでなく、短いが異なる
phuclv

0

私はここで本当の答えを見ませんでしたが、洞察力があります。(将来この回答を調べる可能性のある人向け)

「連結」は古いレガシー機能で、「&」と同じことを行います。「&」は、プログラミング言語の一貫性のために後で追加されました。ただし、範囲をサポートするために「連結」が「連結」に置き換えられているため、カスタムスクリプトを作成しなくてもA1:A10を組み合わせることができます。「&」はまだ範囲を許可せず、「連結」機能と同じ方法で最初のセルのみを取ります。そのため、範囲を結合する場合、「連結」は、異なる方法でコーディングされた直前の2つのスタイルに加えて、追加の機能変更を提供します。「連結」と「&」は、入力方法に範囲外の必須の結合文字列を使用する場合、基本的に優先設定にします。

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


-6

RTFM Microsoftは、&

ところで、SUM演算子を使用すると、さまざまな答えが得られます。

ここに画像の説明を入力してください


「CONCATENATEは、Excelの将来のバージョンでは使用できなくなる可能性があります。」ハハ、そう。彼らはまだ=代替をサポートしています-などの関数を入力したり、またはのような@CONCATENATE(A1,A2)計算。+A5+A6-A5+A6
ジュリス

2
「F'nマニュアルを読む」は、ちょうど良いことはありません。
マチューギンドン

2
@ Mat'sMug FはFineを表すこともできます:)
DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.