Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
Userformの ListBoxで選択状態が解除出来ない
投稿日時: 21/11/22 13:29:04
投稿者: taichi

事前に選択した値を、連続して別のセルでも同じ値を入力する場合、選択状態が
解除されていないと無理みたいなので、選択状態を解除するのに
.ListIndex = -1 を記述してみたのですが、解除されません。
よろしくお願いいたします。
 
Private Sub ListBox1_Click()
    If Intersect(ActiveCell, 希望範囲) Is Nothing Then
      MsgBox "無効なセルです。"
    Else
        ActiveCell.Value = ListBox1.Value
    End If
     
    ListBox1.ListIndex = -1
 
End Sub

回答
投稿日時: 21/11/22 15:11:47
投稿者: X-PIE

>.ListIndex = -1 を記述してみたのですが、解除されません。
 
これについては私も分かりませんでした。済みません。
 
>事前に選択した値を、連続して別のセルでも同じ値を入力する場合、
 
1.セル範囲を選択
2.リストボックスで値を選択
3.→選択したセル範囲と希望範囲の重複部分に、選択した値を出力
これを繰り返すという意味でしょうか。
 
>選択状態が解除されていないと無理
 
とはどういう意味でしょうか。
何をしたときに、どうなって欲しいのに、どうなってしまう、
を教えていただけないでしょうか。

回答
投稿日時: 21/11/22 15:20:21
投稿者: Suzu

引用:

    ListBox1.ListIndex = -1

 
これで 選択解除ができるのは、
LISTBOX の 複数選択(MultiSelect) が Single の時だけです。
 
それ以外の時には、
Selectedプロパティー
https://docs.microsoft.com/ja-jp/office/vba/api/outlook.listbox.selected
に False を渡す必要があります。
 
For i = 0 To ListBox1.ListCount - 1
  If ListBox1.Selected(i) Then
    ListBox1.Selected(i) = False
  End If
Next i

回答
投稿日時: 21/11/22 15:22:17
投稿者: simple

VBA ListBox 全解除
で検索してみました。
https://infoment.hatenablog.com/entry/2018/12/19/221305
が参考になりませんか?

投稿日時: 21/11/22 16:26:30
投稿者: taichi

X-PIEさんヘ追加説明です。
例えばListBoxの一番上の値をあるセルに入力後、別のセルにもそれと同じ値を
入力する必要に気が付き同じ値を入力しようと思っても、選択状態が解除(青色から白色に)
されていなければ入力されません。別の値なら入力可能ですが…
 
Suzu , simple さんヘ
MultiSelectは 0-fmMultiSelectSingle になっています。
 
選択した項目のListIndex はList項目選択時に取得できますので、
Private Sub ListBox1_Click()
  Dim i As Integer
  i = ListBox1.ListIndex
     
    If Intersect(ActiveCell, 希望範囲) Is Nothing Then
      MsgBox "無効なセルです。"
    Else
        ActiveCell.Value = ListBox1.Value
    End If
  
   ListBox1.Selected(i) = False
End Sub
で試してみたのですが相変わらず選択状態が解除されません。

回答
投稿日時: 21/11/22 17:10:12
投稿者: Suzu

イベント を見落としていました。
 
イベントに問題があります。
クリックイベントで、ダブルクリックイベントにしましょう。

回答
投稿日時: 21/11/22 17:10:59
投稿者: sk

・Click イベントではなく、MouseUp イベントや KeyUp イベントの発生時に
 アクティブセルへの値の代入を実行する。
 ( MouseUp イベントでの処理については、リストボックス全体の高さが
 リスト行の領域の高さよりも大きい場合の対策が要るでしょうけど)
 
・リストボックスの Click イベントではなく、同じフォーム内の
 コマンドボタンの Click イベントの発生時に
 アクティブセルへの値の代入を実行する。
 
以上のいずれかでよいのではないでしょうか。

投稿日時: 21/11/22 17:29:24
投稿者: taichi

【自己解決】
 X-PIE、Suzu、simpleさん 回答ありがとうございました。
 
https://www.excel.studio-kazu.jp/kw/20170617153401.html
で Application.OnTime というのを見つけました。
コードを
Private Sub ListBox1_Click()
  Dim i As Integer
  i = ListBox1.ListIndex
     
    If Intersect(ActiveCell, 希望範囲) Is Nothing Then
      MsgBox "無効なセルです。"
    Else
      ActiveCell.Value = ListBox1.Value
    End If
    Application.OnTime Now(), "選択解除"
End Sub
 
 Sub 選択解除() 'これは標準モジュール
    UserForm1.ListBox1.ListIndex = -1
 End Sub
 
でやっと目的が達成されましたが、何故 ListBox1.ListIndex = -1 では
ダメなんですか不思議でならないです。