Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

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