[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『意図せずプロシージャが呼ばれる』(はてな)
ワークシートにテーブルがあり、このテーブルに対しオートフィルターを掛けるためのユーザーフォームを設置してあります。
ユーザーフォームには3つのグループのチェックボックスがあり、各チェックボックスをクリックするとfilterプロシージャを呼んでオートフィルターを掛けるようなっています。
グループのラベルをクリックした時、グループ全てのチェックがTrueだったらFalseに、一つでもFalseであれば全てTrueにするプロシージャを書きました。
このプロシージャを呼んだ時は(チェックボックスをクリックしたわけではないので)filterプロシージャが呼ばれないと思っていたのですが、実際にはクリックしたのと同じ扱いでfilterプロシージャが呼ばれているようです。
意図しない動作であり、また少々時間が掛かるので改善したいのですが何か良い方法はあるでしょうか。ご教授お願いします。
(チェックボックス毎に設定されたfilter呼び出し)
Private Sub rare01_Click()
filter
End Sub
(filterプロシージャ)
Private Sub filter()
Dim rare(6) As String
Dim buki(11) As String
Dim zokusei(6) As String
Dim c As Object
For Each c In Controls
If Left(c.name, 4) = "rare" Then
If c.Value = True Then rare(Right(c.name, 2) - 1) = c.Caption Else rare(Right(c.name, 2) - 1) = "" End If ElseIf Left(c.name, 4) = "buki" Then If c.Value = True Then buki(Right(c.name, 2) - 1) = c.Caption Else buki(Right(c.name, 2) - 1) = "" End If ElseIf Left(c.name, 7) = "zokusei" Then If c.Value = True Then zokusei(Right(c.name, 2) - 1) = c.Caption Else zokusei(Right(c.name, 2) - 1) = "" End If End If
Next c
Set table = Worksheets("sheet1").ListObjects("UDB").Range
With table
.autofilter field:=8, Criteria1:=rare, Operator:=xlFilterValues .autofilter field:=11, Criteria1:=zokusei, Operator:=xlFilterValues .autofilter field:=12, Criteria1:=buki, Operator:=xlFilterValues End With End Sub
(チェックボックスを一括でチェックオン・オフするためのプロシージャ)
Private Sub labelrare_Click()
'ラベルレア
Dim i, r As Integer
Dim b As Control
For i = 1 To 7
Set b = Controls("rare0" & CStr(i))
If b = True Then
r = r + 1
End If
Next i
For i = 1 To 7
Set b = Controls("rare0" & CStr(i))
If r = 7 Then
b = False '←ここでfilterプロシージャが反応してしまうみたいです
Else
b = True
End If
Next i
End Sub
< 使用 Excel:Excel2013、使用 OS:Windows10 >
そこではなく、b = True では?
チェックボックスのValueがTrueになり
Clickイベントが発生しているのでしょうか。
>ラベルレア
が何かわかっていないので、間違っているかもしれません。
(マナ) 2017/05/12(金) 20:28
これは、コマンドボタンで実行するのではだめなのでしょうか?
(マナ) 2017/05/12(金) 20:39
b=true のあとに flg=true を追加して
Private Sub rare01_Click() if flg then flg=false else filter end if End Sub
(マナ) 2017/05/12(金) 20:57
(マナ) 2017/05/12(金) 22:19
flgという概念を使って問題解決する方法を一つ学ぶことができました。
ご助言ありがとうございました。
(変更後コード)
For i = 1 To 7
Set b = Controls("rare0" & CStr(i))
If b = True Then
r = r + 1
End If
Next i
For i = 1 To 7
Set b = Controls("rare0" & CStr(i))
flg = True
If r = 7 Then
b = False
Else
b = True
End If
Next i
flg = False
If Not r = 7 Then
filter
End If
(はてな) 2017/05/12(金) 22:20
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.