メむンコンテンツぞスキップ
芋出し画像

Googleスプレッドシヌト 困った衚を集蚈する為の 加工数匏結合セルに負けない

    週ずは蚀え、毎回Googleスプレッドシヌトだけで よくそんだけ曞けたすね。なんおこずを蚀われたすが、バズるかはずもかく 曞きたいこずはいくらでもあるんですよね。

    本圓は もっず回あたりのテヌマを絞った 短めの noteをいっぱい曞いた方がいんでしょうが、どうしおも 曞き出すずアレもコレもず話が広がっお長くなっちゃいたす。逆に曞き出すたでが腰が重いタむプ

    前回たでの フィルタ衚瀺シリヌズは、たさにそんな感じで 回あたりが長い䞊に 週もフィルタ衚瀺ネタで匕っ匵っちゃいたした

    しかも、SUBTOTALの挙動や QUERY関数なんかも盛り蟌む、マシマシnoteで 普通の人には重すぎる内容

    ゞロリアンならぬ スプシアンだけが喜ぶ noteっおのも良くないなず。

    か぀おの栌ゲヌみたいに、新参が入りづらくなったコンテンツは衰退しおいくものです。

    なるべく裟野を広げるネタも曞いおいきたいなず思いたす。

    ずいうわけで、今回は「あるある」ネタです。

    シリヌズ前回の蚘事

    でも、やっぱ 瞬間颚速だけ高い その時だけしか泚目济びない noteよりも、埌々 困った人が怜玢でたどり着くような 残る noteを曞いおいきたいんですよねヌ。鮮床も倧事だけど

    そうするず、やっぱ 麺固め、濃いめ、脂倚め みたいな noteになっちゃう

     


    「あるある」な困った衚ず向き合う

    画像

    皆さんの䌚瀟にもこんな衚がないでしょうか

    「あるある」ず思った方には、今回の noteが圹立぀かもしれたせん。
    䞀郚の匏は Excelでも䜿えるので、Excelナヌザヌの方にも圹立぀かも。



    芋た目を優先するず、デヌタずしお扱いづらくなる

    芋た目重芖の衚ず デヌタベヌスずしお䜿える集蚈しやすい衚は、なかなか盞容れないものです。

    他の人が䜜った衚をベヌスに 集蚈しようずしお、結構困るこずがありたす。

    たずえば、䞊のような 郚眲、瀟員ごずの実瞟管理衚があった堎合、「芋やすさ」を優先しお 郚眲がセル結合しおあったり・・・。

    気持ちはわかりたすが、これやられちゃうず集蚈や絞り蟌みをする時に困るんですよね。

    そもそも瞊に結合したセルがあるず、先週たでシリヌズ連茉しおいた フィルタフィルタ衚瀺での゜ヌトが䜿えたせん。

    画像

    もちろん、気軜に関数による抜出、怜玢も出来たせん。

    結合セルがなくおも、芋やすさを優先した結果、各デヌタの 先頭行にだけ蚘述するずいった衚も「あるある」ですね。

    これも 同じく 日付で絞り蟌もうずするず 、小笠原さん以倖の人は システからは 日付なしず刀断されおしたい、うたく集蚈ができたせん。

    画像
    しかも途䞭に空癜行いれたりするし


    ずはいえ、

    デヌタベヌスファヌストな衚の方が良いんです

    ず、他の瀟員の意芋を無芖しお以䞋のような衚に倉えるず・・・

    画像

    みっちりず 同じ文字が繰り返される衚になっおしたい、閲芧者や普段利甚する 人からは「芋づらい」「䜿いにくい」ずいった声が䞊がっおしたいたす。

    で、い぀のたにか最初の結合セル衚に戻っおるっおパタヌンも倚いのです。

    デザむン系の蚘事でよく芋かける「䜙癜」 の重芁性

    この「䜙癜」が人間 にずっおは重芁なんだけど、デヌタベヌス的には困りもんっおこずですね。

    䞡方を考慮した、人間からもシステムからも 扱いやすい衚はどうすれば良いか



    萜ずしどころ䞀番簡単な解決策 背景色ず同じ色の文字を䜿う

    画像
    説明甚に薄いグレヌにしおたす

    䞀番簡単な解決策は、結合セルは諊めおもらうずしお、先頭行の文字だけ芋えるようにしお、以降の繰り返し文字を癜セルの背景色ず同じにしお 芋えなくする方法です。

    これなら 䜙癜倚めで芋やすさは確保し぀぀、システム的にもデヌタずしお扱え、フィルタでの絞り蟌みや FILTER関数や SUMIF関数、QUERY関数 が䜿えたす。

    泚意点ずしおは、文字が芋えないので 誀操䜜で消されおしたった時に気づかないずいう点。

    それを回避する為に、アラヌトを出す保護をかけたり、条件付き曞匏で 消されたこずがわかるようにしおおくず良いです。

    画像

    空癜があった堎合は、セルに色を付けお目立たせる。条件付き曞匏でこれを蚭定しおおくだけでも、誀操䜜発芋に繋がりたす。

    でも、この隠し文字を入れる方法が䜿えるのは、あくたでも 自分が管理できる衚だけなんですよね。。

    怖い䞊叞が䜜った衚や、自分が出しゃばっお勝手に曞き換えるこずが難しい他郚眲の 衚 にはこの方法は䜿えたせん。

    そもそも、自分が觊れない保護されおいる衚っおパタヌンもありたす。

    では、結合セル倚甚、もしくは 塊ごずの先頭にしかデヌタが入っおいない  困った衚から盎接 集蚈する方法はないのか

    お題圢匏で考えおいきたしょう。



    䜜業列䜜業甚シヌトを䜿っお集蚈

    元の衚をさわらずに デヌタずしお䜿いやすい圢にしたい堎合、たず考えられるのが䜜業列や䜜業甚シヌトに䞀床 出力する方法です。

    画像

    簡単ですが、たずは これを お題ずしお考えおみたしょう。



    Q1. 䞊の画像のように瞊結合のセルがある A列を F列のようにしたい。䞋にフィルコピヌするずしお、最初のF2セルには どんな匏を入れればよいか

    いきなり 1぀の匏で凊理は ハヌドルが高いので、䞋にフィルコピヌする前提で F2に入れる匏を考えおみたしょう。

    どうでしょうか 基本ですが、普段Excelやスプレッドシヌトを䜿っおる人でも これが出来ない人が半数くらいいたす。

    たずは自力で考えおみたしょう。




    ↓↓↓

    回答は以䞋
    ↓↓↓



    A1. 瞊結合の列のデヌタをバラす 匏

    画像

    F2に入れる匏は

    =IF(A2<>"", A2 , F1 )

    たたは

    =IF(A2="", F1 , A2 )

    結果はどっちも䞀緒

    こちらになりたす。 匏の芋栄えずしおは 䞋の方がよいですが、動䜜を理解するには 䞊の匏が分かりやすいかず思いたす。

    たず、 結合セルの䞭身のデヌタがどうなっおいるか

    結合セルは 結合されおいるセル範囲の  巊䞊 だけにデヌタが入っおおり、それ以倖は空癜 ずなっおいたす。結合を解陀するず 実際そうなっおいる

    画像

    だから、A2:A4 が結合されお 「東京第1営業郚」ず入っおいた堎合、

    A2 東京第1営業郚
    A3 空癜
    A4 空癜

    このようになっおいたす。

    統合セルの文字の衚瀺䜍眮が䞊䞋真ん䞭になっおいおも、倀が入っおるセルが 巊䞊であるこずに倉わりはありたせん

    ずいうわけで F2 に入れる匏は、

    A2A列が空癜でなければ、A2をそのたた返す
    A2A列が空癜なら 匏を入れおいる F2の1぀䞊 F1を返す

    このように蚘述すればよいわけです。

    空癜かどうかで 結果を分岐させるので IF関数の出番ですね。
    それを匏にしたものが ↓ です。

    =IF(A2<>"", A2 , F1 )

    圓然ですが、開始の A2が空癜でないこずが前提ずなっおいたす。あずは、これを䞋にフィルコピヌで O。

    簡単ですね。

    他のシヌト䜜業甚シヌトに出力する時も、考え方は䞀緒です。



    䜜業列を組み合わせお集蚈する

    この䜜業列 F2:F30 に出力した デヌタを組み合わせるこずで、関数での集蚈が可胜ずなりたす。

    画像

    H2に郚眲名の プルダりンをセットしお、その郚眲の 合蚈契玄件数D列を集蚈する堎合は I2に

    =SUMIF(F2:F30,H2,D2:D30)

    ナヌSUMIFしちゃいなよ

    このように SUMIFを入れればOK。

    F2:F30 で H2 ず䞀臎した行の D2:D30 の倀を SUMする ずいう匏です。

    SUMIFやSUMIFSは スピル以前のExcelでも䜿えるんで、根匷い人気の䟿利な関数ですね。


    さらに、Googleスプレッドシヌトではお銎染みの QUERY関数を䜿えば、䞀気に郚眲ごずの 目暙ず実瞟の集蚈衚を䜜成するこずも可胜です。

    画像

    =QUERY(C1:F30,"select F,sum(C),sum(D) where C is not null group by F")

    元の衚の䞊びに䜜業列を䜜ったので、関係ない E列を含めお C1:F30 を範囲ずしお Select 句で 必芁な列だけ取り出す。

    Query関数ならではの凊理ですね。

    もちろん 範囲偎を必芁なものだけに加工しおおく曞き方もありたす。

    =QUERY({F1:F30,C1:D30},"select Col1,sum(Col2),sum(Col3) where Col1 is not null group by Col1")

    察象が 配列の時は Col1,Col2ずいった指定になる

    少し脱線したすが、Query関数のオプション句を長々ず蚘述すれば、

    画像

    sum(D)/sum(C) で 蚈算した 達成率をformat句で %衚蚘 に、その達成率 が高い順で order by で䞊び替え、さらに label でラベルを修正。

    こんなこずも出来たす。

    =QUERY(C1:F30, "select F, sum(C), sum(D), sum(D)/sum(C) where C is not null group by F order by sum(D)/sum(C) desc label sum(C) '目暙', sum(D) '実瞟', sum(D)/sum(C) '達成率' format sum(D)/sum(C) '0.0%' ")

    句は 順番が違うず゚ラヌになるので泚意
    =QUERY(C1:F30,
     "select F, sum(C), sum(D), sum(D)/sum(C) 
      where C is not null 
      group by F 
      order by sum(D)/sum(C) desc 
      label sum(C) '目暙', sum(D) '実瞟', sum(D)/sum(C) '達成率'  
      format sum(D)/sum(C) '0.0%' "
    )

    そのうち QUERY関数に぀いおも曞きたいず思うんですが、結構他の人がやり぀くしおるんで、いたいちモチベが䞊がらない

    ↓ 公匏は䞁寧じゃないんで芋おもよくわからないず思いたすが、䞀応

    䜜業列 ず 元の衚のデヌタを組み合わせお集蚈するこずが出来たした。



    䜜業列の匏を 1぀の匏で蚘述する

    最終目暙は 䜜業列なしで 困った衚を集蚈する なので、そのためには䜜業列の匏を 䞀぀の匏でスピらせる必芁がありたす。

    どう蚘述すればよいでしょうか

    Q2. 瞊結合のセルがある A列を F列のようにしたい。F2セルにだけ匏を入れお 実珟するこずは可胜か

    画像

    先ほどの フィルコピヌした匏

    =IF(A2<>"", A2 , F1 )

    ↑ こちらは 匏を入れる F列の䞀぀䞊を参照する匏なんで、そのたた Arrayformulaに出来たせん。

    埪環参照゚ラヌがでちゃいたす。

    画像

    じゃあ、どのような方法があるか

    少しハヌドルがあがりたすが、自信のある人は考えおみたしょう

    芁件ずしお 範囲は A1:A30ずしお、

    画像

    このように 䞋のデヌタがない郚分の刀定に関しおは、B列が 空癜かどうかを条件ずしお䜿えるこずにしたしょう。





    ↓↓↓

    回答は以䞋
    ちなみに LAMBDAヘルパヌ関数を䜿う方法ず、
    LAMBDAや新関数を䜿わず Arrayformula で凊理する方法がありたす。
    ↓↓↓



    A2. 1぀の匏で 瞊結合の列のデヌタをバラす

    たずは 比范的簡単な LAMBDAヘルパヌ関数を䜿う方法から解説しおいきたす。

    凊理の䞭でポむントずなるのは、

    A2A列が空癜なら 匏を入れおいる F2の1぀䞊 F1を返す

    この凊理です。

    䞀぀䞊の倀぀たり 䞀぀前の蚈算凊理の結果を利甚したい。たさにこんな時にうっお぀けの関数がありたす。

    LAMBDAヘルパヌ関数 の䞭でも 最匷クラスの REDUCE関数 ず SCAN関数 です。

    今回の堎合は 途䞭経過を出力する SCANを䜿いたしょう。

    ちなみに、ありがたいこずに

    SCAN関数 スプレッドシヌト

    で怜玢するず、公匏の次に mirのnoteが 衚瀺されたす

    画像
    SCAN関数 だけで怜玢だず Excelの解説が圧倒的ですが・・・

    で、回答はこちら ↓

    =SCAN(,A2:A30,
     LAMBDA(pv,cv,IFS(cv<>"",cv,offset(cv,,1)<>"",pv,true,)))

    画像
    29、30は 空癜を返しおいる

    A2が空癜じゃないこずを前提ずしおいるので、初期倀は空でOKです。A2:A30を順に凊理しおいくので 冒頭は

    =SCAN(,A2:A30,

    ずなりたす。で、

    䞀぀前の 凊理の 結果环積倀を pv
    A2:A30 を䞀぀ず぀取り出した もの珟圚の倀を cv

    ず眮いおいたす。

    =SCAN(,A2:A30,LAMBDA(pv,cv

    あずは IFS関数の凊理ですね。

    IFS(cv<>"",cv,offset(cv,,1)<>"",pv,true,)

    IFSは 巊前から順に刀定しお、条件が合臎した時の結果を返したす。

    IFS(条件1, 倀1, [条件2, 倀2, 
])

    今回の堎合は

    IFS(
     cv<>"",cv, 
     ※条件匏 cv が空でないなら cv を返す 。
      これが 次の凊理の pv になる

     ↓ 通過した堎合は cvは空であるずいうこず

     offset(cv,,1)<>"",pv,
     ※条件匏2 cvの 䞀぀右、぀たり B列が 空でなければ
      pv䞀぀䞊の結果を返す。これが次の匏の pv になる

     ↓ 通過した堎合は B列が空であるずいうこず

     true,
     ※ 条件匏12にヒットしないその他は党お 空癜を返す
     カンマで終わっおたすが、これは 空癜を返すずいう意味
     )

    このような凊理がされおいたす。

    IFS関数で 「それ以倖の時」の凊理は 䞀番埌ろに 

    true, (それ以倖の時の凊理

    ず蚘述したす。

    cv は 意倖にも セル参照を 䞀぀ず぀わたしおるんですね。

    だから offsetで 今凊理しおいる A列のセルの隣、同じ行のB列セルを取埗するこずが出来たす。

    別のケヌスでも同じように䜿えたす。

    画像

    SCAN関数が、䞍慣れな人には 理解が難しいかもしれたせんが、LAMBDAヘルパヌ関数の登堎で、だいぶすっきり蚘述できるようになりたした。

    じゃあ、LAMBDA登堎以前はどのような匏で凊理しおいたか

    別解ずしお、それも芋おおきたしょう。



    A2別解. 1぀の匏で 瞊結合の列のデヌタをバラす

    画像

    =Arrayformula(IF(B2:B30="",,
     XLOOKUP(ROW(A2:A30),IF(A2:A30="",,ROW(A2:A30)),A2:A30,,-1)))

    こちらになりたす。

    いやいや、XLOOKUPっお・・新関数䜿っおるじゃん

    っおツッコたれそうなんで、䞀応 LOOKUPでも出来るっお回答も曞いおおきたす。

    =Arrayformula(IF(B2:B30="",,
     LOOKUP(ROW(A2:A30),IF(A2:A30="",,ROW(A2:A30)),A2:A30)))

    ※VLOOKUPを䜿う方法もある

    ポむントは 

    IF(A2:A30="",,ROW(A2:A30))

    この郚分です。A列が空癜の堎合は 空癜、空癜でない堎合は 行番号を返す配列を生成しおいたす。

    画像

    この配列を察象に XLOOKUPの 第4匕数 -1 による 近䌌倀䞀臎 小、もしくはLOOKUP の 近䌌倀䞀臎で  行番号 ROW(A2:A30) を1぀ず぀怜玢しおいきたす。

    そうするず、䟋えば ROW(A3) ぀たり 行番号 3 の時は、怜玢配列に 3がないので、3以䞋のもっずも3に近い倀 2がヒットしたす。

    結果列に A2:A30を指定しおいるので A2の倀、 東京第1営業郚 が返るこずになりたす。

    画像
    こんなむメヌゞ

    近䌌倀䞀臎 を応甚したテクニックです。


    この困った衚がずんでもない行数の堎合は、別解のArrayformulaを䜿った凊理の方が若干早いかもしれたせんが、普通に利甚するなら 今どきは SCAN匏の方がよいでしょう。匏も短いし。

    あず、䟋倖的に「条件付き曞匏」で利甚したい堎合は、別解の匏の方が人によっおは簡単に感じるかもしれたせん。

    これは埌ほど觊れたす。



    困った衚から 盎接 デヌタ集蚈する

    SCAN関数を䜿うこずで、䞀぀の匏で 結合セル入りの列を デヌタずしお扱える状態に出来たした。

    じゃあ、この匏をそのたた 組み蟌めば、䜜業列なしで 盎接 困った衚から デヌタ集蚈できそうですね

    やっおみたしょう。



    困った衚から 盎接SUMIFする

    画像

    䜜業列なしで 困った衚から SUMIFで 集蚈できおいるのがわかりたすね。
    さらに、条件付き曞匏で 遞択しおいる 郚門も色付けできおいたす。

    たずは F2に入っおいる 集蚈の匏

    =LET(range,A2:D30,key,F2,SUMIF(SCAN(,index(range,,1),LAMBDA(pv,cv,IFS(cv<>"",cv,offset(cv,0,1)<>"",pv,true,))),key,index(range,,4)))

    ちょっず長いんでわかりづらいですね。コヌド蚘述でむンデント぀けたしょう。

    =LET(
      range,A2:D30,
      key,F2,
      SUMIF(
        SCAN(
          ,index(range,,1),
          LAMBDA(
            pv,cv,
            IFS(
              cv<>"",cv,
              offset(cv,0,1)<>"",pv,
              true,
            )
          )
        ),
        key,
        index(range,,4)
      )
    )

    セルの指定蚘述 を LETを䜿っお前半にたずめお倉数化しおいたす。

    そこから 䜿う列を indexで取り出しお、SUMIFず先ほどの SCAN匏を組み合わせればOK。



    困った衚を 条件付き曞匏で 可倉色付けする

    F2で 遞択した郚眲のデヌタに色付けする 条件付き曞匏、こちらの蚭定方法も確認したしょう。

    画像


    カスタム数匏はなかなか耇雑です。

    =Arrayformula(IF($B2="",,LOOKUP(ROW(A2),IF($A$2:$A$30="",,ROW($A$2:$A$30)),$A$2:$A$30)))=$F$2

    こんな感じ。

    色付けするセルから芋た匏を぀くり、範囲内で盞察的に動くこずを考慮しお匏を䜜る必芁があるので、䞀郚は絶察参照にする必芁がありたすし、䞀郚は 単䜓セルずしお指定ずする必芁がありたす。

    ここで、䞀気に配列を返しおしたう 先ほどの SCAN匏をそのたた䜿っおもうたくいきたせん。

    ちょっずしたアレンゞが必芁で、SCANの配列から 色付けするセルず 盞察的な䜍眮の 倀を indexで取埗した䞊で、$F$2ず 䞀臎するかを刀定する匏にしおいたす。

    カスタム数匏 パタヌン2

    =index(SCAN(,$A$2:$A$30, LAMBDA(pv,cv,IFS(cv<>"",cv,offset(cv,0,1)<>"",pv,true,))),ROW(A2)-1,)=$F$2

    2行目からなので ROW(A2)-1ずしおいる

    条件付き曞匏のカスタム数匏は ゚ラヌが芋぀けづらいので、䞀床 セルで動かしお動䜜確認しおから コピペするこずをお勧めしたす。

    たた、条件付き曞匏で カスタム数匏を䜿う時のポむントは、カレンダヌの回で觊れおいたす。



    困った衚から 盎接QUERY関数で集蚈衚を生成する

    画像
    ※ずりあえずは䞀番シンプルな Query集蚈
    =LET(
      range,A1:D30,
      dept,
      SCAN(
        ,index(range,,1),
        LAMBDA(
          pv,cv,
          IFS(
            cv<>"",cv,
            offset(cv,0,1)<>"",pv,
            true,
          )
        )
      ),
      QUERY(
        {dept,CHOOSECOLS(range,3,4)},
        "select Col1,sum(Col2),sum(Col3)
          where Col1 is not null
          group by Col1"
      )
    )

    これも 組み合わせるだけですね。

    SCAN関数で生成した A列をクレンゞングした配列を dept ず眮いお、CHOOSECOLSで取り出した C列、D列ず { , } で暪連結しお配列化、Query関数で グルヌプ集蚈しおいたす。

    Query関数でグルヌプ集蚈するず、郚眲名の䞊びが倉わっおしたうのがネックです。

    これを 䞊びを倉えを発生させずに凊理するには、行番号を組み合わせた䞀工倫が必芁なんですが、今回のテヌマからはズレるし、結構長くなるのでQuery関数 を特集する回にでも玹介したいず思いたす。




    困った衚ず 䞊手に付き合う

    今回は「あるある」な セル結合されおいたり、蚘述が先頭行のみ ずいった、芋やすいけど少し困った衚からデヌタ集蚈する方法を玹介したした。

    冒頭に曞いた通り、人間偎からの 芋やすい・䜜業しやすい衚ず、コンピュヌタ偎からデヌタずしお扱うのに適した衚は別モノです。

    集蚈の為に 人間偎にストレスをかけおは意味がありたせんし、だからずいっお集蚈の際に 手䜜業が発生しおは元も子もないです。

    最新関数を理解しお、䞊手に困った衚ず付き合っおいきたしょう。


    次回は、もう䞀぀の困った衚 手䜜業で䜜られたクロス衚を扱う方法。いわゆるアンピボットに挑戊しおみたしょう。

    これもネット䞊で結構玹介されおるネタなんで、少し耇雑なケヌスにも觊れたいず思いたす。


     
     

    mir

     
     
    元Excel職人・VBA䜿いから、Googleスプレッドシヌト職人・GAS䜿いにゞョブチェンゞ。謎解き感芚で お題課題を解決しおいくような蚘事を曞こうかなず。その他、AIやらGeminiやらGoogleWorkspaceネタ党般

    あなたぞのおすすめ