別の列で前の空でないセルを見つける配列式


7

Google Spreadsheetsでは、Apps Scriptなどを使用せずに、列Bの上部にあるarrayformula(または多分mmultまたは何か奇妙だが、フィルダウンがない)などの単一の数式で次のことを達成できますか?:

シナリオ:

列A:セルが空または空ではない

ゴール:

列B:列Aの空でない最後のセルが含まれます

例:

input | output
===============
    a | a
------+--------
      | a
------+--------
      | a
------+--------
    5 | 5
------+--------
      | 5
------+--------
    c | c
------+--------
    c | c
------+--------
      | c
------+--------
    a | a
------+--------

回答:


9

簡潔な答え

=ArrayFormula(vlookup(ROW(1:10),{IF(LEN(A1:A10)>0,ROW(1:10),""),A1:A10},2))

説明

Column A以下の表の入力データと、上の式がセルにあると仮定しますB1

注:式を評価しやすくするために、Column A(入力)は値を繰り返しませんが、あらゆる種類の値(文字、数字、記号、繰り返し、並べ替えなしなど)で機能します。

      |    A       B   
  === + ======= =======
   1  |    a       a   
   2  |            a   
   3  |    b       b   
   4  |            b   
   5  |            b   
   6  |    c       c   
   7  |    d       d   
   8  |    e       e   
   9  |            e   
  10  |    f       f   

VLOOKUP これは、近似値を見つけるために使用でき、複数の値(配列)を返す可能性があるために選択されました。

入力値は任意の順序で現れる可能性があるため、実際の値を使用する代わりに、行番号が空でないセルに使用され、空のセルに空の文字列が割り当てられました""

空の文字列を返す数式を含むセルが返され、一部の一般的なシナリオで問題が発生する可能性があるため、LEN代わりに使用されました。ISBLANKFALSE

IF(LEN(A1:A10)>0,ROW(1:10),"")

注:3つの文字を保存する場合は、2番目のパラメーター(""文字はパラメーターの区切り文字,)を削除できます。数式のこの部分を分析すると、空のセルが返されFALSEます。

VLOOKUPカラムアップルックアップの代わりに範囲の最初の列であることが必要で、「半手動」からなるアレイを使用しました。

{IF(LEN(A1:A10)>0,ROW(1:10),""),A1:A10}

上記のアプローチにより、細胞と処理時間を節約できます。


1
""ifコマンドを省略することにより、少し短くすることができます(省略された引数はデフォルトでは空白です)。

ああ、賢いですね。行を値にマッピングする一時的なルックアップテーブルを作成します({IF(...)、...}は、行1-> a、3-> b、6-> c、...で構成されています)いくつかの空白行で)、次にルックアップを実行します。説明もありがとうございます!しかし、「評価を簡単にするために、列A(入力)は値を繰り返さない」とはどういう意味ですか?これは重複した値(abcae ...)を処理するようです、そうではありませんか?
ninjagecko

@ninjagecko:サンプル入力データについて話していました。OPに繰り返しデータが含まれていたため、これについて説明しました。その部分をわかりやすくするために言い換えます。
ルベン・

@通常:省略しませんでした""が、それに関するメモを追加し、に置き換えましROW(A1:A10)ROW(1:10)。:)
ルベン

1
@ninjagecko:多分、私の評価で「評価する」という用語の使用は、あなたの背景のために混乱を引き起こしています。あなたのWeb Appsプロファイルではそれについてあまり共有していませんが、SOでの35kの評判を持っていることがわかります。したがって、「評価」をマシンによって行われるものとして頻繁に使用すると思います。私の場合、私が最初に考えたのは、人間が行うことです。この場合、「whom」は数式ビルダー/アダプター、特にGoogleスプレッドシートでvlookupと配列の前に使用したことがないユーザーです。
ルベン・

2

以前の投稿に加えて、以下の式では、制限のない範囲を使用できるため、参照される列に新しい値が追加されたときに出力が「自動拡張」されます(以下の例のA)。

=ArrayFormula(
   if(row(A2:A) <= max(if(not(isblank(A2:A)),row(A2:A))),
      vlookup(row(A2:A),filter({row(A2:A),A2:A},len(A2:A)),2),
   )
 )

編集:出力をsourcedataの最後の行に限定したくない場合は、次のように最後の行を「ハードコード」できます:

=ArrayFormula( if(row(A:A) <= 20, vlookup(row(A:A),filter({row(A:A),A:A},len(A:A)),2), ) )

この式の注意点の1つは、データソースの最後の行で「停止」することです。これは答えで言及されるべきだと思います。
ルベン・

@ルベン:簡単に修正できると思います。ソースデータの最後の行(例:行20)の後も出力を継続したいとします。数式を= ArrayFormula(if(row(A:A)<= 20、vlookup(row(A:A)に変更できます。 )、filter({row(A:A)、A:A}、len(A:A))、2)、))
JPV

それも答えの中で言及されるべきだと思います。
ルベン・

1
@ルベン:やった ;-)
JPV 2016

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