Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
イベントでドロップダウンリストの新・旧の値を取得したい
投稿日時: 21/09/09 18:43:10
投稿者: Asakazu6950

よろしくお願いいたします。
サンプルコードを掲載いたします。
 
通常の入力等では問題ないが、ドロップダウンリストからの選択では、
Worksheet_SelectionChangeのイベントが動かず、対応策が見えません。
 
よろしくお願いいたします。
 
Private Oval as Variant
  
Private Sub Worksheet_Change(ByVal Target As Range)
    
    '値が変更されたら処理を行う
    If target.value <> Oval Then
    
        '処理
        
    End f
 
End Sub
 
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
    Oval = Target.Value
 
End Sub

回答
投稿日時: 21/09/09 21:48:26
投稿者: コレ

引用:
Private Sub Worksheet_Change(ByVal Target As Range)

 
これは、ワークシートを変更したときに実行されるシートイベントになります。
ドロップダウンリストを選択したときに動くイベントではありません。
 
おしゃられてる、ドロップダウンリストとは、
フォームコントロールのComboBoxでしょうか?
ActiveXのComboBoxをでしょうか?
お使いのコントロールによって扱いが違います。
 
WEBで検索すれば使い方は出てきますよ。
 
 

回答
投稿日時: 21/09/09 22:49:29
投稿者: simple

入力規則利用によるドロップダウンリストでしょうか。
 
こうしてみては?

Option Explicit
Private Oval As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
    '値が変更されたら処理を行う
    If Target.Value <> Oval Then
        MsgBox "新は " & Target.Value & vbLf & "旧は " & Oval
        Oval = Target.Value
    End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Oval = Target.Value
End Sub

回答
投稿日時: 21/09/09 23:37:49
投稿者: WinArrow
投稿者のウェブサイトに移動

>Worksheet_SelectionChangeのイベントが動かず、
このイベントは、セルを選択したときに、動作するプロシジャです。
既にカーソルが当該セルにある時には、▼ボタンが表示されています。
この状態で、▼ボタンをクリックしても、イベントは発生しません。

回答
投稿日時: 21/09/10 09:30:44
投稿者: simple

Changeイベントプロシージャで
Targetの範囲を限定した方がいいでしょうね、
端折りましたが。

回答
投稿日時: 21/09/10 17:01:11
投稿者: WinArrow
投稿者のウェブサイトに移動

>Worksheet_SelectionChangeのイベントが動かず
 
この状況をどのように確認しましたか?
 
若し、ステップ実行以外で確認した・・ということならば、
ステップ実行をお勧めします。

回答
投稿日時: 21/09/12 09:53:33
投稿者: simple

あらためて提案コードを書いておきます。

Option Explicit
Private Oval As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    '入力規則がセットされているB1以外では脱出(■B1セルは実態に応じて要修正)
    If Target.Address <> "$B$1" Then Exit Sub
    
    ''' MsgBox "chenged!" '確認用(同一選択肢を選択してエンタ−したときにもchangeは発火します)
    '値が変更されたら処理を行う
    If Target.Value <> Oval Then
        MsgBox "新は " & Target.Value & vbLf & "旧は " & Oval
        Oval = Target.Value
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Oval = Target.Value
End Sub

せっかく質問されたのですから、理解された点、まだ不明の点、
提案コードの評価など、なんらかの反応をしていただきたいですね。
 
既に皆さんからコメントいただいていることと重複しますが、コメントしておきます。
(1)ChangeSelectionの発火(起動)要件
   ・このイベントプロシージャは、「セルの選択状態が変わったとき」に動作します。
     ドロップダウンを操作するためにはセルを選択する必要がありますから、
     他のセルからそこに移った時点で、イベントプロシージャが実行されます。
   ・一方、同一セルで、別の候補を選択したときには、別に選択セルは変化しませんから
     イベントプロシージャは実行されません。
   →まずは、この点の理解が重要でしょう。
 
(2)(参考までに)Changeイベントプロシージャについても補足しておきます。
   ・そのセルに入力し、その値を変更しようとしたときに、イベントプロシージャが実行されます。
     注意すべきは、これは「セルの内容が実際に別のものに変化したかを要件としていない」ことです。
     これは、同一のものを入力しても、イベントプロシージャが動作することで確認できます。
   ・手作業の入力や消去だけでなく、マクロからセルの値を変更したときにも動作します。
 
(3)提示したコードを動作させてみてください。
   細かい点の修正が必要かもしれません。
   (たとえば、最初に入力規則セルを選択したときには、
     新旧の値を表示することはしていません。(ニーズが不明だったので))
   少なくとも、選択肢を変更したときには、確実に新旧の値が表示されるはずです。
   確認していただいて、なんらかの返事をして頂きたく思います。

回答
投稿日時: 21/09/13 12:01:00
投稿者: simple

説明のタイトル部分ですが、
× ChangeSelection
○ SelectionChange
です。失礼しました。

トピックに返信