Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10710 / 13646 ツリー ←次へ | 前へ→

【18982】リストボックスのプロパティ mickeypapa 04/10/18(月) 21:33 質問[未読]
【18983】Re:リストボックスのプロパティ ISK 04/10/18(月) 22:27 回答[未読]
【18984】Re:リストボックスのプロパティ mickeypapa 04/10/18(月) 23:17 お礼[未読]
【18986】Re:リストボックスのプロパティ Kobasan 04/10/19(火) 0:27 回答[未読]
【19032】Re:リストボックスのプロパティ mickeypapa 04/10/19(火) 22:13 お礼[未読]
【20303】Re:リストボックスのプロパティ mickeypapa 04/12/4(土) 18:25 質問[未読]
【20306】Re:リストボックスのプロパティ [名前なし] 04/12/4(土) 20:40 回答[未読]
【20307】Re:リストボックスのプロパティ mickeypapa 04/12/4(土) 21:56 お礼[未読]
【20308】Re:リストボックスのプロパティ kobasan 04/12/4(土) 23:03 回答[未読]
【20316】Re:リストボックスのプロパティ mickeypapa 04/12/5(日) 8:58 お礼[未読]
【20317】Re:リストボックスのプロパティ kobasan 04/12/5(日) 12:34 発言[未読]
【20322】Re:リストボックスのプロパティ mickeypapa 04/12/5(日) 14:42 お礼[未読]
【18990】Re:リストボックスのプロパティ Jaka 04/10/19(火) 9:28 回答[未読]
【19030】Re:リストボックスのプロパティ mickeypapa 04/10/19(火) 21:16 お礼[未読]

【18982】リストボックスのプロパティ
質問  mickeypapa WEB  - 04/10/18(月) 21:33 -

引用なし
パスワード
   マルチページ8枚にそれぞれリストボックスを配しています。
それぞれのリストボックスにはシートから配列でデータを
セットして、ColumnWidth のプロパティで40;0;0;20のようにして
必要な項目を表示しています。このときに
With ListBox1
   .List = myAr
   .ListIndex = 0
End With

With ListBox2
   .List = myAr
   .ListIndex = 0
End With

リストボックスの名前が違うだけで、同じ内容を
繰り返しているのを簡略なコードに出来ないものでしょうか?

【18983】Re:リストボックスのプロパティ
回答  ISK  - 04/10/18(月) 22:27 -

引用なし
パスワード
   ▼mickeypapa さん:
>マルチページ8枚にそれぞれリストボックスを配しています。
>それぞれのリストボックスにはシートから配列でデータを
>セットして、ColumnWidth のプロパティで40;0;0;20のようにして
>必要な項目を表示しています。このときに
>With ListBox1
>   .List = myAr
>   .ListIndex = 0
>End With
>
>With ListBox2
>   .List = myAr
>   .ListIndex = 0
>End With
>
>リストボックスの名前が違うだけで、同じ内容を
>繰り返しているのを簡略なコードに出来ないものでしょうか?

もしListBoxの番号が1 から8まで連続しているのなら

For i = 1 to 8
  Controls("Listbox" & i).List = myAr
  Controls("Listbox" & i).ListIndex = 0
Next

で試してみてください。

【18984】Re:リストボックスのプロパティ
お礼  mickeypapa WEB  - 04/10/18(月) 23:17 -

引用なし
パスワード
   ▼ISK さん:
>もしListBoxの番号が1 から8まで連続しているのなら
>
>For i = 1 to 8
>  Controls("Listbox" & i).List = myAr
>  Controls("Listbox" & i).ListIndex = 0
>Next
>
>で試してみてください。
有り難うございます。もし連続した名前でないときには
このようにに簡潔には出来ないのでしょうか?

【18986】Re:リストボックスのプロパティ
回答  Kobasan  - 04/10/19(火) 0:27 -

引用なし
パスワード
   >有り難うございます。もし連続した名前でないときには
