[[20041003122808]] 『オートフィルタ:選択操作を入力規制リストで』(u-jin) ページの最後に飛ぶ

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

 

『オートフィルタ:選択操作を入力規制リストで』(u-jin)

マクロは自動記録しかできない初心者です。よろしくお願いします。
オートフィルターでデーター抽出するとき、その抽出内容をドロップダウンリストから選択しますが、その選択する操作を、入力規制のリストを使ってできる方法はありませんか。
 これは、年間予定表のある月だけを抽出して、印刷したいのです。そのとき標題のあるセルに抽出したい「月」を入力規制のリストを使って表示し、マクロで印刷ボタンをつくって印刷したいと考えています。


 おはようございます。
一応動くには動いたけど、┐('〜`;)┌あまりぱっとしなかった。。。・゚゚・(>_<)・゚゚・。
でもまぁとりあえず、、、ということでお願いします。
A1からE列に何か見出しをつけてデータを入力してから、
G1に何かを入力してみてください
A列だけにフィルタをかけていますので、E列まではダミーとなります。
シート2を作業用に使っています。
シート1の見出しを右くりっく→コードを表示させて
そこに↓を貼り付けてください。
Private Sub Worksheet_Change(ByVal Target As Range)
'*************************************
'変数の宣言
Dim MyDic As Object, MyKey As String
Dim MyA As Variant, MyTbl As Range
Dim i As Long, MyRow As Long
'*************************************
'ターゲットがG1じゃなかったら中止
If Target.Address <> "$G$1" Then Exit Sub
'画面の更新を停止
Application.ScreenUpdating = False
'イベントを停止
Application.EnableEvents = False
With Me
    'フィルターがかかっていたらOFF
    If .AutoFilterMode = True Then
        .AutoFilterMode = False
    End If
    'MyTblにA列を代入
    Set MyTbl = .Range("A1", .Range("A65536").End(xlUp))
End With
'*****************************************************
'見出しを含めてデータがあったら
If Application.WorksheetFunction.CountA(MyTbl) > 1 Then
    With Me
        'ターゲットが空白か「すべて」だったら、印刷範囲をクリアにして中止
        If Target.Value = "" Or Target.Value = "すべて" Then
            '印刷範囲を解除
            .PageSetup.PrintArea = ""
            '画面の更新解除
            Application.ScreenUpdating = True
            'イベントを解除
            Application.EnableEvents = True
            Exit Sub
        End If
    End With
    'CreateObject関数でディクショナリーを生成
    Set MyDic = CreateObject("Scripting.Dictionary")
    'データを配列MyAに格納
    MyA = MyTbl.Offset(1).Value
    '変数iを配列MyAの上限までループ
    For i = 1 To UBound(MyA, 1)
        MyKey = MyA(i, 1)
        'MyKeyが重複していなかったらMyDicに追加
        If Not MyDic.Exists(MyKey) Then
                MyDic.Add MyKey, Empty
        End If
    Next i
    'シート2の
    With Worksheets("Sheet2")
        'A列をクリア
        .Columns(1).Cells.ClearContents
        .Range("A1").Value = "すべて"
        'A2から下にキーを出力
        .Range("A2", .Range("A" & MyDic.Count)).Value = Application.WorksheetFunction.Transpose(MyDic.Keys)
        'データを名前「リスト」として定義
        .Range("A1", .Range("A65536").End(xlUp)).Name = "リスト"
    End With
    '入力規則を追加
    With Target.Validation
        .Delete
        .Add Type:=xlValidateList, Formula1:="=リスト"
        .ShowInput = False
        .ShowError = False
    End With
    'A列にオートフィルターをかけて入力規則と連動させる
    '印刷範囲はE列までとしている。
    With Me
        MyTbl.AutoFilter Field:=1, Criteria1:="=" & Target.Value, VisibleDropDown:=False
        MyRow = .Range("A65536").End(xlUp).Row
        .PageSetup.PrintArea = "A1:E" & MyRow
        'データが抽出されたら
        If MyTbl.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
            .PrintPreview
        Else
            .AutoFilterMode = False
            .PageSetup.PrintArea = ""
            MsgBox "該当するデータはありません。"
        End If
    End With
    '配列MyAの初期化
    Erase MyA
    'MyDicの開放
    Set MyDic = Nothing
'************************************************************
'データがなかったら
Else
    MsgBox "データが入力されていません。" & Chr(13) & Chr(13) & _
            "A列からE列に見出しをつけてデータを入力してください。"
    With Target
        'ターゲットをクリア
        .Value = ""
        '入力規則を削除
        .Validation.Delete
        'ターゲットの一つ下を選択
        .Offset(1).Select
    End With
        'Sheet2のA列をクリア
        Worksheets("Sheet2").Columns(1).Cells.ClearContents
End If
'***************************************************************
'MyTblの開放
Set MyTbl = Nothing
'イベントの停止を解除
Application.EnableEvents = True
'画面の更新を解除
Application.ScreenUpdating = True
End Sub
あっ、途中でマクロが停止した時などは
↓をどこかで実行してから、また実行してみてください。
Application.EnableEvents = True
多分いいとは思うけど、、私のことだから、、よろしくお願いします。σ(^◇^;)
追伸!入力規則に「リスト」という名前を範囲名に使用していますので
同じ名前がある場合は変更してからお試しください。
2004/10/4 9:35
ではでは、v(=∩_∩=)v
(SoulMan)


  素晴らしい解答ありがとうございました。実際に動かすことができました。
これから自分のファイルに組み込んでみます。分からないところがあったら
またよろしくお願いします。(u-jin)


コメント返信:

[ 一覧(最新更新順) ]


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