[[20170512180504]] 『意図せずプロシージャが呼ばれる』(はてな) ページの最後に飛ぶ

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

 

『意図せずプロシージャが呼ばれる』(はてな)

ワークシートにテーブルがあり、このテーブルに対しオートフィルターを掛けるためのユーザーフォームを設置してあります。
ユーザーフォームには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 = False   '←ここでfilterプロシージャが反応してしまうみたいです

そこではなく、b = True では?

チェックボックスのValueがTrueになり
Clickイベントが発生しているのでしょうか。

>ラベルレア

が何かわかっていないので、間違っているかもしれません。

(マナ) 2017/05/12(金) 20:28


>Private Sub rare01_Click()

これは、コマンドボタンで実行するのではだめなのでしょうか?

(マナ) 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を追加しました。
試してみたところ、チェックボックスの値をTrueにしようがFalseにしようがclickしたことになって反応するので、値を変更する前にflg=trueを入れて、そのままだと次チェックボックスをクリックした時反応しないので最後にflg=Falseを入れてあります。
またフィルターを掛けてある状態でラベルをクリックすると、フィルターが解除されるようにできました。
動作も一回ごとにフィルターを掛けるよりも高速化され、満足のいく動作になりました。

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.