こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ユーザーフォームのチェックボックスIndex

Excel 2002を使用しています

ユーザーフォームのVBAを教えてください
ユーザーフォームにチェックボックスをつけたリストを表示しました
.ListStyle = fmListStyleOption

リストボックスは5列ですが
チェックしたリストボックスの1列の値は
ListBox1.List(ListBox1.ListIndex)でとりだせましたが
2列目以降の他の列の値はどうとりだせばいいのでしょうか?

また、リストボックスを選択するとチェックボックスにチェックが入り文字が反転され
もう一度チェックするとチェックボックスのチェックが外れますが
チェックボックスにチェックが入っている状態かどうかを判別する方法を教えてください
チェックボックスのIndexも取得したいのですが。

投稿日時 - 2011-11-25 11:11:10

QNo.7153553

すぐに回答ほしいです

質問者が選んだベストアンサー

> ListBox1.List(ListBox1.ListIndex)でとりだせましたが
> 2列目以降の他の列の値はどうとりだせばいいのでしょうか?

ListBox1.List(ListBox1.ListIndex,1) ⇒ 2列目
ListBox1.List(ListBox1.ListIndex,2) ⇒ 3列目

.Listの値は 0 から始まっています。

> チェックボックスにチェックが入っている状態かどうかを判別する方法を教えてください
For ~ Nextで、全ての行に対して「チェックが入っているか?」を聞きます。
Trueならチェックが入っている。Falseならチェックが入っていません。
  Dim intIDX As Integer
  For intIDX = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(intIDX) Then
      Msgbox "チェックが入っています"
    Else
      Msgbox "チェックが入っていません"
    Endif
  Next

投稿日時 - 2011-11-25 12:51:03

お礼

imogasi さんの回答も参考にしながら無事思い通りのVBA
  作成することができました。ありがとうございました

'【チェックされた選択か否かの判定】
F = ListBox1.ListIndex

If Me.ListBox1.Selected(F) = True Then '【チェックされた選択か否かの判定】

.................

Else

.................

End If

'【チェックされたオーダーの選出】
Dim j As Integer

With Worksheets("check2")
j = 1
For i = 0 To ListBox1.ListCount - 1

If ListBox1.Selected(i) = True Then

lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1

Worksheets("check2").Cells(j, 12).Value = ListBox1.List(i)

j = j + 1

End If

Next i

End With

投稿日時 - 2011-11-28 11:50:10

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

エクセルVBAでUserForm1にListbox1をはり付ける。
(但し4列の例に短縮簡略化した)
Private Sub UserForm_Initialize()
Dim myData(3, 2) As Variant
UserForm1.Caption = "商品名の入力"
myData(0, 0) = 1001
myData(0, 1) = 1002
myData(0, 2) = 1003
myData(1, 0) = "りんご"
myData(1, 1) = "みかん"
myData(1, 2) = "バナナ"
myData(2, 0) = 100
myData(2, 1) = 150
myData(2, 2) = 200
myData(3, 0) = "aa"
myData(3, 1) = "bb"
myData(3, 2) = "cc"
With UserForm1.ListBox1
.ColumnCount = 4
.ColumnWidths = "50;50;50;50"
.Column() = myData
. .ListStyle = fmListStyleOption

End With
End Sub
Lstbox1のクリックイベントに
Private Sub ListBox1_Click()
MsgBox ListBox1.List(ListBox1.ListIndex, 0)
MsgBox ListBox1.List(ListBox1.ListIndex, 1)
MsgBox ListBox1.List(ListBox1.ListIndex, 2)
MsgBox ListBox1.List(ListBox1.ListIndex, 3)
End Sub
で、選択してクリックするtp、その行の各列の値が表示されるので、とらえることが出来ることがw駆るだろう。
ーー
表示スタイルにfmListStyleOptionを設定した場合
MultiSelect = fmMultiSelectMultiの場合はチェックボックスが表示される。
MultiSelect = fmMultiSelectSingleの場合はオプションボタンが表示される。
選択した行は、UserForm1にコマンドボタンを貼り付け、そのクリックイベントで
Private Sub CommandButton1_Click()
Dim lastRow As Long
Dim i As Integer, j As Integer
With Worksheets("Sheet1")
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
For j = 1 To 4
.Cells(lastRow, j).Value = ListBox1.List(i, j - 1)
Next j
ListBox1.Selected(i) = False
End If
Next i
End With
End Sub
でとらえて、シートに書き出せる。
.Listbox1のプロパティをMultiSelect = fmMultiSelectMulti にすると選択した行数だけSheet1に書き出される。

投稿日時 - 2011-11-25 20:53:48

お礼

Cor_moriyan さんの回答と合作して無事思い通りのVBA
  作成することができました。ありがとうございました

'【チェックされた選択か否かの判定】
F = ListBox1.ListIndex

If Me.ListBox1.Selected(F) = True Then '【チェックされた選択か否かの判定】

.................

Else

.................

End If

'【チェックされたオーダーの選出】
Dim j As Integer

With Worksheets("check2")
j = 1
For i = 0 To ListBox1.ListCount - 1

If ListBox1.Selected(i) = True Then

lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1

Worksheets("check2").Cells(j, 12).Value = ListBox1.List(i)

j = j + 1

End If

Next i

End With

投稿日時 - 2011-11-28 11:53:00

あなたにオススメの質問