Excel VBA質問箱 IV

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

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


1876 / 13645 ツリー ←次へ | 前へ→

【71302】ユーザーフォームのラベルキャプションの表示切替 HoMa 12/2/20(月) 11:36 質問[未読]
【71303】Re:ユーザーフォームのラベルキャプション... ちん 12/2/20(月) 12:39 発言[未読]
【71309】Re:ユーザーフォームのラベルキャプション... HoMa 12/2/21(火) 9:06 質問[未読]
【71304】Re:ユーザーフォームのラベルキャプション... Hirofumi 12/2/20(月) 14:30 発言[未読]
【71310】Re:ユーザーフォームのラベルキャプション... HoMa 12/2/21(火) 9:13 質問[未読]
【71322】Re:ユーザーフォームのラベルキャプション... Hirofumi 12/2/21(火) 12:34 発言[未読]
【71324】Re:ユーザーフォームのラベルキャプション... HoMa 12/2/21(火) 13:27 お礼[未読]
【71305】Re:ユーザーフォームのラベルキャプション... UO3 12/2/20(月) 14:39 発言[未読]
【71311】Re:ユーザーフォームのラベルキャプション... HoMa 12/2/21(火) 9:16 質問[未読]
【71316】Re:ユーザーフォームのラベルキャプション... hint 12/2/21(火) 10:16 発言[未読]
【71318】Re:ユーザーフォームのラベルキャプション... HoMa 12/2/21(火) 11:12 質問[未読]
【71323】Re:ユーザーフォームのラベルキャプション... hint 12/2/21(火) 13:10 発言[未読]
【71325】Re:ユーザーフォームのラベルキャプション... HoMa 12/2/21(火) 13:34 お礼[未読]
【71326】Re:ユーザーフォームのラベルキャプション... hint 12/2/21(火) 13:50 発言[未読]
【71327】Re:ユーザーフォームのラベルキャプション... hint 12/2/21(火) 14:00 発言[未読]

【71302】ユーザーフォームのラベルキャプションの...
質問  HoMa  - 12/2/20(月) 11:36 -

引用なし
パスワード
   初めて投稿します。

ユーザーフォームのラベルの文字についてですが、
リストボックスを選択するとその値によってテキストボックスに
文字が出るようにし、テキストボックスに文字が有るか無いかで
ラベルの文字(caption)の表示非表示を切り替えるようにしたいの
ですが、テキストボックス・ラベルが複数あるため、ひとつひとつ
文を書いていくと長くなるので、下記のようにしてみましたが、
うまく動作しませんでした。
どこを直せばよいかご教示いただきますようお願いします。
また、別の方法があれば教えて下さい。


-----------------------------------

Private Sub UserForm_Initialize()
Label1.Caption = "あああ"
Label3.Caption = "いいい"
Label5.Caption = "ううう"
End Sub

-----------------------------------
Private Sub ListBox1_Change()
  Dim i As Variant
  Dim lab As Variant
  
  lab = Array("1", "3", "5")

  For Each i In lab

  cap = UserForm1.Controls("label" & i).Caption

  With UserForm1.Controls("TextBox" & i)
     If .Value <> "" Then
         .Enabled = True
        UserForm1.Controls("Label" & i).Caption = cap
      Else
        .Enabled = False
        UserForm1.Controls("Label" & i).Caption = Clear
      End If
    End With
  Next i

End Sub

【71303】Re:ユーザーフォームのラベルキャプショ...
発言  ちん  - 12/2/20(月) 12:39 -

引用なし
パスワード
   ▼HoMa さん:こんにちわ、ちんといいます。
visibleで表示、非表示できます。

Private Sub UserForm_Initialize()
Label1.Caption = "あああ"
Label3.Caption = "いいい"
Label5.Caption = "ううう"
For i = 1 To 5 Step 2
  UserForm1.Controls("Label" & i).Visible = False
Next i

End Sub

Private Sub CommandButton1_Click()
  Dim i As Variant
  Dim lab As Variant
 
  lab = Array("1", "3", "5")

  For Each i In lab

''  cap = UserForm1.Controls("label" & i).Caption

  With UserForm1.Controls("TextBox" & i)
     If .Value <> "" Then
       UserForm1.Controls("Label" & i).Visible = True

      Else
       UserForm1.Controls("Label" & i).Visible = False

      End If
    End With
  Next i
End Sub

以上、参考までに・・・

【71304】Re:ユーザーフォームのラベルキャプショ...
発言  Hirofumi  - 12/2/20(月) 14:30 -

引用なし
パスワード
   運用の問題なので使い方が因るのでしょうが?
