web-dev-qa-db-ja.com

空白を除く、セルの内容のコンマ区切りリストを生成します

特定の4つのセルを連結するには、次のようにします。

=CONCATENATE(A2,",",C2",",D2,",",F2)

これはそうするでしょう...

  • A2 = "マシュー"
  • C2 = "マーク"
  • D2 = "ルーク"
  • F2 = "ジョン"

結果はMatthew,Mark,Luke,Johnになります。

しかし、私たちは次のような問題に遭遇します...

  • A2 = "イエス"
  • C2 = ""
  • D2 = "メアリー"
  • F2 = "ジョセフ"

結果はJesus,,Mary,Josephになります。

ここでは、余分なコンマは望ましくありません。一部のセルが空白のときに不要なコンマが追加されないようにしながら、すべての非空白セルがコンマ区切りのリストに含まれるようにこれを適切に処理する方法はありますか?

確かに、これはかなりの数のネストされたIFで実行できますが、可能であればそれを避けたいと思います。ネイティブのExcel関数、またはおそらく配列式で実行できますか?または、VB Script for this like this?

7
Iszi

Excel 2016では、TEXTJOINを使用できます。

=TEXTJOIN(delimiter,ignore_blanks?,values_to_be_joined)

したがって、あなたのケースでは、次の式を使用します:

=TEXTJOIN(",",TRUE,A2,C2,D2,F2)
11
sdf

あなたが言ったように、ネストされた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を削除して、式をアンパサンドで置き換えることができます。この時点で、それは単に表面的な問題です。

= A1IF(ISBLANK(A2); ""; "、"&A2)IF(ISBLANK(A3); ""; "、"&A3)IF(ISBLANK(A4); "" ; "、"&A4)

最初の値は常に書き込まれるため、必要なのはactiveセルが空白かどうかを確認し、空白でない場合はその後ろにコンマを追加することだけです。

このように、ヘルパーセルは必要ありません。すべて1つの関数内にあります。

また、一般的な用語を想定したため(つまり、最初のセルに入力しなかった状況が発生する可能性があるため)、より複雑なバージョンも作成しました。チェックが必要な条件は最大3つなので、2レベルのネストのみが必要です。

  • activeセルの前のセルは空ですか?
  • activeセルは空ですか?
  • 上記のどれも当てはまりませんか? (デフォルト状態)

最初から推論を始めたと仮定すると、必要なフォーマットは次のとおりです。

  • はいの場合、しないセルデータの前にコンマを配置します。いいえの場合、続行します。
  • はいの場合、しない何も配置しません(別の解決策はセルを配置することです)。
  • 該当しない場合は、セルデータの後ろにコンマを配置します。

そのため、ここに私が使用した式があります。すべてのデータは列にあると想定し、行で使用していくつかの数式と範囲を変更しました。

=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セルの後ろにあるすべてのセルが空白であることを意味するため、前にコンマを置くことはできません。

ROWSCOUNTBLANKの間隔はセルbehindactiveセルです。

5

中間値に「ヘルパー」セルを使用する場合は、次のようになります。

セル_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かどうかをテストする必要があります。

3
Scott

私はあなたが簡単な解決策を探していて、あなたのスキルを向上させるためではないと思います。

許可されている場合は、アドインを使用できます(つまり、アドインをインストールする権限があります)。 ASAP Utilities は、非営利目的での使用には無料である、私が強くお勧めするものです。

ここにあなたが彼らの機能の1つで何ができるかがあります

このユーティリティは、選択した列のデータをマージします。選択した行ごとに、隣接する列のデータが行の最初のセルに連結されます。

以下を指定できます。セル値の間に置く区切り文字空のセルをスキップセルの値、数式、またはフォーマットされた値を使用します。

Screenshot

2
Parivar Saraff

私はあなたのデータにヘッダーがあり、A2で始まると仮定します。

  1. 予備の列に移動します。この例ではBを使用します
  2. セルB2に単に= A2と入力します
  3. セルB3に= IF(A3 = ""、B2、CONCATENATE(B2、 "、"、A3)と入力します
  4. 列BをB3(B2ではない!)から列Aのデータを含む最後の行にコピーします。

ほら、カンマ区切りのリストは列Bの最後のセルにあります:)

私は解決策を探してここに来ましたが、何も見つからなかったため、上記を思いつきました。私のデータは1000行なので、手動で連結に追加することはできません。

1
Rich Harding

一般的なソリューションが必要な場合は、VBAを使用するのが最善の方法です。

サンプルデータが対処している問題全体に非常に近い場合は、次の操作を行うだけで、二重カンマを削除できます。

=SUBSTITUTE(CONCATENATE(A2,",",C2",",D2,",",F2),",,",",")

上記は、ギャップが1つの値幅しかない場合にのみ機能します。より大きなギャップを処理するには、ネストされたsubstitute()式が必要です。

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(A2,",",C2,",",D2,",",F2),",,,,,,,,,,,,,,,,",","),",,,,,,,,",","),",,,,",","),",,,",","),",,",",")

上記は、最大398の連続するコンマを1つに減らします。また、399を超える多くの値が削減されますが、399自体と他のいくつかの値は複数のコンマになります。

1
Dane

配列関数で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,"")

乾杯!

0
Phillip Winkler

私がこの解決策を見つけた場所を思い出せませんが、文字列のリストを取得するのに最適です。

セルA1からA3のデータの場合

=CONCATENATE(TRANSPOSE(A1:A3)

Enterキーを押してから数式バーに戻り、数式のA1:A3を強調表示して、F9キーを押します。これにより、範囲がセミコロンで区切られたリストになり、各アイテムが引用符で囲まれます。

=CONCATENATE(TRANSPOSE({"Matthew", "Mark", "John"}))

F9キーを押した後、リストを強調表示してコピーし、別のセルに貼り付けます。ここから、セミコロンの代わりにコンマを使用したり、二重の代わりに単一引用符を使用するように検索して置き換えることができます。

0
user2913433