• ベストアンサー

VBAでのオブジェクト名の付け方で困っています。

私が知りたいのはユーザフォームを一度作成した後にオブジェクトを追加したときのオブジェクト名の処理の仕方です。 今、EXCEL VBAでアンケート入力フォームを作成しています。テキストボックスやチェックボックスが全部で70ほどあります。以下のようにControlsコレクションを用いてユーザフォームに入力した文字列などをワークシートに追加しています。 ……<略> For i = 1 To 10 Cells(Row, i).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> しかし、入力フォームの画面構成を変更して、新たにテキストボックスやチェックボックスを追加すると、例えば、ユーザフォーム上で隣り合ったTextBox1とTextBox2の間にTextBox35が入ってきて以下のようにコードを書き換えねばなりません。 ……<略> Cells(Row, 1).Value = Me.CheckBox1.Value Cells(Row, 2).Value = Me.CheckBox35.Value For i = 2 To 10 Cells(Row, i+1).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> プロパティからオブジェクト名のひとつひとつを編集してユーザフォームのテキストボックスの表示順にするのも手間ですし……まだ、設計の試行錯誤の段階なのでまだまだテキストボックスやチェックボックスを追加・削除をすると思いますし…… 何か効率のよいオブジェクト名の付け方はないでしょうか? みなさんはどのようにされていますか?

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

  • ベストアンサー
  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.2

仕様が確定するまでの暫定的な措置でよろしければ、 コントロール名を配列で持っておく、またはテーブルシート の特定の列を参照するという方法が考えられます。 (1)配列を使用する場合 For i = 1 To Ubound(ControlName)   Cells(Row, i).Value = Me.Controls(ControlName(i)).Value Next i (2)テーブル用のシートのセルから参照する場合 LoopNum = コントロール数 For i = 1 To LoopNum   Cells(Row, i).Value = Me.Controls(Worksheets("テーブル").Cells(i, 1).Value)).Value Next i (1)では、配列ControlName にあらかじめコントロール名を  参照順にハードコーディングしておきます。  例)    Dim ControlName() As String = {"CheckBox1",                         "CheckBox35",                         "CheckBox2",                         ... ,                         } (2)では、シート[テーブル]のA列に1行目から参照順に  コントロール名を登録しておきます。 その後、仕様が確定した段階でコントロールの名称を整理 し、元のソースコードに戻せばよいかと思います。

poincare
質問者

お礼

回答をいただき、有難うございます。 (1)の方法で実際にやってみようと思います。 困っていたので、非常に助かりました!

その他の回答 (1)

  • Nayuta_X
  • ベストアンサー率46% (240/511)
回答No.1

VB6なら コントロール配列と言うものが、使用出来ますが 例; Cells(Row, 1).Value = Me.CheckBox1(n).Value Visual Basic .NET になってからは、出来なくなりましたが、対処方法は、下記で出来るとのことです。 たとえば、あるフォームに 2 つの Button コントロール (Button1 および Button2) および 1 つの CheckBox コントロール (CheckBox1) を追加し、3 つのコントロールすべての Click イベントを処理するイベント ハンドラを作成できます。 Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click Visual Basic 6.0 コントロール配列のもう 1 つの機能に、Index プロパティによってコントロールを参照する機能がありました。Visual Basic .NET コントロールには、Index プロパティはありませんが、TabIndex プロパティまたは Tag プロパティなど、別の共通プロパティを使用してこの機能を複製できます。 たとえば、Windows フォームに新しく備わった、ビジュアル タブ オーダー機能を使用して、コントロール グループの TabIndex プロパティを設定し、Select Case ステートメントで TabIndex を使用できます。 Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click Select Case sender.TabIndex Case 0 MsgBox("Button 1") Case 1 MsgBox("Button 2") Case 2 MsgBox("CheckBox 1") End Select End Sub これと 同様のことが、VBAで出来るか 確認しておりません!!。 時間をみて 確認されると良いでしょう。 でも、出来たとしても、あまり効率が良くないですよね。

poincare
質問者

お礼

