• ベストアンサー

VBA:ユーザフォームのラベルの指定の仕方教えてください。

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。  Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?  やはり、UserForm1.Label3などのように番号をきちんと書かないとダメでしょうか?本当は、ラベルが82個ありその一つ一つにコードを割り当てるのが大変です。また、きれいなコードで書きたいと思うからです。宜しければ、ご教授願います。 -------------------------------------------- Sub セルの値をラベル表示する() For i = 1 To 20 With UserForm1.Label(i) .Caption = Cells(1, i) End With Next i End Sub

  • e-l
  • お礼率45% (158/349)

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

  • ベストアンサー
  • mach999
  • ベストアンサー率75% (36/48)
回答No.1

 Excel VBAではコントロール配列はサポートされていませんが、ラベルの名前をLabel1, Label2,・・・ Label20とすると、以下のコードでほぼ同じことを実現できます。 Sub セルの値をラベル表示する()  For i = 1 To 20   With UserForm1.Controls("Label" & i)    .Caption = Cells(1, i)   End With  Next i End Sub

e-l
質問者

お礼

有難う御座います。大変簡単なコードになりました。

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

 ははは、そりゃ大変だ。  ところでVBAにはコントロール配列の機能はなさそうだ。Indexプロパティが無い。  では方法は無いかと言うと、FormオブジェクトのプロパティControlsは、そのフォームが持っているコントールのコレクションオブジェクトを返す。で、コレクションの中で名前を指定すれば該当するNameプロパティが設定されているオブジェクトを返す。  ようはこういう事だ。  Me.Controls("Label3").Caption = "ラベルだよ~ん"  コントール名が「文字列」として操作できるのなら、後は・・・・な? もう分かったよな。

e-l
質問者

お礼

有難う御座います。深夜の質問ということと、自分なりに調べても該当するものがなかったのでほぼ諦めて、Label1~82まで作り、エラーの除去をしていました。まさか、Controlsがそのような意味だとは知りませんでした。50行近い、Select Case が、わずか5行程度のFor文になり大変感謝しております。有難う御座いました。

