[[20030919112019]] 『オートフィルタでできるリストの取り出し』(yusaku) ページの最後に飛ぶ

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

 

『オートフィルタでできるリストの取り出し』(yusaku)

 オートフィルタを使うと50音順のリストが作られますが、
 これをコピーしたり、リストとして取り出すことができませんか?

 抽出データを選択して、コピーし「形式を選択して貼り付け」の「値」にすれば 
 できると思います。(スー)


 (スー)さん早速のお返事ありがとうございます。
 でも、ちょっとニュアンスがちがうようですので改めて説明します。

 オートフィルタ矢印をクリックするとアイテム一覧が出ると思うのですが、
 この一覧をコピーなり、取り出しをしたいのです。
 同じことですか?(yusaku)

 フィルタオプションの重複無視のことでしょうか? (INA)

 多分、矢印をクリックして出てくるリストボックスの中身をコピーしたいと言う事なんじゃ
 ないかと思いますが、なんか無理っぽく感じます。
 強いてやるとすれば画面全体のハードコピーをとるとか・・・。(とっちゃん)

 >画面全体のハードコピーをとるとか・
 yusakuさんは、値として取得したいのではないでしょうか?  

 オートフィルタのドロップダウンのリストって、
 フィルタオプションの重複無視で抽出したデータと同じだったと思いますが・・?

 簡単にサンプルを書いておきます。 

 Private Sub CommandButton1_Click()
 With Worksheets("sheet1")
    'sheet1 A列 フィルタ(重複無視)
    .Range("A:A").AdvancedFilter Action:=xlFilterInPlace, Unique:=True

   '抽出範囲のコピペ sheet2へ
    .Range("A1").CurrentRegion.Copy _
    Destination:=Worksheets("sheet2").Range("A1")

    Worksheets("sheet2").Select

 End With

 End Sub

   (INA)

 (INA)さん、(とっちゃん)さんありがとうございます。
 「重複無視」というんですね。

 で、(INA)さんのおっしゃる通りやってみたら、
 希望通りのことができました。
 ありがとうございました。また、ひとつ賢くなりました。(yusaku)

 凄い、凄い!こんな事が出来るんですね。
 私も大いに勉強させて貰いました。(INA)さん、有難う御座いました。(とっちゃん)

 >「重複無視」というんですね 
 正確には、フィルタオプションの「重複するレコードは無視する」ですね。(INA)

この重複無視を関数ではできないのでしょうか
(えみこ)

 例えば、どのような使い方をしたいのでしょうか? (INA)

     a    b      c
 1  朝  朝
 2 昼  昼
 3 夜  夜
 4  朝 
 5  昼
aの重複を無視してbに関数をいれて表示できないでしょうか
(えみこ)

 フィルタの抽出結果のうち、1番目のデータ、2番目のデータというように
 抽出されたリストのインデックスを指定して、セルに表示したいということ
 ですよね? 
   =Sample(A列,1番目) のような感じかな?
   (INA)

 そうだです。それで重複を無視してほしいです
だけど一番目二番目みたくなくてもいいのですが・・・
A列の順番無視・重複無視をB列に表示したいです
(えみこ)

 セル毎に数式として入力することになるので、インデックスを指定しないとなると
 1セルにまとめて、入ることになるような気がするのですが・・・
 関数というのは、VBAでも良いと言うことでしょうか?
  (INA)

 VBAは難しいのでできれば関数がいいので、
そーしたら
=Sample(A列,1番目)というのでいいので説明お願いします
(えみこ)


 ユーザー関数で作るには、すぐに出来そうにないので、
 ひとまず簡単なVBAを作りましたので、試してみて下さい。

 [ツール]-[マクロ]-[Visual Basic Editor]を起動して、
 プロジェクト・ウィンドウのsheet1をクリックするとコードウィンドウが
 表示されますので、コピペして下さい。

 A列のセルに入力があると、C列に重複無視したリストが表示されます。 

 Private Sub Worksheet_Change(ByVal Target As Range)
 Application.ScreenUpdating = False

 If Target.Column <> 1 Then Exit Sub

    Columns("A:A").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    Range("A1").CurrentRegion.Copy Destination:=Range("C1")

    Columns("A:A").AutoFilter
    AutoFilterMode = False

 Application.ScreenUpdating = True

 End Sub

    (INA)

 ありがとうございます・けれどVBAだと結構行数があると時間がかかるので・・・
いつも私がやっているのは
    a    b      
 1  朝  
 2 昼  
 3 夜  
 4  朝 
 5  昼
こうゆう風になっていたとして
b列に=IF(COUNTIF($A$2:A2,A2)>1,"*","")
をいれてbをコピーして値で貼り付けて
bで並び替えて*がついている行を削除すると
aに重複無視のリストが出来上がるのですが
こんな感じの関数はできないでしょうか?
(えみこ)

 >VBAだと結構行数があると時間がかかるので・・・
 私のパソコン(P4 1.6GHz)だと、65536行でも 0.3秒 くらいで、
 出来ますが、遅いですか・・・?

 関数化については、考え中・・・(-_-;)

  (INA)


 B列を作業列として、C列に出します。
 B1
 =IF(A1="","",IF(MATCH(A1,A:A,0)=ROW(),ROW()))
 C1
 =IF(COUNT(B:B)<ROW(),"",INDEX(A:A,SMALL(B:B,ROW())))
 とし、それぞれ下へ(A列が使用するであろう範囲まで)コピーします。
 B列は非表示とします。

 データが大量にある場合は、フィルタオプションの重複するレコードは無視するで抽出した方がいいと思いますが…。
 (kkk)


コメント返信:

[ 一覧(最新更新順) ]


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