Excel (VBA)

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

 
(Windows 10全般 : Excel 2016)
ListBoxで作業完了後、最上段の項目(注意書)を選択させたい
投稿日時: 20/05/23 15:17:07
投稿者: taichi

ListBoxのListIndex=0 には"注意書き"でListIndex>=1 の時に作業させています。
その作業が終わった後は、ListIndex=0 を選択した状態に戻すコードがわかりません。
(ListIndex=0 の時は作業をしません)
作業完了後  ListBox1.Selected(0) = True と入れてみましたが、
ダメでした。
 
よろしくお願いいたします。

回答
投稿日時: 20/05/23 19:18:06
投稿者: MMYS

taichi さんの引用:

作業完了後  ListBox1.Selected(0) = True と入れてみましたが、
ダメでした。

どのようにダメなのでしょうか。
当方では問題なく選択されます。
リストの選択は下記で出来ます。
 
Me.ListBox1.ListIndex = 0
または
ListBox1.Selected(0) = True
 

投稿日時: 20/05/23 19:42:24
投稿者: taichi

例えば[B5]にListの2番目(Listindex=1)の値を代入後、[C10]に同じ値を代入しようとしても
無理なようなので、一度Listindex=0に戻したいのですが、
 
単純なコードです
Private Sub ListBox1_Click()
    If ListBox1.ListIndex >= 1 Then
      ActiveCell.Value = ListBox1.Value '<--単純な作業
      ListBox1.ListIndex = 0 '<-- ア)
    End If
End Sub
 
ア)を記述してもListindex=0が選択した状態にならないのです。

回答
投稿日時: 20/05/23 21:10:15
投稿者: WinArrow
投稿者のウェブサイトに移動

>ListBox1_Click
イベントではなく
ListBox1_Change
イベントを使ってみましょう

投稿日時: 20/05/24 12:13:16
投稿者: taichi

Private Sub UserForm_Initialize()
   Dim n As Integer
  For n = 0 To 10
    ListBox1.AddItem n
  Next
  ListBox1.ListIndex = 0
End Sub
 
Private Sub ListBox1_Change()
  If ListBox1.ListIndex = 0 Then Exit Sub
   
  MsgBox ListBox1.ListIndex
  ListBox1.ListIndex = 0
End Sub
で試してみましたが、ダメでした。
※ MsgBox が2回表示されますがこれも気になります。

回答
投稿日時: 20/05/24 13:44:12
投稿者: WinArrow
投稿者のウェブサイトに移動

>で試してみましたが、ダメでした。
 
ダメ・・・どのようにダメなのかがわかりません。
 
「ダメ」ではなく
意図する結果と実行結果を説明してください。
 
Listindex = 0は、注意書きを表示・・・tってことは1行目ですよね?
使い方に違和感がありますが、
もっとシンプルに考えては?
 

回答
投稿日時: 20/05/24 14:57:40
投稿者: WinArrow
投稿者のウェブサイトに移動

注意書きは、
ControlTipText
にセットして
ListIndex=0も使えるようにしたら、いかがでしょうか?

回答
投稿日時: 20/05/24 16:01:04
投稿者: WinArrow
投稿者のウェブサイトに移動

代案です。
 
Listbox1のイベントでは処理せずに
コマンドボタンを用意して
 
↓参考例
Private Sub CommandButton1_Click()
    With Me.ListBox1
        If .ListIndex < 0 Then Exit Sub
        If .ListIndex <> 0 Then
            ActiveSheet.Range("A2").Value = .Value
        End If
    End With
    Me.ListBox1.ListIndex = 0
End Sub

回答
投稿日時: 20/05/24 16:19:08
投稿者: takesi

シートとにActiveXコントロール のリストボックス配置の場合
 

Sub set0()
ListBox1.Clear
ListBox1.AddItem "a"
ListBox1.AddItem "b"
ListBox1.AddItem "c"
ListBox1.AddItem "d"
ListBox1.LinkedCell = "A2"
Range("A1").Activate
End Sub