関連するQ&A

  • ユーザーフォームの描画が遅れるのは?

    ExcelのVBAで簡単な処理をしているのですが、困っています。 ユーザーフォームにラベル1つとコマンドボタンを2つ用意しました。 ラベルには「・・・よろしいですか?」と質問形式の文章を 表示し、コマンドボタンにはそれぞれ「OK」と「キャンセル」を 表示してあります。 「OK」のコマンドボタンをクリックされたら、2つのコマンドボタン のvisibleプロパティをfalseにして隠し、ラベルには 「しばらくお待ちください。」と表示してセルの計算をさせます。 私の考えでは、コマンドボタンが消えラベルに「しばらく・・」が 表示されてから計算が行われセル上に計算結果が 表示されるはずなのですが、何故か計算結果が全て表示されてから コマンドボタンが消え、ラベルに「しばらく・・」と表示され 次の命令を実行してしまいます。 何がいけないのかが分かりません。 宜しくお願いいたします。 Private Sub CommandButton1_Click()  UserForm1.CommandButton1.Visible=False  UserForm1.CommandButton2.Visible=False  UserForm1.Label1.Caption="しばらくお待ちください。" '計算のsubへ飛ぶ  Call Keisan  UserForm1.Label1.Caption="終了しました。" End Sub

  • エクセルVBAラベルの変数?

    エクセル2000VBAにて下記のように作成しました。 With ActiveSheet For i = 4 To 200 If Label1.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label6.Caption = .Cells(idx, h) Label7.Caption = .Cells(idx + 2, h) GoTo ラベル2 End If Next idx End If Next h End If Next i ラベル2: For i = 4 To 200 If Label2.Caption = .Cells(i, 1) Then For h = 4 To 34 If Label25.Caption = .Cells(2, h) Then For idx = i To 200 If .Cells(idx, 3) = Label21.Caption Then Label8.Caption = .Cells(idx, h) Label9.Caption = .Cells(idx + 2, h) GoTo ラベル3 End If Next idx End If Next h End If Next i ラベル3: ・・・ End With Label1~5まで同じ処理を行うため 1~5まで変数を使用して簡単にしたいのですが Label(変数)の書き込み方がわかりません? 検索を使用しましたが検索項目が悪いのか なかなか解決しません。 何方か教えていただけないでしょうか?

  • VBAでUserFormでProgressBarとLabelを同時表示できない理由は?

    VBAでUserFormをつかってProgressBarとLabelを同時に表示させる。つもりでしたが、ProgressBarが満たされた後Labelが表示されます。その理由と対策を教えて下さい。そのコードを以下に示します。 Sub a() With UserForm1 .Show vbModeless .Label1 = "始めのテキスト" End With s = 1 e = 20000 For i = s To e UserForm1.Label1 = "始めのテキスト" UserForm1.ProgressBar1.Value = i / e * 1000 Next i End Sub お願いします。

  • VBAでユーザーフォームのcaption表示

    VBAを初めたばかりです。 VBAでユーザーフォームを作成したのですが ユーザーフォームプロパティのcaptionで入力しても 下記プログラムで入力しても表示されません。 VBA作成時の画面にはしっかりと「項目」と 表示されていますが、プログラムを実行してユーザーフォームを 呼び出すと何も表示されていません。 ご教授ください。 Private Sub UserForm_Initialize() UserForm1.Caption = "項目" With ListBox1 .AddItem "1" .AddItem "2" End With End Sub

  • Excel VBAについて

    Excel VBAにおいて、Sheetの選択した行によって値を表示するUserFormを変更したいと思っています。 現在以下のようにしたのですが、実行すると「SubまたはFunctionが定義されていません」というエラーが表示されます。 「Controls("UserForm" & x).Label1.Caption =」のところをどのようにしたらよいのでしょうか。 Private Sub CommandButton1_Click()   If ActiveCell.Row = 5 Then     UserForm1.Show     x = 1   ElseIf ActiveCell.Row = 6 Then     UserForm2.Show     x = 2   End If End Sub Private Sub Worksheet_Selection Change(Byval Target As Range)   Controls("UserForm" & x).Label1.Caption = ・・・

  • VBA DoEvents関数の働きと使い方を知りたい

    下記のような UserForm上の Module コードを書いてももらったのですが、DoEvents の働きが分からないのです。どなたか分かりやすく説明していただけませんでしょうか? Private i As Integer Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.TextBox1.Value = Me.Label1.Caption Then Me.Label2.Caption = "正解です" Else Me.Label2.Caption = "不正解です" End If DoEvents If i < 20 Then i = i + 1 Label_Up Me.TextBox1.Value = "" Cancel = True Else MsgBox "終了です" End If End Sub Private Sub UserForm_Initialize() i = 1 Label_Up End Sub Private Sub Label_Up() Me.Label1.Caption = Sheets("Sheet1").Range("A1:A20").Cells(i).Value DoEvents End Sub

  • Q:Ecvel 2007 VBA: 長い処理の間のメッセージ?

    いつもお世話になります。 ユーザーフォームの下にラベルを置いて、ステータスバー的に使っています。 ちょっと時間が掛かる処理があることが分かったので、その間は「処理中・・・」的なメッセージを出すことにしました。 現在は以下のようなプログラムにしています。 Option Explicit Private Sub CommandButton1_Click() setColor1 '<==Break? setcolor2 Dim i As Long For i = 2 To 10000 Cells(i, 5).Value = "wanwan" Next i setcolor3 End Sub Sub setColor1() With UserForm1.Label1 .Caption = "you push the button..." .ForeColor = RGB(0, 255, 0) End With End Sub Sub setcolor2() With UserForm1.Label1 .Caption = "wait for a while..." .ForeColor = RGB(255, 0, 0) End With End Sub Sub setcolor3() With UserForm1.Label1 .Caption = "Finished" .ForeColor = RGB(0, 0, 0) End With End Sub これを実行しても、Forループの間はLabel1のCaptionはフォームデザイン時のデフォルト値Beforeになったままで、Forループが終わるとsetcolor3によってセットされるFinishedになります。 setcolor1、setcolor2が表示する途中経過は見えません。 しかし、上のリストの Break? と書いているところにブレークポイントを置いて、ブレークしたらF8を連打してsetcolor1、setcolor2を手動実行するとメッセージは狙い通りに変わります。 Forループの中でワークシートに何らかの操作を行っている場合にのみ起こる現象で、Forループの中でwait文を書いて10秒待つとかやると、メッセージは狙い通りに変わります。 ワークシートを処理しながら、メッセージを狙い通りに変える方法はあるでしょうか。 何かわかりましたらよろしくお願いします。 なお、ユーザーフォームの画像を添えます。

  • エクセル VBAラベル 表示?

    宜しくお願いいたします。 エクセル2000にて Private Sub UserForm_Initialize() Dim TYU As Integer Dim TYUB As Integer For TYU = 3 To 100 If Worksheets("発注履歴").Cells(TYU, 1) = "" Then TYUB = Right(Worksheets("発注履歴").Cells(TYU - 1, 1).Value, 3) Label1.Caption = Format(Date, "yy") & TYUB + 1 Exit For End If Next TYU End sub 上記のようにコードを書き込みました。 ワークシート発注履歴("A3")には注文番号090001が 入力されております。 次回発注時、入力フォームを開いたときに ラベル1に090002を表示しようとしたのですが 092と表示されてしまい 2 のまえの00を表示できません。 どの様に修正すれば宜しいでしょうか?

  • excel VBA プログレスバーについて(初心者)

    VBA初心者の質問です… excelで入力されている値を用いて、グラフ作成する簡単なデータを作りました。 特に問題なくグラフは出来たのですが、グラフ作成が1つではなく数個同時(順番)に作成しているため時間が掛かってしまいます。 この処理中にプログレスバーを表示出来ればと思い質問を致します。 私なりに調べ(goo内)下記サンプルを発見し、簡単なのでこれを使をうかと思うのですが、UserForm1の処理前にUserForm2.showだけでは UserForm2の処理が終わらないと処理をしません…当然ですよね… 本当に初心者で申し訳ないのですが、UserForm1の処理最中にUserform2のプログレスバーを表示するのにはどうすればいいのでしょうか… 【サンプル】 Private Sub UserForm_Activate() With Label1 .SpecialEffect = 2 .BackColor = vbBlue www = .Width .Width = 0 End With For i = 1 To 1000 Me.Caption = i Label1.Width = i / 1000 * www Me.Repaint Next End Sub また他におすすめなやり方があれば教えて頂ければ… 初心者な質問で申し訳御座いません。

  • ExcelVBAでのユーザーフォームについて

    ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// とまぁ、結局コードは同じなのですが。 それと、結果をラベルに出させる場合には回答で記述いただいた ////////////////////////////////////////////////////// Private Sub ComboBox1_Change()   Dim vTgYear As Variant   vTgYear = ComboBox1.Value   Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。

専門家に質問してみよう