[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートフィルタ:選択操作を入力規制リストで』(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.