特定の4つのセルを連結するには、次のようにします。
=CONCATENATE(A2,",",C2",",D2,",",F2)
これはそうするでしょう...
結果はMatthew,Mark,Luke,John
になります。
しかし、私たちは次のような問題に遭遇します...
結果はJesus,,Mary,Joseph
になります。
ここでは、余分なコンマは望ましくありません。一部のセルが空白のときに不要なコンマが追加されないようにしながら、すべての非空白セルがコンマ区切りのリストに含まれるようにこれを適切に処理する方法はありますか?
確かに、これはかなりの数のネストされたIFで実行できますが、可能であればそれを避けたいと思います。ネイティブのExcel関数、またはおそらく配列式で実行できますか?または、VB Script for this like this?
Excel 2016では、TEXTJOIN
を使用できます。
=TEXTJOIN(delimiter,ignore_blanks?,values_to_be_joined)
したがって、あなたのケースでは、次の式を使用します:
=TEXTJOIN(",",TRUE,A2,C2,D2,F2)
あなたが言ったように、ネストされたIFはあなたのお茶ではありませんが、@ nixdaが指すVBAソリューションなしでは、これを行う他の方法はありません。
私が提示するソリューションについては、あなたのデータは次のようであると思います:
| A |
-+---------+
1| Matthew |
2| Mark |
3| Luke |
4| John |
私はあなたが望むことをしたが- "埋もれている" となった解決策を持っていました。最近の回答であなたが残したコメント(特にあなたがalwaysが最初に持っているという事実についてのコメントを読んだ後、私はそれを理解しましたセルが入力されています)。これにより、最初の条件(以下の理由)が常にfalseになるため、ネストが存在しないようにすることができます。
=CONCATENATE(A1;IF(ISBLANK(A2);"";"," & A2);IF(ISBLANK(A3);"";"," & A3);IF(ISBLANK(A4);"";"," & A4))
@Scottの回答で指摘されているように、いつでもCONCATENATE
を削除して、式をアンパサンドで置き換えることができます。この時点で、それは単に表面的な問題です。
= A1&IF(ISBLANK(A2); ""; "、"&A2)&IF(ISBLANK(A3); ""; "、"&A3)&IF(ISBLANK(A4); "" ; "、"&A4)
最初の値は常に書き込まれるため、必要なのはactiveセルが空白かどうかを確認し、空白でない場合はその後ろにコンマを追加することだけです。
このように、ヘルパーセルは必要ありません。すべて1つの関数内にあります。
また、一般的な用語を想定したため(つまり、最初のセルに入力しなかった状況が発生する可能性があるため)、より複雑なバージョンも作成しました。チェックが必要な条件は最大3つなので、2レベルのネストのみが必要です。
最初から推論を始めたと仮定すると、必要なフォーマットは次のとおりです。
そのため、ここに私が使用した式があります。すべてのデータは列にあると想定し、行で使用していくつかの数式と範囲を変更しました。
=CONCATENATE(A1;IF(ROWS(A1:A1)=COUNTBLANK(A1:A1);A2; IF(ISBLANK(A2);"";"," & A2));IF(ROWS(A1:A2)=COUNTBLANK(A1:A2);A3; IF(ISBLANK(A3);"";"," & A3));IF(ROWS(A1:A3)=COUNTBLANK(A1:A3);A4; IF(ISBLANK(A4);"";"," & A4)))
ROWS
は、任意の間隔での行数をカウントします。 activeセルの後ろにある空白のセルの数と等しい場合は、activeセルの後ろにあるすべてのセルが空白であることを意味するため、前にコンマを置くことはできません。
ROWS
とCOUNTBLANK
の間隔はセルbehindactiveセルです。
中間値に「ヘルパー」セルを使用する場合は、次のようになります。
セル_AA2
_(または_Sheet2!A2
_、または配置したい場所)を
_=IF(A2="", "", A2&",")
_
(ここで、_x & y
_はCONCATENATE(x, y)
と言う短い方法です)、セルを_AC2
_、_AD2
_、_AF2
_と同様に設定します。 _AZ2
_を
_=AA2 & AC2 & AD2 & AF2
_
次に、あなたの最終結果は
_=IF(AZ2="", "", LEFT(AZ2, LEN(AZ2)-1))
_
AA
-AF
セルは、空白以外の値にコンマを追加します。だから、あなたの例を使用して、
_Matthew Mark Luke John
_
結果として
_Matthew, Mark, Luke, John,
_
ながら
_Jesus Mary Joseph
_
結果として
_Jesus, Mary, Joseph,
_
(列C
にコンマがないことに注意してください)。
_AZ2
_は、上記の単純な連結です:_Jesus,Mary,Joseph,
_。したがって、Jesus
の後の余分なカンマを削除しましたが、最後に1つ追加しました。 LEFT(AZ2, LEN(AZ2)-1)
は、最後の文字を除くすべての_AZ2
_です。また、4つの入力セルがすべて空の場合にエラーが発生しないように、_AZ2
_がnullかどうかをテストする必要があります。
私はあなたが簡単な解決策を探していて、あなたのスキルを向上させるためではないと思います。
許可されている場合は、アドインを使用できます(つまり、アドインをインストールする権限があります)。 ASAP Utilities は、非営利目的での使用には無料である、私が強くお勧めするものです。
ここにあなたが彼らの機能の1つで何ができるかがあります
このユーティリティは、選択した列のデータをマージします。選択した行ごとに、隣接する列のデータが行の最初のセルに連結されます。
以下を指定できます。セル値の間に置く区切り文字空のセルをスキップセルの値、数式、またはフォーマットされた値を使用します。
私はあなたのデータにヘッダーがあり、A2で始まると仮定します。
ほら、カンマ区切りのリストは列Bの最後のセルにあります:)
私は解決策を探してここに来ましたが、何も見つからなかったため、上記を思いつきました。私のデータは1000行なので、手動で連結に追加することはできません。
一般的なソリューションが必要な場合は、VBAを使用するのが最善の方法です。
サンプルデータが対処している問題全体に非常に近い場合は、次の操作を行うだけで、二重カンマを削除できます。
=SUBSTITUTE(CONCATENATE(A2,",",C2",",D2,",",F2),",,",",")
上記は、ギャップが1つの値幅しかない場合にのみ機能します。より大きなギャップを処理するには、ネストされたsubstitute()式が必要です。
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(A2,",",C2,",",D2,",",F2),",,,,,,,,,,,,,,,,",","),",,,,,,,,",","),",,,,",","),",,,",","),",,",",")
上記は、最大398の連続するコンマを1つに減らします。また、399を超える多くの値が削減されますが、399自体と他のいくつかの値は複数のコンマになります。
配列関数でConcatenate()とif()を組み合わせるだけです:
=arrayformula(concatenate(if(not(isempty(a2:f2)),a2:f2&", ","")))
この関数はリストの最後にコンマを残すので、それを回避する必要があり、リストの終わりがどこにあるか(例では列f)が正確にわかっている場合は、それを個別に処理します。
=arrayformula(concatenate(if(not(isempty(a2:d2)),a2:d2&", ","")))&if(not(isempty(f2)),f2,"")
乾杯!
私がこの解決策を見つけた場所を思い出せませんが、文字列のリストを取得するのに最適です。
セルA1からA3のデータの場合
=CONCATENATE(TRANSPOSE(A1:A3)
Enterキーを押してから数式バーに戻り、数式のA1:A3を強調表示して、F9キーを押します。これにより、範囲がセミコロンで区切られたリストになり、各アイテムが引用符で囲まれます。
=CONCATENATE(TRANSPOSE({"Matthew", "Mark", "John"}))
F9キーを押した後、リストを強調表示してコピーし、別のセルに貼り付けます。ここから、セミコロンの代わりにコンマを使用したり、二重の代わりに単一引用符を使用するように検索して置き換えることができます。