Private Sub ListBox1_Click()
MsgBox "stop"
  If ListBox1.ListIndex >= 1 Then
      ActiveCell.Value = ListBox1.Value  '<--単純な作業
     ' ListBox1.ListIndex = 0  '<-- ア)
      ListBox1.Selected(0) = True    
  End If
End Sub

とした時に
 
アイテム”d”をクリックした時
4回ループしているのがわかる
A1セルは”d”になるが
A2セルは ”d”、”a”、”d”、”a”と変化する。。。。なぜ?
リストボックスのアイテムは”d”が選択されたままです。
[/code]

回答
投稿日時: 20/05/24 17:28:18
投稿者: MMYS

自身のイベントで自身の値を変更はおすすめ出来ません。
下記のコードで
  Debug.Print Timer
が何回実行されているか確認願います。
 

Private Sub UserForm_Initialize()
  Dim n As Integer
  For n = 0 To 10
    ListBox1.AddItem n
  Next
  ListBox1.ListIndex = 0
End Sub

Private Sub ListBox1_Change()
  Debug.Print Timer
  ListBox1.ListIndex = 0
End Sub

 
takesi さんの引用:

リストボックスのアイテムは”d”が選択されたままです。

正確には先頭が選択されています。
下記のコードで確認出来ます。
 
 
つまり、画面が変化してないのでしょう。
 
Private Sub CommandButton1_Click()
    MsgBox ListBox1.ListIndex
End Sub

 
 
一応、動かずだけなら、下記のようにすれば動作はしますが・・・
 
ユーザーフォーム
Private Sub ListBox1_Change()
  If ListBox1.ListIndex >= 1 Then
    ActiveCell.Value = ListBox1.Value  '<--単純な作業
    Application.OnTime Now, "SetListIndex"
  End If
End Sub

標準モジュール
Sub SetListIndex()
  UserForm1.ListBox1.ListIndex = 0
End Sub

 
 
 

投稿日時: 20/05/24 20:10:13
投稿者: taichi

■ WinArrow さん
※ 具体的内容
Initialize後は意図通り、値 a が選択された状態(何もしない)
3を選択るすると0 と03 が選択されたMsgboxが2度開き(表示4)
Msgboxの2度目のclick後、3のみが表示された状態のままで、
0が選択された状態になりません。
 
>Listbox1のイベントでは処理せずにコマンドボタンを用意して
こちらの意図通りに動きました。
 
>Listindex = 0は、注意書きを表示・・・tってことは1行目ですよね?
>使い方に違和感
目的はあるセルにListから選択入力た後、別にセルに入力する際、直前と同じ
値を入力したい場合は同じItemをクリックしても反応してくれないので、
一度別のItemを選択させておく必要がでてきたのでListindex = 0 では
何もしないようにと考えました。
 
■ MMYS さん
 試しました。 全部で5回記録されていました。
MsgBox が2回表示されたのでおかしいと思いました。
>自身のイベントで自身の値を変更はおすすめ出来ません。
結局、このコードがまずいのですね。
   If ListBox1.ListIndex >= 1 Then
 
    End If
で回避できとた思いました。
CommandButton1 で ListBox1.ListIndex = 0 に変更します。
こちらの意図通りに動きました。
 
■  takesi さん
>リストボックスのアイテムは”d”が選択されたままです。
ここが何故か分かりませんが、MMYS さんのいうように
自身のイベントで自身の値を変更せせているのが原因しているのではないかと
感じます。結局、別途コマンドボタンから ListBox1.ListIndex = 0 に
するようにしました。→旨くいっています。

投稿日時: 20/05/27 07:03:27
投稿者: taichi

MMYS さん WinArrow さん takesi さん
ありがとうございました。
 
>自身のイベントで自身の値を変更はおすすめ出来ません。
に従い 別途 CommandButton1 から変更することにより
一応解決いたしました。