プロが教える店舗&オフィスのセキュリティ対策術

11/10にはF列に並び替え(IF関数使用)できましたが、今回はC列の◎や○の人をA列の区分に移動昇格し区分名も変更したい。並びF列はIFで再度します。A区分は最高位なので上がることはない。

「エクセルC列の○◎がついた人を、A列の区」の質問画像

質問者からの補足コメント

  • どう思う?

    区分A~ を半角数字1~に変更可能です。

      補足日時:2021/11/16 13:56
  • うーん・・・

    VBAとは、開発>マクロの記録あたりの事でしょうか。「Go! Go! エクセルマクロをはじめよう!」をたまに、見てましたけど、実際には、したことがありません。よろしくお願いいたします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/11/16 18:21
  • 昨夜遅くと、今朝早くの補足補足、ありがとうございます。検証はまだできていませんが、補足です。添付画像のように、「並び替え」はF列だけ使用しますが、「次月用記入用紙」は「ほか1・ほか2」の「行ごと」情報もほしいのです。どうでしょうか。よろしくお願いします。

    「エクセルC列の○◎がついた人を、A列の区」の補足画像3
    No.4の回答に寄せられた補足コメントです。 補足日時:2021/11/19 11:51
  • ADDRESS関数(A=65)・INDIRECT関数(絶対参照など)・(TRIM関数(スペース削除)など初めて調べる関数です。
    すごい!!。作業2・3・並び替えはなんとか理解?ですが、作業1の昇格後のランク表示の関数が?いまいち理解できませんが、
    ここまで、関数を教えていただいたのに申し訳ありませんが「次月可否記入用紙」もお願いします。

      補足日時:2021/11/20 11:34
教えて!goo グレード

A 回答 (4件)

No.1です。

前回回答の補足です。
前回回答で投稿したI2セルに記述した数式の末尾に

・・・))=G2),H2)),2,2)),"")

という部分がありますが、これは数式の意味をご理解いただけると判ることなのですが、名前がすべて1文字である「ご質問者の例示の表」のために作成した数式です。
実際のメンバーすべてのお名前が1文字であることは、常識的には考えにくいので、その場合上記数式の末尾の数値はメンバーの最長の名前の文字数以上にしておけば安全です。「寿限無」でない限り20文字あれば十分だと思いますので、

・・・))=G2),H2)),2,20)),"")

に修正すれば実際の場面で使用できると思います。
    • good
    • 0

No3です。


補足を投稿したのですが、投稿番号を間違えて「No.2です」と書くべきところ、「No.1です」と書いてしましました。
ご質問者さん、No.1の中山あさん、大変失礼をいたしました。
訂正してお詫び申し上げます。
この回答への補足あり
    • good
    • 0

No.1さんのご指摘のとおり、VBAで処理すべき内容だと思います。


ただ、ご質問者がVBAを扱うレベルにないとのことなので、無理やり関数で処理する方法を考えてみました。
とりあえず、表の大きさは最大でも300行程度のものだとします。
添付画像をご覧ください。
無理やりなので作業列を3列使用しています。作業列の場所はどこでもよいのですが、一応「並び替え結果」を表示する列の左側に3列挿入することにしています。
作業列1(添付画像F列)のF2セルに

=IF(A2="",A3,IF((A2<>"A")*((C2="◎")+(C2="○")),LEFT(ADDRESS(1,COLUMN(INDIRECT(A2&"1"))-1,4),1),A2))&IF(C2=""," ",C2)&B2

という数式を記述して下方向へコピーし、昇格後のランクを表示できるようにしています。
作業列2(添付画像G列)のG2セルに

=IF(TRIM(F2)<>"",AGGREGATE(15,6,CODE(LEFT($F$2:$F$300,1)),ROW(A1)),"")

という数式を記述して下方向へコピーし、それぞれのランクを文字コードに変換して、昇順に並べ変えています。
作業列3(添付画像H列)のH2セルに

=IF(G2<>"",COUNTIF($G$2:G2,G2),"")

という数式を記述して下方向へコピーし、ランクの表題とランクに属する人の数を合算した数を数えています。
「並び替え結果」を表示する列(添付画像I列)のI2セルに

=IFERROR(IF(MID(INDEX(F:F,AGGREGATE(15,6,ROW($F$2:$F$300)/(CODE(LEFT($F$2:$F$300,1))=G2),H2)),3,1)="",MID(INDEX(F:F,AGGREGATE(15,6,ROW($F$2:$F$300)/(CODE(LEFT($F$2:$F$300,1))=G2),H2)),1,1),MID(INDEX(F:F,AGGREGATE(15,6,ROW($F$2:$F$300)/(CODE(LEFT($F$2:$F$300,1))=G2),H2)),2,2)),"")

という数式を記述して下方向へコピーしています。
これは、各ランクの表題とランクに所属している人の人数の合計が判っているので、F列をG列のランクの文字コードの昇順かつH列の順番に表示するための数式です。
以上で並び替え完了ですが、作業列1~3は非表示にすることで、見映えをご質問者の提示されたものと同じにすることができます。
「エクセルC列の○◎がついた人を、A列の区」の回答画像2
    • good
    • 0
この回答へのお礼

VBAでなく、関数でもここまでつくられるgoomaniaさん、補足で次の質問をしましたが、この御礼をまずします。ありがとうございました。再度質問をUPします。

お礼日時:2021/11/20 14:07

区分を数字にすればVBAで出来そうな感じはしますが関数だと思い浮かびません

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング