[[20170808141450]] 『数値を比較、条件による表示の並び替えと出力』(エクレール) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『数値を比較、条件による表示の並び替えと出力』(エクレール)

 類似の質問がないか知恵袋やExcelを取り扱ったサイトを探してみたのですが
 ヒントになるような記述も見つからず、こちらに質問した次第となります。
 お知恵をお貸しいただけましたら幸いです。

 ■やりたいこと
 数値データを参照して、数値により表示順を並び替えて、
 特定の文字列と数値を出力する関数を作成したいのですが
 同じ数値の場合と異なる数値の場合で文字列の表示位置を変更する
 うまい具合の関数が思いつきませんでした。

 (例)
【データ】
 A    B    C    D   E
 100  100   200  200  100

 ※データとして持っていませんが、
 A=リンゴ B=みかん C=ブドウ D=梨 E=スイカに対応

 上記のようなデータがあった場合、
 【ブドウと梨が200円、リンゴとみかんとスイカが100円。】
 と出力し、
 例えば「みかんが200」に変わった場合、
 【みかんとブドウと梨が200円、リンゴとスイカが100円。】
 とするには、どのような関数を使えばよろしいでしょうか。
 1つの関数に収まらなくても問題ありません。
 文字列を出力するセル以外に計算用のセルを設けることは可能です。

 ※文字列に出力する際に、A>B>C>D>Eの優先順で表示されるのが理想です。
 ※関数を記述するbookとデータの記述されたbookは別で、データbookは編集不可能です。
 ※データ自体はMATCH関数を利用して関数を記述するbookにコピーしています。(作成済)
 ※関数を記述するbookには作業列などの追加は可能です。
 ※VBAはできませんが、VBAで解決する場合は、VBAでも問題ありません。

 究極的に言ってしまえば全てのパターンをIFで定義してしまえばいいのかもしれませんが、
 関数が非常に長くなる為、今後を考慮すると好ましくありません。

 組み合わせのパターンごとに文字列を表示する関数を作成して、
 IFで条件分けしてパターンを呼び出す事も考えたのですが、
 数値による表示位置の変更部分をどうしたらいいか、思いつかず断念している状況です。

 何か良い案はないでしょうか。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 こういうことっすか?
 データとして持っていない、りんごやらみかんやらはこちらではどうにもできません。
 G2=AggAndCon(A1:E1,A2:E2)

    |[A]|[B]|[C]|[D]|[E]|[F]|[G]                          
 [1]|A  |B  |C  |D  |E  |   |                             
 [2]|100|100|200|200|200|   |AとBが100円、CとDとEが200円。

    Function AggAndCon(dt As Range, yen As Range) As String
        Dim dic As Object
        Set dic = CreateObject("Scripting.Dictionary")
        Dim c As Long
        For c = 1 To yen.Columns.Count
            dic(yen.Cells(1, c).Value) = dic(yen.Cells(1, c).Value) & "と" & dt.Cells(1, c).Value
        Next c
        Dim k As Variant
        Dim msg As String
        For Each k In dic.keys
            msg = msg & Mid(dic(k), 2) & "が" & k & "円、"
        Next k
        AggAndCon = Left(msg, Len(msg) - 1) & "。"
        Set dic = Nothing
    End Function
(稲葉) 2017/08/08(火) 15:45

 ちゃんと読んでなかった・・・
 コード差し替えでお願いします。

    Function AggAndCon(dt As Range, yen As Range) As String
        Dim dic As Object
        Set dic = CreateObject("Scripting.Dictionary")
        Dim AL As Object
        Set AL = CreateObject("System.Collections.ArrayList")
        Dim c As Long
        For c = 1 To yen.Columns.Count
            If Not dic.exists(yen.Cells(1, c).Value) Then
                AL.Add yen.Cells(1, c).Value
                dic(yen.Cells(1, c).Value) = dt.Cells(1, c).Value
            Else
                dic(yen.Cells(1, c).Value) = dic(yen.Cells(1, c).Value) & "と" & dt.Cells(1, c).Value
            End If
        Next c
        Dim k As Variant
        Dim msg As String
        AL.Sort
        AL.Reverse
        For Each k In AL.toarray
            msg = msg & dic(k) & "が" & k & "円、"
        Next k
        AggAndCon = Left(msg, Len(msg) - 1) & "。"
        Set dic = Nothing
        Set AL = Nothing
    End Function
(稲葉) 2017/08/08(火) 15:57

お礼が遅くなり申し訳ありません。こんなに早くご返答頂けるとは思っていませんでした。
迅速なご回答誠にありがとうございます。
今回の件でユーザー定義関数と言うものを初めて知りましたが
ご教示頂きましたコードを使用して意図した文字列の出力に成功いたしました。
自分でコードを記述するのは難しそうですが
ご教示頂きましたコードと参照するセルを工夫することで活用させていただきたいと思います。
ご回答重ね重ねありがとうございました。
(エクレール) 2017/08/09(水) 11:23

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.