>このようにに簡潔には出来ないのでしょうか?
1つは、Collection を使った場合
Private colListBox As New Collection

Private Sub UserForm_Initialize()
  '↓定義の際に[ New ]を付けない場合は必要
  ' Set colListBox = New Collection
  With colListBox
    .Add ListBox1
    .Add ListBox2
    .Add ListBox3
  End With
  '
  For i = 1 To 3
    colListBox(i).List = Array(1, 2, 3, 4) 'MyArray
    colListBox(i).ListIndex = 0
  Next
End Sub

'------------------------------------
2つ目はListBox を配列宣言した場合
'[ Collection ]の代わりに、ListBox を配列宣言してもできます。
'この場合は、[Add ]ではなく、[Set ]ステートメントで代入を行ないます。
Private CtrlListBox(1 To 7) As MsForms.ListBox

Private Sub UserForm_Initialize()
  Set CtrlListBox(1) = ListBox1
  Set CtrlListBox(2) = ListBox2
  Set CtrlListBox(3) = ListBox3
  '
  For i = 1 To 3
    CtrlListBox(i).List = Array(1, 2, 3, 4) 'MyArray
    CtrlListBox(i).ListIndex = 0
  Next
End Sub
試してみて下さい

【18990】Re:リストボックスのプロパティ
回答  Jaka  - 04/10/19(火) 9:28 -

引用なし
パスワード
   リストボックスの名前がLBA〜LBHとして、

Dim LBX As Valiant,LBT AS Valiant

LBX = Array("LBA", "LBB", "LBC", "LBD", "LBE", "LBF", "LBG", "LBH")
For Each LBT In LBX
  Controls(LBT).List = myAr
  Controls(LBT).ListIndex = 0
Next
Erase LBX, myAr

【19030】Re:リストボックスのプロパティ
お礼  mickeypapa WEB  - 04/10/19(火) 21:16 -

引用なし
パスワード
   答えをいただき有り難うございます。
Arrayを使って配列指定で、プロパティを設定するのですね。
大変勉強になりました。有り難うございました。

【19032】Re:リストボックスのプロパティ
お礼  mickeypapa WEB  - 04/10/19(火) 22:13 -

引用なし
パスワード
   ▼Kobasan さん:
詳しい説明有り難うございます。
おかげでコードもすっきりしてきました。
また行き詰まりましたら宜しくお願い致します。

【20303】Re:リストボックスのプロパティ
質問  mickeypapa WEB  - 04/12/4(土) 18:25 -

引用なし
パスワード
   ▼Kobasan さん:
大変申し訳ありませんが、またリストボックスで悩んでおります。
前回は、リストボックスにセットする配列が、一つだったのですが、
今回は、それぞれのリストボックスにそれぞれの配列をセットしたいのですが、

Private Sub UserForm_Initialize() '品名一覧
  Dim myAr1 As Variant
  Dim myAr2 As Variant
  Dim myAr3 As Variant
  Dim myAr4 As Variant
  Dim myAr5 As Variant
  Dim myAr6 As Variant
  Dim myAr7 As Variant
  Dim myAr8 As Variant
  Dim myAr9 As Variant
  Dim myAr10 As Variant
  Dim myAr11 As Variant
   
  myAr1 = Worksheets("U1").Range("A50:A68").Value '配列を指定
  myAr2 = Worksheets("U1").Range("B50:B57").Value
  myAr3 = Worksheets("U1").Range("C50:C63").Value
  myAr4 = Worksheets("U1").Range("D50:D64").Value
  myAr5 = Worksheets("U1").Range("E50:E66").Value
  myAr6 = Worksheets("U1").Range("A70:A83").Value
  myAr7 = Worksheets("U1").Range("B70:B77").Value
  myAr8 = Worksheets("U1").Range("C70:C81").Value
  myAr9 = Worksheets("U1").Range("D70:D77").Value
  myAr10 = Worksheets("U1").Range("E70:E76").Value
  myAr11 = Worksheets("U1").Range("F70:F79").Value
  
  For i = 1 To 11
    Controls("ListBox" & i).List = myAr ←この部分をどのように?
    Controls("ListBox" & i).ListIndex = 0
  Next
