[[20060518160424]] 『値をグループ化して表示する方法』(よっち) ページの最後に飛ぶ

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

 

『値をグループ化して表示する方法』(よっち)

 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.