[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ListFillRangeを更新する際に、Changeイベントを停めたい』(さいき)
いつも勉強させていただいております
シート上(報告シート)に設置したActiveXのコンボボックスのChangeイベントを停止する方法が知りたいです
コンボボックスで選んだスタッフの販売一覧を、元データシートから表示させています
スタッフは変動ありで、人数も名前も確定した一覧がありません
元データ更新のタイミングで報告シートのコマンドボタンのListFillRangeも更新したいので、 『元データK列を重複なしにして、指定している範囲(設定シート)に貼付け→最終行まで指定しなおす』 というコードを書き、 元データシートにコマンドボタンを設置しました
しかし貼付けたタイミングで、報告シートのコマンドボタンChangeイベントが作動します ListFillRangeを更新の際にChangeイベントを停止できればよいのですが、できなくて困っています
いまのところ、ChangeイベントにActivesheet名で分岐処理してうまくいっておりますが、ComboBox1_Changeのイベントは停められないものなのでしょうか?
コマンドボタンに表示させたい名前を、更新の都度Addしたほうがいいのでしょうか? それとも考え方がそもそも違い、確定していないものをコンボボックスで選択しようということがおかしく、セルに曖昧検索で入力させた方がいいのでしょうか? なにか方法がございましたらご教授ください。よろしくお願いいたします
< 使用 Excel:Excel2010、使用 OS:Windows7 >
*それとも考え方がそもそも違
うのかどうか分からないですけど、
元データシート(Sheet2とする)のデータ範囲に名前を設定します。
セルA1以下、データの有る範囲として「リスト」という名前で範囲に
=OFFSET(Sheet2!$A$1,0,0,COUNTA(Sheet2!$A:$A),1)
と設定します。
元データシートのチェンジイベントに
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect([リスト], Target) Is Nothing Then Application.EnableEvents = True Else Application.EnableEvents = False End If End Sub
と設定しておき、報告シートのチェンジイベントに(コンボボックスのオブジェクト名はComboBox1として)
Private Sub ComboBox1_DropButtonClick()
ComboBox1.ListFillRange = "=" & [リスト].Address(1, 1, 1, 1) End Sub
と設定するとどうでしょうか?
(ウッシ) 2015/05/28(木) 15:31
Private Sub ComboBox1_DropButtonClick()
ComboBox1.ListFillRange = "リスト" End Sub
で、良さそうです。
(ウッシ) 2015/05/28(木) 15:43
>>報告シートのコマンドボタンChangeイベントが作動します
これは、報告シートの【コンボボックス】のChangeイベントのことだと思いますが、 元データシートのコマンドボタンルーティンのコードをアップされてはいかがですか。
(β) 2015/05/28(木) 17:20
>Changeイベントを停止できればよいのですが
ActiveXControlのイベントの制御は、フラグ変数を設けて 自分で処理するのですよ!!
private ev_stop as boolean
Private Sub ComboBox1_Change() if not ev_stop then '本来の処理 end if End Sub
イベントを発生させたくない処理の前に
ev_stop=true
と設定し、
処理後に ev_stop=false
と元に戻します。
(ichinose) 2015/05/28(木) 21:19
長らく放置してしまい申し訳ございません 急にこの作業の前段階で大幅な変更を言い渡され、その対応でまったく今まで確認できませんでした ただいまより至急確認させていただきます
>ウッシさん リストに名前を付けるのですね! なるほど… やってみます!
>βさん 申し訳ございません まだ確定していないこともたくさんありましたので、省略してしまいました 見苦しいですが以下です スタッフ名と店舗名を判断基準として、列を変えたり、データを日付型に直したり、数字を別表から文字に直したりしておりますが、その部分はカットしております
Private Sub ComboBox1_Change() Dim i As Long, k As Long Dim Shop As String, S_Name As String Dim a, m(1 To 300, 1 To 82)
Application.ScreenUpdating = False Application.EnableEvents = False
If ActiveSheet.Name <> "報告" Then Exit Sub
'--前のデータクリア If Range("B" & Rows.Count).End(xlUp).Row > 8 Then Range("B8:BH" & Range("B" & Rows.Count).End(xlUp).Row).ClearContents End If
'--とりあえずスタッフ名と店名確定 '*---(コンボボックス連動させるか要確認) S_Name = Range("D4").Value With ThisWorkbook.Sheets("設定") Shop = .Cells.Find(What:=S_Name).Offset(, -1).Value End With Range("D3").Value = Shop
'--貼付けデータ読み込み With ThisWorkbook.Sheets("元データ") a = .Range("A1:CD" & .Range("A" & Rows.Count).End(xlUp).Row) End With
'--該当データ探し '*---(同名異店舗除くのか要確認) k = 1 For i = 2 To UBound(a, 1) If a(i, 11) = S_Name Then If a(i, 10) = Shop Then m(k, 2) = k m(k, 3) = a(i, 3) '---以下ダラダラとaからmへ必要データ書き込み k = k + 1 End If End If Next i
'--データ展開 Range("A8:BH300").Value = m ActiveSheet.PageSetup.PrintArea = "$A$1:$BH$" & _ Range("B" & Rows.Count).End(xlUp).Row
Application.ScreenUpdating = True Application.EnableEvents = True End Sub
> ichinoseさん 自分でするんですね! 開発者に頼りきりになっておりました… ウッシさんの名前の定義で試した後、やってみます!
(さいき) 2015/06/01(月) 16:28
>>自分でするんですね!
ichinoseさんからわかりやすいコード付き回答がありますので、付け足すことはなく【蛇足】ですが。
今回はシート上の ActiveXですけど、今後、ユーザーフォームも経験されていくと思います。 ユーザーフォームのコントロールにも同じことがいえます。
シートやセルは【エクセル一家】の構成員ですから、親分(エクセル:Application)が、 「何がおきてもなりをひそめてじっとしてろ!」つまり、Application.EnebleEvents = False ですが そう一喝すると、子分たちは、そのいいつけを守ります。
ところが、ActiveXは、エクセル一家の構成員ではなく【MsForms一家】に所属していて、たまたまエクセル一家に わらじをぬいでいるところなので、なかなか親分の統制がききません。(というか、親分は東北弁、ActiveXは鹿児島弁) なので、かちこみがあった場合、エクセル一家の構成員たちはおとなしくしていますが、ActiveX君は、『すわ!!天下の一大事!!』 とばかりに、動き回ります。
なので、親分は、子分たちに対しては東北弁で指示しますが、客分のActiveX君には鹿児島弁で指示する必要が出てきます。 方法はいろいろありますが、代表的なのもが、ichinoseさんがアップされた、フラッグ、これを【葵の印籠】にして制御するということです。 (β) 2015/06/01(月) 17:42
確認いたしました
>ウッシさん ListFillRangeの範囲内の値が変更されれば、ComboBox1_Changeにとんでしまうようです 私の説明が悪く、申し訳ございません 名前定義、覚えておきます! ありがとうございました!
>ichinoseさん するっと完了いたしました ありがとうございました!
>βさん すんごいわかりやすい説明ありがとうございます! 今までユーザーフォームにつっこんだこともあるんですが、ほぼ確定しているリスト時々イレギュラ…な入力用のものだったので、ListFillRangeを更新することがなかったんです なんとなくぼんやりと【エクセル一家】外だという認識だったので、言うこときいてくれなくて半泣きでした とっても勉強になりました!
午前にできあがった前段階のものと合わせてブラッシュアップしていきます ありがとうございました!!
(さいき) 2015/06/01(月) 17:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.