回答をいただき、有難うございます。 VBAで「Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click 」を試したところ,エラーが出てしまいましたが、原因やできるかどうかは自分で調べてみます。 恥ずかしながら,MixedControlsやタブオーダー機能は知らなかったので、非常に参考になりました。

関連するQ&A

  • excel VBA コンボボックスでシート選択後エラー

    どなたかご教授願います。 ユーザーフォームにコンボボックスを配置し、ブック内のシートすべて選択できるようにしてます。選択後シートに移動するのですが、同じユーザーフォームのテキストボックス等に入力した後、コマンドボタンをクリックするとエラーとなります。しかしテキストボックス等の値は間違いなく入力されています。よろしくお願いします。 Private Sub ComboBox1_Change() → Sheets(Me.ComboBox1.Value).Select       この部分が黄色になってしまいます End Sub Private Sub CommandButton1_Click() Dim myRow As Long ActiveSheet.Select myRow = Range("B65536").End(xlUp).Offset(1, 0).Row '各テキストボックの値をセルに入力 Cells(myRow, 2).Value = TextBox1.Value Cells(myRow, 3).Value = TextBox1.Value Cells(myRow, 4).Value = ComboBox2.Value Cells(myRow, 6).Value = TextBox2.Value Cells(myRow, 7).Value = TextBox3.Value Cells(myRow, 8).Value = TextBox4.Value 'Cells(myRow, 9).Value = TextBox5.Value '書式設定 Cells(myRow, 2).NumberFormatLocal = "m" Cells(myRow, 3).NumberFormatLocal = "dd" Cells(myRow, 6).NumberFormatLocal = "#,###" 'セルに入力が各テキストボックの値をクリア ComboBox1.Value = "" ComboBox2.Value = "" TextBox2.Value = "" TextBox3.Value = "" TextBox4.Value = "" 'フォーカス移動 ComboBox2.SetFocus End Sub

  • ForNext文のループ値がおかしいのですが

    エクセル2003のVBAで、以下のコードを実行すると、 3つ目のメッセージボックスで「121」と表示されます。 1つ目、2つ目のメッセージボックスは「1」と表示されます。 ユーザーフォームで、テキストボックスを貼り付ける際に、 注意事項があるのでしょうか? ループ文も間違ってないと思うのですが。 原因と対処法がわかるかた、もしくはこれだろうと予測がつく方は、 教えてください。よろしくお願いいたします。 'ユーザーフォームロード時 Private Sub UserForm_Initialize() '【一括設定】補正値代入(デフォルト値) Me.TextBox100.Text = "XXX" For i = 1 To 10 'ファイル名代入 Me.Controls("TextBox" & i).Value = Left(strFileName(i), 4) msgbox i '補正値(デフォルト) Me.Controls("TextBox" & i + 10).Value = "XXX" msgbox i '大気圧(デフォルト) Me.Controls("TextBox" & i + 20).Value = "XXX" msgbox i '給気圧(デフォルト) Me.Controls("TextBox" & i + 30).Value = "XXX" '系列 Me.Controls("TextBox" & i + 50).Value = "XXX" 'グラフメモ(デフォルト) Me.Controls("TextBox" & i + 100).Value = "XXX" Next i End Sub

  • エクセル ユーザーフォームでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 テキストボックス5に値を入れ、 listのシートから該当する文字をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

  • エクセルのユーザーフォームにあるテキストボックスへの値代入

    エクセルのユーザーフォームにあるテキストボックスへの値代入 お世話になります. エクセルのシートの入力を,ユーザーフォームを使って入力させています. 新規の場合は空欄のフォームがでるのですが,既存の列を編集するには編集用のフォームで行っています. フォームにはテキストボックスが15個(Textbox1からTextbox15まで)あり,Textbox1はCells(*,1)Textbox2はCells(*,2)というふうにセルの列との関連付けがあります. この規則性を上手く使おうと,For Nextを使っていきたいのですが, Dim r As Integer Dim i As Integer Dim t As String r = ActiveCell.Row For i = 1 To 15 t = "TextBox" & i t = Cells(r, i).Value Next i と,ここまで入力をしてみたものの,値の代入がうまくいきません. MsgboxでCells(r, i)の動きは確認できているので,おそらく,TextBox & iのところが原因と思われますが・・・ どのように修正すればよろしいでしょうか?教えてください.

  • VBA オブジェクトが必要です エラー424

    VBA初心者です。 初歩的な質問で申し訳ありません。 ユーザーフォームのコンボボックスにユーザーリストを読みこみプルダウンする構文です。 以下を実行すると 実行時エラー 424 オブジェクトが必要です という警告が出ます。 どこを直せばいいのかわかりません。 詳しい方教えて下さい。宜しくお願いします。 private sub userform_initialize() dim 最終行 as integer dim i as integer 最終行 = worksheets(゛meisai″).cells(Row.count,8).end(xlup).Row for i = 1 to 最終行 combobox1.addItem worksheets(″meisai゛).value next i end sub

  • ユーザーフォームのテキストボックスでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 上から順番に入力した際、テキストボックス5に値を入たら、 listのシートから該当するもの(項目は20個)をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

  • エクセルVBA テキストボックス処理?

    エクセル2000 VBAにて入力フォームの テキストボックス1に下記を書き込んだのですが カーソルがテキストボックス1にあるとき 他の処理(コマンドボタン、マウスにて他のテキストボックスに カーソルを移すなど)が出来ません。 フォームを閉じるときもメッセージボックスのコメントがでます。 どの処理を行ってもテキストボックス1の処理が終わってからしか 行わないようなのですが??? Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Integer '品番確認用 For i = 3 To 100 If Sheets("品番マスタ").Cells(i, 1) = TextBox1.Text Then Label1 = Sheets("品番マスタ").Cells(i, 2).Value 'メーカー Label2 = Sheets("品番マスタ").Cells(i, 3).Value 'タイプ Label3 = Sheets("品番マスタ").Cells(i, 4).Value '品名 Label4 = Sheets("品番マスタ").Cells(i, 5).Value '内容量 Label6 = Sheets("品番マスタ").Cells(i, 8).Value '背番号 Exit Sub End If Next i MsgBox "品番がありません" TextBox1 = "" Cancel = True End Sub どのように変更すればいいでしょうか?

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • VBAの修正・上書きについて

    下記、コードにてVBAで作成したユーザーフォームにエクセルで管理している 顧客名簿を表示させ、修正をした後、元のセルに修正したものを 上書きするというコードを書きたいのですが、 実行時エラーにて作動しません。 下記をどのように、直せばいいのかご指摘お願いします。 ※その他に、検索ボタンのプロシージャもありますが、こちらに載せたほうが いいのでしょうか? (修正ボタンを押したときのプロシージャ) Private Sub CommandButton1_Click() Dim gyou As Long Dim z As Object Dim i As Integer With Worksheets("Sheet1") gyou = z.Row For i = 1 To 16 Cells(gyou, i).Value = Me.Controls("TextBox" & i).Text Next End With TextBox1.SetFocus End Sub

  • VBAでコントロール配列を持つことは可能ですか?

    Excel2002、OSはXPです。 VBではコントロールに配列を持つことが出来ましたが、 VBAでコントロール配列を持つことは可能でしょうか? やりたいことはユーザーフォームにラベルを100個ぐらい貼り付けて、 テキストボックス入力した値がCell(i,1)と等しければ、 i番目のラベルのCaptionに文字を入力したい。という感じです。 もしVBのようにコントロール配列を持てれば、 If TextBox1.text=Cells(i,1) Then Label(i).Caption="~~" という風に出来るのですが、どうも配列の設定がVBのようにできません。 プロパティにINDEXが無いですし、オブジェクト名を同じにしたら エラーとなってしまいますし。。 もし出来ないのであれば、何か回避策のようなものはないでしょうか? 力技で100個IFを書けば出来ることは出来るのですが・・ If TextBox1.text=Cells(i,1) Then If i = 1 Then Label1.Caption="~~" ElseIf i=2 then Label2.Caption="~~" ・・・・

専門家に質問してみよう