それとも他の書き方をしたほうがいいのでしょうか?

また、
Option Explicit
Dim i   As Long
Dim myStr As String

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
 
  With ListBox1
    For i = 0 To .ListCount - 1
      If .Selected(i) Then
        myStr = myStr & .List(i, 0)
      End If
    Next
  End With
  品名書込
End Sub

Private Sub ListBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
  With ListBox1
    For i = 0 To .ListCount - 1
      If .Selected(i) Then
        myStr = myStr & .List(i, 0)
      End If
    Next
  End With
  品名書込
End Sub
このように同じ様なコードを11回書いていますが、これらをまとめるような
書き方はあるのでしょうか?
お忙しいところ申し訳ありませんが、ご教示宜しくお願い致します。

【20306】Re:リストボックスのプロパティ
回答  [名前なし]  - 04/12/4(土) 20:40 -

引用なし
パスワード
   こうかな?

Private Sub UserForm_Initialize()
Dim MyAr, ListRange, i

  MyAr = Array("A50:A68", "B50:B57", "C50:C63", "D50:D64", "E50:E66", _
  "A70:A83", "B70:B77", "C70:C81", "D70:D77", "E70:E76", "F70:F79")

  For i = 0 To UBound(MyAr)
    ListRange = Worksheets("U1").Range(MyAr(i)).Value
    Controls("ListBox" & i + 1).List = ListRange
    Controls("ListBox" & i + 1).ListIndex = 0
  Next

End Sub

【20307】Re:リストボックスのプロパティ
お礼  mickeypapa WEB  - 04/12/4(土) 21:56 -

引用なし
パスワード
   ▼[名前なし] さん:
お忙しいところ早速のお返事、有り難うございます。
おかげですっきりとしたコードになり、ユーザーフォームの
動作も速くなりました。有り難うございました。
じっくりとコードを勉強させていただきます。

【20308】Re:リストボックスのプロパティ
回答  kobasan  - 04/12/4(土) 23:03 -

引用なし
パスワード
   >このように同じ様なコードを11回書いていますが、これらをまとめるような
>書き方はあるのでしょうか?

mickeypapa さん 今晩は
クラスモジュールを使ってみました。試してみて下さい。
クラスモジュールはまだ勉強中ですので、参考程度にして下さい。
★★ Class1 クラスモジュール
Private WithEvents MyCtrl As MSForms.ListBox
Private MyIndex As Long
Private MyCaller As Object

Public Property Let Item(NewCtrl As MSForms.ListBox)
  Set MyCtrl = NewCtrl
End Property

Public Property Let Index(NewIndex As Long)
  MyIndex = NewIndex
End Property

Public Property Let Caller(NewCaller As Object)
   Set MyCaller = NewCaller
End Property

Private Sub MyCtrl_Click()
Dim i   As Long
Dim myStr As String

  With MyCtrl
    For i = 0 To .ListCount - 1
      If .Selected(i) Then myStr = myStr & .List(i, 0)
    Next
  End With
  品名書込
End Sub

★★フォームモジュール
Private lstbbox(1 To 11) As New Class1

Private Sub UserForm_Initialize()
Dim i As Long
  ''' ↓Newを付けずに定義した時に必要
  '''Set lstbbox = New Class1
  For i = 1 To 11
    With lstbbox(i)
      .Item = Me.Controls("ListBox" & i)
      .Index = i
      .Caller = Me
    End With
  Next i
End Sub

Private Sub UserFom_Terminate()
  Erase lstbbox
End Sub

【20316】Re:リストボックスのプロパティ
お礼  mickeypapa WEB  - 04/12/5(日) 8:58 -