何がどう上手く動かないのか言わないと
修正する部分も解りませんが?

【71305】Re:ユーザーフォームのラベルキャプショ...
発言  UO3  - 12/2/20(月) 14:39 -

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

こんにちは

>うまく動作しませんでした。

どうしたかったのに、そうではなく、こうなってしまった ということを
説明されてはいかがですか?

>リストボックスを選択するとその値によってテキストボックスに文字が出るようにし

これは、具体的にはどこで処理していますか?
アップされたコードの範囲では、この処理がありませんね。

【71309】Re:ユーザーフォームのラベルキャプショ...
質問  HoMa  - 12/2/21(火) 9:06 -

引用なし
パスワード
   ちん さん
コメント有難うございます。
レスがおそくなってすいません。

captionの値をこのあと利用したいと考えていますので
値を"あああ"、"いいい"、"ううう"と空白から選択したいと考えています。

ですので、visibleですと、値が残ってしまうので
captionの値を変化させたいなあと思っています。

よろしくお願いします。

【71310】Re:ユーザーフォームのラベルキャプショ...
質問  HoMa  - 12/2/21(火) 9:13 -

引用なし
パスワード
   ▼Hirofumi さん:
コメント有難うございます。
返信が遅くなってすいません。

>運用の問題なので使い方が因るのでしょうが?
>何がどう上手く動かないのか言わないと
>修正する部分も解りませんが?

説明不足ですいません。

ラベルの値を"cap"に置き換えているのですが、if文でテキストボックスに値があるうちは"cap"に"Initialize"で設定した値が入っているのですが、if文でテキストボックスに値が無くなった時に、"cap"が""に置き換えられてしまうので、以降cap=""という状態になってしまうのです。
if文のelseの後の
UserForm1.Controls("Label" & i).Caption = Clear
を何とかInitializeで設定した値に戻したいのですが、その方法がわからなくて困っています。

どうか、ご教示よろしくお願いします。

【71311】Re:ユーザーフォームのラベルキャプショ...
質問  HoMa  - 12/2/21(火) 9:16 -

引用なし
パスワード
   ▼UO3 さん:
コメント有難うございます。
返信が遅くなってすいません。

>>うまく動作しませんでした。

説明不足ですいません。

ラベルの値を"cap"に置き換えているのですが、if文でテキストボックスに値があるうちは"cap"に"Initialize"で設定した値が入っているのですが、if文でテキストボックスに値が無くなった時に、"cap"が""に置き換えられてしまうので、以降cap=""という状態になってしまうのです。
if文のelseの後の
UserForm1.Controls("Label" & i).Caption = Clear
を"Crear"じゃなくて何とかInitializeで設定した値に戻したいのですが、その方法がわからなくて困っています。


>>リストボックスを選択するとその値によってテキストボックスに文字が出るようにし
>
>これは、具体的にはどこで処理していますか?
>アップされたコードの範囲では、この処理がありませんね。

これはこの文の前に
  TextBox1.Text = Application.WorksheetFunction.VLookup("aaa", .Range("A2:AI3000"), 2, False)
  TextBox3.Text = Application.WorksheetFunction.VLookup("bbb", .Range("A2:AI3000"), 2, False)
  TextBox5.Text = Application.WorksheetFunction.VLookup("ccc", .Range("A2:AI3000"), 2, False)
と言った感じで取得しています。


ご教示どうぞよろしくお願いします。

【71316】Re:ユーザーフォームのラベルキャプショ...
発言  hint  - 12/2/21(火) 10:16 -

引用なし
パスワード
   横から失礼します。
>Initializeで設定した値に戻したいのですが
モジュール変数を使えばいいでしょう。

Dim labelText(1 To 5) As String
Private Sub UserForm_Initialize()
  Dim i As Long
  labelText(1) = "あああ"
  labelText(3) = "いいい"
  labelText(5) = "ううう"
  For i = 1 To 5 Step 2
    UserForm1.Controls("Label" & i).Caption = labelText(i)
  Next i
End Sub
labelTextを使って元に戻せばいいでしょう。

ところで、
cap = UserForm1.Controls("label" & i).Caption
・・・
 UserForm1.Controls("Label" & i).Caption = cap
としているから、
戻すにもなんにも、最初から少しも変わっていないわけですよね。
意味がわからないです。なにかのミスですか?
もう少し整理したほうがいいですよ。

【71318】Re:ユーザーフォームのラベルキャプショ...
質問  HoMa  - 12/2/21(火) 11:12 -

引用なし
パスワード
   ▼hint さん:
コメント有難うございます。

>Initializeで設定した値に戻したいのですが
>モジュール変数を使えばいいでしょう。
>
>Dim labelText(1 To 5) As String
>Private Sub UserForm_Initialize()
>  Dim i As Long
>  labelText(1) = "あああ"
>  labelText(3) = "いいい"
>  labelText(5) = "ううう"
>  For i = 1 To 5 Step 2
>    UserForm1.Controls("Label" & i).Caption = labelText(i)
>  Next i
>End Sub
>labelTextを使って元に戻せばいいでしょう。

Private Sub UserForm_Initialize()
  Dim labelText(1 To 5) As String
  Dim i As Long
  
  labelText(1) = "あああ"
  labelText(3) = "いいい"
  labelText(5) = "ううう"
  
  For i = 1 To 5 Step 2
   UserForm1.Controls("Label" & i).Caption = labelText(i)
  Next i
End Sub

------------------------------------------------------------------------------
Private Sub ListBox1_Change()


  Dim i As Variant
  Dim lab As Variant
  Dim labelText As String
  
  lab = Array("1", "3", "5")

  For Each i In lab

  With UserForm1.Controls("TextBox" & i)
     If .Value <> "" Then
         .Enabled = True
        UserForm1.Controls("Label" & i).Caption = labelText
      Else
        .Enabled = False
        UserForm1.Controls("Label" & i).Caption = Clear
      End If
    End With
  Next i
End Sub

としてみましたが、リストボックスの選択を変える(テキストボックス内の文字が変化する)とラベルの文字が消えてしまい、元に戻りませんでした。
書き方が間違っていますでしょうか?
ちなみに、
lab = Array("1", "3", "5")
としましたが、実際は("5", "6", "9")など、規則性が無いのですが、どうすればよいでしょうか?

>ところで、
>cap = UserForm1.Controls("label" & i).Caption
>・・・
> UserForm1.Controls("Label" & i).Caption = cap
>としているから、
>戻すにもなんにも、最初から少しも変わっていないわけですよね。
>意味がわからないです。なにかのミスですか?
>もう少し整理したほうがいいですよ。

これについては、

cap = UserForm1.Controls("label" & i).Caption
で一旦"cap"にラベルの文字を入れて

If .Value <> "" Then
の時は"cap"の文字を表示して

Elseの時はクリア

という風にできるかなと思ったんですが、間違っていますでしょうか。

ご教示どうぞよろしくお願いします。

【71322】Re:ユーザーフォームのラベルキャプショ...
発言  Hirofumi  - 12/2/21(火) 12:34 -

引用なし
パスワード
   こんなのでは?

「Sub UserForm_Initialize」で各LabelのTagプロパティにCaptionをセットして置きます
但し、「Sub ListBox1_Change」でTextBoxを「.Value = ""」の時「.Enabled = True」に
しているので、TextBoxがロックされて入力出来なくなります
これの解除は如何するの?

Option Explicit

Private vntPos As Variant

Private Sub UserForm_Initialize()

  Dim i As Long
 
  vntPos = Array("1", "3", "5")
  
  ListBox1.List = Array("AAA", "BBB", "CCC")
    
  Label1.Tag = "あああ"
  Label3.Tag = "いいい"
  Label5.Tag = "ううう"
 
  For i = 0 To UBound(vntPos)
    With Me.Controls("Label" & vntPos(i))
      .Caption = .Tag
    End With
  Next i
  
End Sub

Private Sub ListBox1_Change()

  Dim i As Variant

  For i = 0 To UBound(vntPos)
    With Me
      If .Controls("TextBox" & vntPos(i)).Value <> "" Then
'        .Controls("TextBox" & vntPos(i)).Enabled = True
        With .Controls("Label" & vntPos(i))
          .Caption = .Tag
        End With
      Else
'        .Controls("TextBox" & vntPos(i)).Enabled = False
        .Controls("Label" & vntPos(i)).Caption = ""
      End If
    End With
  Next i
  
End Sub

【71323】Re:ユーザーフォームのラベルキャプショ...
発言  hint  - 12/2/21(火) 13:10 -

引用なし
パスワード
   ▼HoMa さん:
>if文のelseの後の
>UserForm1.Controls("Label" & i).Caption = Clear
>を何とかInitializeで設定した値に戻したいのですが、
>その方法がわからなくて困っています。
あなたは、If文のElseの後の、と書いていませんか?
話が変わってきていませんか?
落ち着いてよく考えて下さい。

それから、モジュールの先頭に
Option Explicit
と書くことを勧めます。
そうすれば、変数が定義されていないと
コンパイルエラーが出ます。Clearの使い方がおかしいとわかります。
Clearって何の積もりだったのですか?メソッドなら位置が違うし。
ラベルにはそのようなメソッドはありませんよ。

