[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『値をグループ化して表示する方法』(よっち)
A列にはランダムに1文字の値が入っています。 B列に、A列にある値を重複なしにして並べて入れたいです。 関数を使ってやる方法があれば知りたいです。 よろしくお願いします。
A B 1 カ 2 カ キ 3 4 5 キ 6 7 カ
関数は分かりませんが、マクロでやってみました。 σ(^-^;)の勉強のため、みようみまねでDictionaryを使ってます。 怪しいところにつっこみが入るとうれしいです^^; 【使い方】 1)Alt+F11を押して、出てきた画面で 挿入→標準モジュール を選択。 2)その画面に下記のコードを貼り付け 3)×を押して、その画面を終了。 4)Alt+F8を押して、DicPracticeを選択、実行。 '---- Sub DicPractice() Dim myDic As Object Dim myKey As String Dim myA As Variant Dim i As Long Set myDic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") myA = .Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row) For i = 1 To UBound(myA) myKey = myA(i, 1) If myKey <> "" And Not myDic.exists(myKey) Then myDic.Add myKey, Empty Next .Range("B1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.keys) End With End Sub '(ROUGE)
>怪しいところにつっこみが入るとうれしいです^^; ではでは、、、 変数「myKey」は、代入しなくてもいいと思うので削除。 myDic.exists は、Dictionary の特性として、重複無視できるので省いて、、、 σ(^o^;)なら、下記のような感じですかね^^ Sub TEST() Dim MyDic As Object Dim MyA As Variant Dim i As Long Set MyDic = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") MyA = .Range("A1:A" & .Range("A" & Rows.Count).End(xlUp).Row) For i = 1 To UBound(MyA, 1) If Not IsEmpty(MyA(i, 1)) Then MyDic(MyA(i, 1)) = Empty End If Next i .Range("B1").Resize(MyDic.Count, 1).Value = Application.Transpose(MyDic.keys) End With End Sub (キリキ)(〃⌒o⌒)b
ROUGEさん、キリキさん、ご回答ありがとうございます。 私もVBAは書けるのですが、関数にて対応したかったのです。
でも、Dictionaryは知らなかったので大変勉強になりました。 ありがとうございます。チョット使ってみますね。
Scripting.Dictionaryを使う場合は、 参照設定にてMicrosoft Scripting Runtimeにチェックをすると Createしなくても使えますよね。
他に、関数で対応する方法をご存知の方いましたら ご教示ください。よろしくおねがいします。 (よっち)
C列を作業列に使う方法です。範囲をとりあえず100行目までとして、 B1セル =IF(ISERROR(SMALL($C$1:$C$100,ROW())),"",INDEX($A$1:$A$100,SMALL($C$1:$C$100,ROW()))) C1セル =IF(COUNTIF(A$1:A1,A1)<>1,"",ROW()) 以下、下方向にコピーです。 (純丸)(o^-')b
◆ちょっと長いですが =IF(ROW(A1)>COUNT(INDEX(1/(MATCH($A$1:$A$100,$A$1:$A$100,)=ROW($1:$100)),)),"", INDEX($A$1:$A$100,SMALL(IF(COUNTIF(OFFSET($A$1,,,ROW($1:$100)),$A$1:$A$100)=1,ROW($1:$100)),ROW(A1))))
★この式は「配列数式」です。式を入力後、Ctrl+Shift+Enter をおして、式を確定させてください。 ★確定すると、式の両端に{ }がつきます。 ★式を確定してから、下にコピー (Maron)
ヮ(゚д゚)ォ! 凄いです! ばっちりできました!
純丸さん、Maronさん、ありがとうございました! 範囲参照する関数や配列関係は、まだまだ使いこなせてないので 参考にさせていただきます♪
ありがとうございました!
解決済みですがせっかく考えたので 表示したい 「1 から 100」の範囲を選択した状態で 数式バーに↓と入力してCtrlキーとShiftキーを押しながらEnterキーで確定です。 あまり良く見ていないので無駄が多いかも?です。 =IF(SUM(ISNUMBER(IF((MATCH(A1:A100,A1:A100,0)=ROW(A1:A100))*1>0,1))*1)<ROW(A1:A100),"", INDEX(A1:A100,SMALL(IF(ISNUMBER(IF(MATCH(A1:A100,A1:A100,0)=ROW(A1:A100),1))*ROW(A1:A100)>0,ROW(A1:A100)),ROW(A1:A100)))) (SoulMan)
キリキさん、つっこみありがと〜☆ まだまだσ(^-^;)のDictionaryは披露できる代物ではありまへんでした・・・orz (もっと精進せねば・・・) (ROUGE)
To ROUGEさん >まだまだσ(^-^;)のDictionaryは披露できる代物ではありまへんでした・・・orz とんでもない!!! σ(^o^;)の、初Dictionaryなんて酷いものでしたから・・・orz ここまでこんなに早く出来るなんて、羨ましい限りです^^ To SoulManさん ね 先生? そうでしたよね〜? 出来が悪くて、SoulMan先生に個人授業していただいたぐらいですからね〜♪ たまには、どっしり・ゆっくり学校にいらしてください^^ (親分のところにもね〜) もっともっと色々教えていただきたいですから〜 PS その後、ゴルフの方はいかがですか? (キリキ)(〃⌒o⌒)b
=IF(SUM((MATCH(A$1:A$12,A$1:A$12,0)=ROW(A$1:A$12))*1)<ROW(A1),"",INDEX($A$1:$A$12 ,SMALL(IF((MATCH(A$1:A$12,A$1:A$12,0)<>ROW(A$1:A$12)),"",ROW(A$1:A$12)),ROW(A1))))
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.