Excel VBA質問箱 IV

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

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


6300 / 13644 ツリー ←次へ | 前へ→

【46016】ユーザーフォーム上のラベル番号を自動取得出来ますか? koba 07/1/21(日) 13:15 質問[未読]
【46018】Re:ユーザーフォーム上のラベル番号を自動... かみちゃん 07/1/21(日) 13:19 発言[未読]
【46020】Re:ユーザーフォーム上のラベル番号を自動... koba 07/1/21(日) 13:28 お礼[未読]
【46024】Re:ユーザーフォーム上のラベル番号を自動... Hirofumi 07/1/21(日) 14:09 回答[未読]
【46025】Re:ユーザーフォーム上のラベル番号を自動... Hirofumi 07/1/21(日) 14:18 回答[未読]
【46026】Re:ユーザーフォーム上のラベル番号を自動... koba 07/1/21(日) 14:24 お礼[未読]
【46040】Re:ユーザーフォーム上のラベル番号を自動... Hirofumi 07/1/21(日) 20:30 回答[未読]
【46062】Re:ユーザーフォーム上のラベル番号を自動... koba 07/1/22(月) 9:23 お礼[未読]

【46016】ユーザーフォーム上のラベル番号を自動取...
質問  koba  - 07/1/21(日) 13:15 -

引用なし
パスワード
   いつもお世話になっています。
初心者ですので質問が的外れかもしれませんがよろしくお願い致します。

ラベルをクリックするたびに、"○"→"△"→"□"と表示を変更したいのですが、
ラベルの数が多いため、
Private Sub Label1_Click()
  If Label1 = "○" Then
    Label1 = "△"
    GoTo 10
  End If
  If Label1 = "△" Then
    Label1 = "×"
    GoTo 10
  End If
  If Label1 = "×" Then
    Label1 = "○"
    GoTo 10
  End If
10
End Sub
のようにコードを組むと行数が多くなってしまいます。
上記の "If" の後を例えば "ThisLabel" のように自動判別する命令はないでしょうか?

また上記のコードをもっとスマートに出来ないでしょうか?

よろしくお願いいたします。

【46018】Re:ユーザーフォーム上のラベル番号を自...
発言  かみちゃん  - 07/1/21(日) 13:19 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>初心者ですので質問が的外れかもしれません

クラス(Class)に記述することでできるらしいのですが、大丈夫ですか?
私もクラス処理は、勉強中なので、わかりません。

【46020】Re:ユーザーフォーム上のラベル番号を自...
お礼  koba  - 07/1/21(日) 13:28 -

引用なし
パスワード
   早速のお返事ありがとうございます。

クラス(Class)ですか?僕は初めて耳にしました。
勉強不足で申し訳ありません。

もし他の方法がありましたら教えてください。

【46024】Re:ユーザーフォーム上のラベル番号を自...
回答  Hirofumi  - 07/1/21(日) 14:09 -

引用なし
パスワード
   1、Classを使わない通常の方法
Labelは1〜3とします

Option Explicit

'設定するLableの個数
Private Const clngNumb As Long = 3

Private vntLetter As Variant

Private Sub UserForm_Initialize()
  
  Dim i As Long

  vntLetter = Array("○", "△", "□")
  
  For i = 1 To clngNumb
    Controls("Lable" & i).Tag = 0
  Next i
  
End Sub

Private Sub Label1_Click()

  Dim lngCount As Long
  
  lngCount = (UBound(vntLetter) + 1)
  With Label1
    .Tag = (.Tag + 1) Mod lngCount
    .Caption = vntLetter(.Tag Mod lngCount)
  End With

End Sub

Private Sub Label2_Click()

  Dim lngCount As Long
  
  lngCount = (UBound(vntLetter) + 1)
  With Label2
    .Tag = (.Tag + 1) Mod lngCount
    .Caption = vntLetter(.Tag Mod lngCount)
  End With

End Sub

Private Sub Label3_Click()

  Dim lngCount As Long
  
  lngCount = (UBound(vntLetter) + 1)
  With Label3
    .Tag = (.Tag + 1) Mod lngCount
    .Caption = vntLetter(.Tag Mod lngCount)
  End With

End Sub

2、Classを使った方法

UserFormのコードモジュールに以下を記述

Option Explicit

'設定するLableの個数
Private Const clngNumb As Long = 3

'Groupの値取得クラスの配列
Private clsLable() As Class1

Private Sub UserForm_Initialize()
  
  Dim i As Long
  Dim vntLetter As Variant

  vntLetter = Array("○", "△", "□")
  
  'LableのTagに初期値とClassを設定
  ReDim Preserve clsLable(1 To clngNumb)
  For i = 1 To clngNumb
    Controls("Label" & i).Tag = 0
    Set clsLable(i) = New Class1
    With clsLable(i)
      .Letter = vntLetter
      .LabelCnt = Controls("Label" & i)
    End With
  Next i
  
End Sub

Private Sub UserForm_Terminate()

  Dim i As Long

  For i = 1 To clngNumb
    Set clsLable(i) = Nothing
  Next i

End Sub

「挿入」→「クラスモジュール」でClass1を追加
Class1に以下を記述

Option Explicit

Private WithEvents lblMark As MSForms.Label
Private vntLetter As Variant

Private Sub Class_Terminate()

  Set lblMark = Nothing
  
End Sub

Private Sub lblMark_Click()

  Dim lngCount As Long
  
  lngCount = (UBound(vntLetter) + 1)
  With lblMark
    .Tag = (.Tag + 1) Mod lngCount
    .Caption = vntLetter(.Tag Mod lngCount)
  End With
  
End Sub

Public Property Let Letter(ByVal vntNewValue As Variant)

  vntLetter = vntNewValue
  
End Property

Public Property Let LabelCnt(ByVal lblNewValue As MSForms.Label)

  Set lblMark = lblNewValue
  
End Property

【46025】Re:ユーザーフォーム上のラベル番号を自...
回答  Hirofumi  - 07/1/21(日) 14:18 -

引用なし
パスワード
   ゴメン、1の方のSub UserForm_Initializeで、ラベルのスペルが間違ってた!

  Lable → Label

【46026】Re:ユーザーフォーム上のラベル番号を自...
お礼  koba  - 07/1/21(日) 14:24 -

引用なし
パスワード
   ▼Hirofumi さん:

例文まで細かく教えていただいてありがとうございます。

早速CLASSを使わない方を使わせていただきました。

CLASSの方もメモ帳に残し、勉強をしたいと思います。

今後も解からない事があれば質問させていただきたいと思いますので
その時はまたよろしくお願いいたします。

本当にありがとうございました。

【46040】Re:ユーザーフォーム上のラベル番号を自...
回答  Hirofumi  - 07/1/21(日) 20:30 -

引用なし
パスワード
   もう見て居ないかな?
ゴメン、もっと簡単に成ります?

Option Explicit

'設定するLableの個数
Private Const clngNumb As Long = 3

Private vntLetter As Variant

Private Sub UserForm_Initialize()
  
  Dim i As Long

  vntLetter = Array("○", "△", "□")
  
  For i = 1 To clngNumb
    With Controls("Label" & i)
      .Tag = 0
      .Caption = vntLetter(0)
    End With
  Next i
  
End Sub

Private Sub Label1_Click()

  LabelClicked Label1

End Sub

Private Sub Label2_Click()

  LabelClicked Label2

End Sub

Private Sub Label3_Click()

  LabelClicked Label3

End Sub

Private Sub LabelClicked(lblMark As MSForms.Label)

  Dim lngCount As Long
  
  lngCount = (UBound(vntLetter) + 1)
  With lblMark
    .Tag = (.Tag + 1) Mod lngCount
    .Caption = vntLetter(.Tag Mod lngCount)
  End With

End Sub

【46062】Re:ユーザーフォーム上のラベル番号を自...
お礼  koba  - 07/1/22(月) 9:23 -

引用なし
パスワード
   おはようございますHirofumiさん。

PCを会社に置いてあるのでお礼が遅れて申し訳ありません。

新しいコード拝見しました。
クリックのコードが短くなっていたのですごく助かります。
実はlabelが100以上あるので今回教えていただいたコードを
早速利用させていただきました。

貴重なお時間をいただいた上に大変参考になるコードを教えていただき
ありがとうございました。
僕自身も勉強していきますが、わからない時はまた質問させていただきます。
本当にありがとうございました。

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