エクセルVBAでコントロールのタイプを取得する方法

このQ&Aのポイント
  • エクセルVBAでユーザーフォーム上のコントロールのタイプを取得する方法について説明します。
  • ユーザーフォーム上のコントロールのタイプを取得する際には、Itemメソッドを使用します。
  • コマンドボタンの場合は、Item(i).Nameで取得できます。
回答を見る
  • ベストアンサー

コントロールのタイプを取得したい場合

Sub test() Dim i As Integer Dim StrFormName As String StrFormName = "UserForm1" With UserForms.Add(StrFormName).Controls For i = 0 To .Count - 1 Debug.Print .Item(i).Name  Next End With End Sub これでエクセルのユーザーフォーム上のすべてのコントロール名が取得できるのですが、 コントロールのタイプを取得したい場合、 Debug.Print .Item(i).Name  の部分をどう変えればいいのでしょうか? 例えばコマンドボタンなら、「CommandButton」と返ってきてほしいです。 Debug.Print .Item(i).Controlstype でも Debug.Print .Item(i).Controltype でもエラーになりました。

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

  • ベストアンサー
回答No.1

Debug.Print .Item(i).Name, TypeName(.Item(i)) としてみてください。

qgnlqpvqs
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • ExcelVBA TextBoxの値を取得できない

    Excel2010です。 2つのUserFormがあり(UserForm1・UserForm2とします)、UserForm1にはTextBox1~100を配置し、UserForm2にもTextBox1~150を配置しています。 それぞれのUserFormにおいて、そのUserForm名を変数に格納しておき、TextBoxの値を取得するコードを別のプロシージャ(「TextBoxチェック」)に書き、それを呼び出してTextBoxの値を格納しようとしましたができませんでした。 該当箇所のコードは以下のとおりです。 Public UFName As String 'UserFormの名前 Sub UserForm1処理() Const Num = 100 UFName = "UserForm1" Call TextBoxチェック(Num) End Sub Sub UserForm2処理() Const Num = 150 UFName = "UserForm2" Call TextBoxチェック(Num) End Sub Sub TextBoxチェック(Num As Integer) Dim i As Integer Dim Con As Control With UserForms.Add(UFName) For i = 1 To Num Set Con = .Controls("TextBox" & i) Debug.Print Con.Name Debug.Print .Controls("TextBox" & i).Value   (その他の処理のコードは省略) Next i End With End Sub 上のコードでは1つ目のDebug.Printの結果(TextBox名)は取得できていますが、2つ目のDebug.Printの結果(TextBoxの値)は空欄になってしまいます。 つまり、 With UserForms.Add(UFName)が、 Set Con = .Controls("TextBox" & i) では反映されているのに、 .Controls("TextBox" & i).Value では反映されていないということだと思います。 また、 Debug.Print .Controls("TextBox" & i).Value を Debug.Print UserForm1.Controls("TextBox" & i).Value とすると、UserForm1の値を取得できます。 また、 With UFName_UF を With UserForm1 にすると、 Debug.Print .Controls("TextBox" & i).Value の値は取得できます。 UserForm1とUserForm2において、TextBoxの値を取得する部分は共通しているため、その部分を別プロシージャにして呼び出して処理したいのですが、うまくいきません。 TextBoxの値を取得できない理由や、対処法が分かれば教えていただきたいです。

  • エクセル フォーム上の全てのコントロールを取得した

    エクセル フォーム上の全てのコントロールを取得したい http://okwave.jp/qa/q4879853.html のNo.1さんの回答を参考に、 Sub try() Dim i As Integer Dim StrFormName As String StrFormName = "フォーム1" For i = 0 To Forms(StrFormName).Controls.Count - 1 Debug.Print Forms(StrFormName).Controls.Item(i).Name Next End Sub を作ったのですが、 「Forms」の部分が、 「Sub、Function、または Property が定義されていません。(Error 35)」 というコンパイルエラーになってしまいます。 上記のコードをアクセスVBAにつけると、全てのコントロール名が取得できます。 同じようにエクセルで使うにはどこを修正すればいいでしょうか? フォーム名は、変数に入れて使いたいです。

  • テキストボックスかコンボボックスを条件としたい

    フォーム上のコントロールを取得する時に、 「テキストボックスかコンボボックスなら」としたいのですが、VBAコードがわかりません。 ************************************************************ Sub Sample() Dim myCtrl As Control Dim myForm As String myForm = "フォーム1" For Each myCtrl In Forms(myForm).Controls If myCtrlのタイプがテキストボックス Or コンボボックス Then Debug.Print myCtrl.Name End If Next End Sub ************************************************************ に修正していただけますか? ControlType プロパティを使うと思うのですが、使い方がわかりません。 ご回答よろしくお願いします。

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

  • フォーム上の全てのコントロールを取得したい

    フォーム上の全てのコントロールを取得したいです。 (サブフォームも含め) 自分なりにVBAで考えてみたのがこれです。 Sub test() Dim 数 As Long For Each 数 In Form_フォーム1.Controls.Count ’Debug.Print ? End If Next End Sub でもこれだけでもデバックしてみると 「コンハ゜イルエラー for Eachは、コレクション オブジェクトまたは配列でのみ繰り返しを実行します。」 となります。 答えを教えてください! よろしくお願いします。 (アクセス2003です)

  • 値渡しについて

    UserForm1で以下のように求めた値「R」を UserForm2に渡すにはどのようにすればよいのでしょうか。 **************************************** <UserForm1(コード)> Public R As Integer ----------------------------------- Private Sub CommandButton1_Click()    Dim N As Integer        :    N = TextBox1.Text    R= N * 2 + 3        : End Sub **************************************** <UserForm2(コード)> Private Sub CommandButton1_Click()   Dim i As Integer       :   For i = 4 To R       :   Next i       : End Sub **************************************** どなたか教えて下さい。

  • 全てのプリンター名を取得したい

    エクセルで全てのプリンターのプリンター名・ドライバー名・ポート名を取得する コードを実行したいのですが Sub Sample() Dim prtLoop As Printer For Each prtLoop In Application.Printers With prtLoop Debug.Print "Device name: " & .DeviceName Debug.Print "Driver name: " & .DriverName Debug.Print "Port: " & .Port End With Next prtLoop End Sub これをそのまま貼り付けて実行しようとすると、 「prtLoop As Printer」が、ユーザー定義型は定義されていません。 になります。 何に参照設定すればいいのかわからないので、 とりあえず Dim prtLoop As Object にしたのですが、 今度は For Each prtLoop In Application.Printers で 実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 になります。 どうすればいいか教えてください。

  • シート上のOLEオブジェクトのタイプを取得する

    シート上のOLEオブジェクトのタイプを取得するvbaは? Sub Sample() Dim i As Integer For i = 1 To ActiveSheet.OLEObjects.Count Debug.Print ActiveSheet.OLEObjects(i).Type Next i End Sub これだとエラーになります。 テキストボックスとかコマンドボタンとかの情報を取得するには どうすればいいでしょうか?

  • 一回のループで次のオブジェクトの値も同時に取得する

    一回のループで次のオブジェクトの値も同時に取得するにはどのようなコードを書けばよいですか? 例えば、 ブックにシートが Sheet1 Sheet2 Sheet3 あり、 Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub のように、全てのシート名を取得する場合、 Sheet1とSheet2を1回のループで同時に取得する方法はありますか? Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name   Debug.Print s+1.Name Next End Sub みたいな方法があるのか知りたいです。 よろしくお願いします。

  • コードに無駄が多すぎる気がする

    http://hiroba.chintai.net/qa7900795.html こちらでも質問したものなのですが、ご提示いただいた内容が難しくてよくわからなかった為 自分でコードを作ったのですが、無駄が多すぎるような気がするので見てもらえますか? やりたい事は、フォーム上のコントロールをタブインデックス順に取得したいのですが --------------------------------------------------------- Option Compare Database Option Explicit Sub test() Dim ctl As Control Dim i As Integer Dim j As Integer Dim intTabIndex As Integer Dim StrFormName As String StrFormName = "SampleCode_SubForm" DoCmd.OpenForm StrFormName, acDesign For i = 0 To Forms(StrFormName).Controls.Count - 1 For j = 0 To Forms(StrFormName).Controls.Count - 1 Set ctl = Forms(StrFormName).Controls.Item(j) If Forms(StrFormName).Controls.Item(j).ControlType = acTextBox Then 'TabIndexがないコントロールはエラーになる。 ' Debug.Print "TabIndex:" & Forms(StrFormName).Controls.Item(j).TabIndex Do While Forms(StrFormName).Controls.Item(j).TabIndex = intTabIndex '数が小さい順からTabIndexを照合していく(0~コントロールの最大値) Debug.Print "TabIndex:" & Forms(StrFormName).Controls.Item(j).TabIndex & " " & Forms(StrFormName).Controls.Item(j).Name intTabIndex = intTabIndex + 1 Exit For '該当のTabIndexが見つかったのなら抜ける Loop End If Next j Next i End Sub --------------------------------------------------------- これで一応取得できるのですが、かなり無駄があるように感じます。 フォームをループして一つずつコントロールを見て行ってるのですがもっと簡略化できないでしょうか? ご回答よろしくお願いします。

専門家に質問してみよう