引用なし
パスワード
   ▼kobasan さん:
大変有り難うございます。

Class1 クラスモジュールの
Private Sub MyCtrl_Click()
Dim i   As Long
Dim myStr As String

  With MyCtrl
    For i = 0 To .ListCount - 1
      If .Selected(i) Then myStr = myStr & .List(i, 0)
    Next
  End With
  品名書込
End Sub

Private Sub MyCtrl_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Private Sub MyCtrl_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
にそれぞれ書き換え
"品名書込"は、Module1,Class1に書いても呼び出すことが出来なかったので、
  With frm品名
    If .txtH1 = Empty Then
      .txtH1.Value = myStr
    ElseIf .txtH2 = Empty Then
      .txtH2.Value = myStr
    ElseIf .txtH3 = Empty Then
      .txtH3.Value = myStr
      .cmdEnd.SetFocus
    End If
  End With
以上のコードを直接、"品名書込"のところに書き込んで、
思い通りの動作になりました。
お忙しいところ大変有り難うございました。

【20317】Re:リストボックスのプロパティ
発言  kobasan  - 04/12/5(日) 12:34 -

引用なし
パスワード
   >"品名書込"は、Module1,Class1に書いても呼び出すことが出来なかったので

mickeypapaさん 今日は。

クラスモジュールをRaiseイベント処理に対応させたものです。
これでユーザフォーム内でも、標準モジュール内でも、"品名書込"のコードをつくることができます。
若干のコード修正が必要かもしれません。

★★ Class1 クラスモジュールのコード
Private WithEvents MyCtrl As MSForms.ListBox
Private MyIndex As Long
Private MyCaller As Object

Public Property Let Item(NewCtrl As MSForms.ListBox)
  Set MyCtrl = NewCtrl
End Property

Public Property Let Index(NewIndex As Long)
  MyIndex = NewIndex
End Property

Public Property Let Caller(NewCaller As Object)
  Set MyCaller = NewCaller
End Property

Private Sub MyCtrl_Click()
  'マウスのワンクリック用。有効にするときは、下の ' を消して下さい。
  'Call MyCaller.lstBoxRaiseClick(MyIndex, MyCtrl)
End Sub

Private Sub MyCtrl_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  'マウスのダブルクリック用
  Call MyCaller.lstBoxRaiseClick(MyIndex, MyCtrl)
End Sub

Private Sub MyCtrl_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  'キー入力用
  Call MyCaller.lstBoxRaiseClick(MyIndex, MyCtrl)
End Sub

★★フォームモジュールのコード
Private lstbbox(1 To 11) As New Class1

Private Sub UserForm_Initialize()
Dim i As Long
  ''' ↓Newを付けずに定義した時に必要
  '''Set lstbbox = New Class1
  For i = 1 To 11
    With lstbbox(i)
      .Item = Me.Controls("ListBox" & i)
      .Index = i
      .Caller = Me
    End With
  Next i
End Sub

Private Sub UserFom_Terminate()
  Erase lstbbox
End Sub

Public Sub lstBoxRaiseClick(ByVal Idx As Long, Ctrl As MSForms.ListBox)
Dim i   As Long
Dim myStr As String
  With Ctrl
    For i = 0 To .ListCount - 1
      If .Selected(i) Then myStr = myStr & .List(i, 0)
    Next
  End With
  '品名書込
  MsgBox myStr & " = " & Ctrl.Value  '品名書込のコードに置き換えて下さい。
  '品名書込のコードは少し修正が必要かもしれません。
End Sub

【20322】Re:リストボックスのプロパティ
お礼  mickeypapa WEB  - 04/12/5(日) 14:42 -

引用なし
パスワード
   ▼kobasan さん:
有り難うございます。
"Raise"というのは初めて聞く言葉なので、
ヘルプで調べてみました。
なかなか難しそうで、今後の勉強にさせていただきます。
何度も返信有り難うございました。今後も宜しくお願い致します。

10710 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free