【71324】Re:ユーザーフォームのラベルキャプショ...
お礼  HoMa  - 12/2/21(火) 13:27 -

引用なし
パスワード
   ▼Hirofumi さん:
ありがとうございます!

思った通りのことができました。
tagプロパティを使えばいいんですね。
「.Enabled = True」については、使用しないようにしました。

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


>こんなのでは?
>
>「Sub UserForm_Initialize」で各LabelのTagプロパティにCaptionをセットして置きます
>但し、「Sub ListBox1_Change」でTextBoxを「.Value = ""」の時「.Enabled = True」に
>しているので、TextBoxがロックされて入力出来なくなります
>これの解除は如何するの?
>
>Option Explicit
>
>Private vntPos As Variant
>
>Private Sub UserForm_Initialize()
>
>  Dim i As Long
> 
>  vntPos = Array("1", "3", "5")
>  
>  ListBox1.List = Array("AAA", "BBB", "CCC")
>    
>  Label1.Tag = "あああ"
>  Label3.Tag = "いいい"
>  Label5.Tag = "ううう"
> 
>  For i = 0 To UBound(vntPos)
>    With Me.Controls("Label" & vntPos(i))
>      .Caption = .Tag
>    End With
>  Next i
>  
>End Sub
>
>Private Sub ListBox1_Change()
>
>  Dim i As Variant
>
>  For i = 0 To UBound(vntPos)
>    With Me
>      If .Controls("TextBox" & vntPos(i)).Value <> "" Then
>'        .Controls("TextBox" & vntPos(i)).Enabled = True
>        With .Controls("Label" & vntPos(i))
>          .Caption = .Tag
>        End With
>      Else
>'        .Controls("TextBox" & vntPos(i)).Enabled = False
>        .Controls("Label" & vntPos(i)).Caption = ""
>      End If
>    End With
>  Next i
>  
>End Sub

【71325】Re:ユーザーフォームのラベルキャプショ...
お礼  HoMa  - 12/2/21(火) 13:34 -

引用なし
パスワード
   ▼hint さん:
>▼HoMa さん:
>>if文のelseの後の
>>UserForm1.Controls("Label" & i).Caption = Clear
>>を何とかInitializeで設定した値に戻したいのですが、
>>その方法がわからなくて困っています。
>あなたは、If文のElseの後の、と書いていませんか?
>話が変わってきていませんか?
>落ち着いてよく考えて下さい。

Initializeで設定した値を「cap」に入れ、
if文のelseの後の
UserForm1.Controls("Label" & i).Caption = Clear
で消したラベル文字を戻したかったのです。
説明が下手で申し訳ありません。


>
>それから、モジュールの先頭に
>Option Explicit
>と書くことを勧めます。
>そうすれば、変数が定義されていないと
>コンパイルエラーが出ます。Clearの使い方がおかしいとわかります。
>Clearって何の積もりだったのですか?メソッドなら位置が違うし。
>ラベルにはそのようなメソッドはありませんよ。

ラベルには「Clear」無いんですね。無知ですいませんでした。


Hirofumi さんにご回答いただいたもので思い通りのことが出来ました。
ありがとうございました。

【71326】Re:ユーザーフォームのラベルキャプショ...
発言  hint  - 12/2/21(火) 13:50 -

引用なし
パスワード
   配列の()が抜けているのは、発言時のミスですか?

>lab = Array("1", "3", "5")
>としましたが、実際は("5", "6", "9")など、規則性が無いのですが、
>どうすれば よいでしょうか?
一例です。
Option Explicit
Dim myLabel, myLabelText
Private Sub UserForm_Initialize()
  Dim k As Long
  myLabel = Array("5", "6", "9")
  myLabelText = Array("あああ", "いいい", "ううう")
  For k = 0 To 2
    UserForm1.Controls("Label" & myLabel(k)).Caption = myLabelText(k)
  Next
End Sub

これで、材料はすべてそろっているはずなので、あとは
あなたが正確に組み合わせるだけだと思います。
それでは私はこれで失礼します。

【71327】Re:ユーザーフォームのラベルキャプショ...
発言  hint  - 12/2/21(火) 14:00 -

引用なし
パスワード
   解決したようですが、結果オーライではなく、
ご自分でよく理解したうえで、中途のものも完成させることを勧めます。

Option Explicitについて追記:
ツール - オプション - 編集 で 「変数の宣言を強制する」にチェックを入れる。
こうしておくと、モジュールが作成されたときに、自動的に
Option Explicitが挿入される。
こうしておけば不用意な未定義変数に悩まされることもありません。

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