[[20100325111402]] 『Me.Controlsについて』(S TO Z) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Me.Controlsについて』(S TO Z)

Me.Controlsについて質問です

For i = 1 To 100

Me.Controls("ComboBox" & i).Clear

Next

上記のようにComboBox1〜100までをクリアしたいのですが

「メソッドまたはデータ メンバが見つかりません。 (Error 461)」

となります。

また、プログラム入力時のMe.の次の選択肢にもControlsはでてきません

なぜでしょう?


 こんにちわ。。

 Me.Controls("ComboBox" & i).Value=""
 ではいかが。。
 (kei)

コメントありがとうございます。
早速やってみたんですが

またも

メソッドまたはデータ メンバが見つかりません。 (Error 461)

となりました。?


 そうですか・・

 >プログラム入力時のMe.の次の選択肢にもControlsはでてきません 
 USERFORM上にあるComboBoxのプロパティのオブジェクト名は、ちゃんとありますか?
 (kei)


 横から失礼します。
 Me.OLEObjects("ComboBox" & i).Object.Value = ""
 これはどうでしょうか?

 自己削除
  表現の仕方?がよくわからなかったので一部削除しました。
 (てつろう)

素人ですいません。

Me.OLEObjects("ComboBox" & i).Object.Value = ""

その通りでした。最終的には

Me.OLEObjects("ComboBox" & i).Object.Clear としました。

ちなみにMe.Controls("ComboBox" & i).Value=""は

ユーザーフォームを作りその上に置いたものにしか使えないのでしょうか?


 てつろうさん、フォローありがとうございました。m(__)m

 >Me.Controls("ComboBox" & i).Value= ""
 わたしはフォーム上でよく使ってます。
 ActiveXコントロールについては、あまり分かっていません^^;
 (kei)

 >ちなみにMe.Controls("ComboBox" & i).Value=""は 
 >ユーザーフォームを作りその上に置いたものにしか使えないのでしょうか? 

 「Me」たり得るものの上であれば使えると思います。

 ※ オブジェクトブラウザで、Controlsは何のメンバーとして存在するかをチェックすれば
   判明すると思います。

    こんなところではないですか?
     ↓
    CommandBar、CommandBarPopUp、Frame、Page、UserForm

 (半平太) 2010/03/25 16:07

 <追記>
  実験した訳ではありません。m(__)m
  ご質問の真意が分からないうちは、無駄になりそうなことはしない主義なので。。

コメントありがとうございます。

オブジェクトブラウザで調べたらControlsはMSFORMSのメンバでした。

だとしたら、どのように指定したら良いのでしょうか?

正直MSFORMSとControlsの関係がよくわかってません。


 >どのように指定したら良いのでしょうか? 

 ご質問の意味がよく分かりません。

 そのComboBoxはMSFORMSの上にあるのですか?
 (・・と云うより、どこにあるのか明確にして頂けませんか? 今までの経緯を読んでも、それが曖昧な気がします。)

 (半平太) 2010/03/25 17:13

 例えば、ユーザーフォームにコントロールを追加する時は
 UserForm1.Controls.Add・・・・ と言うコードになりますが

 シートにコントロールを配置した時のマクロ記録を見てください。
 すると ActiveSheet.OLEObjects.Add・・・となると思います。

 シート上のコントロールはControlsコレクションには追加されずに
 OLEObjects コレクションに追加されます。

 なのでシート上のコントロールに対してControlsコレクションは使えません。
 (momo)

 割り込み失礼します。マクロ記録をやってみました。
 両方ともシート上に追加しています。
 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
     DisplayAsIcon:=False, Left:=456, Top:=134.25, Width:=124.5, Height:= _
     60).Select
 ActiveSheet.DropDowns.Add(236.25, 210.75, 76.5, 90).Select
 上が コントロール ツールボックスのコンボ ボックス、
 下が フォームのコンボ ボックスです。
 (あん)

コンボボックスはシートの上にActiveXのものを置いてます。

シート上にコンボボックスを配置すると、コントロールコレクションには追加されないんですね。
だとするとControlsコレクションに追加されるのはユーザーフォーム上に配置したときなんですかね。

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


 どのコントロールかにもよりますね。
 CommandBarにもコントロールはありますので。
 あとはユーザーフォーム上や、さらにユーザーフォーム内でも
 タブストリップやマルチページ、フレーム内に置かれたコントロールもさらに
 その配下のControlsコレクションに入ると思います。

 個人的にはシート上にActiveXコントロールを置くのは好きではないので
 (色々なトラブルを抱えた経験もありますし、何よりコーディングが面倒くさいので)
 ユーザーフォームにするか、シート上であればフォームの方を使うか入力規則のリストで済ませます。

 (momo)

 >だとするとControlsコレクションに追加されるのはユーザーフォーム上に配置したときなんですかね。 
 momoさんが

 >ユーザーフォーム内でも
 >タブストリップやマルチページ、フレーム内に置かれたコントロールもさらに
 >その配下のControlsコレクションに入ると思います。

 Frame等は、シートにも貼りつけ可能です。そうすると、シートに貼り付けたフレーム内に
 コンボボックスを配置すると、Controlsコレクションで操作できます。

 新規ブックの標準モジュールに

 '=================================================================================
 Sub SampleControl()
    Dim ole As OLEObject
    Dim frm As Object
    Dim r As Range
    Dim c1 As Range
    Dim c2 As Range
    Set c1 = Range("d6:f7")
    Set c2 = Range("d11:f12")
    Set r = Range("c4:g14")
    Set ole = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Frame.1", Link:=False, _
        DisplayAsIcon:=False, Left:=r.Left, Top:=r.Top, Width:=r.Width, Height:=r.Height)
    ole.Name = "Frame1"
    Set frm = ole.Object
    With frm
       .Caption = ""
       .BackColor = &H80000009
       .BorderColor = &H80000009
       .SpecialEffect = 2
       With .Controls.Add("Forms.ComboBox.1")
          .Left = c1.Left - r.Left
          .Top = c1.Top - r.Top
          .Width = c1.Width
          .Height = c1.Height
          .List() = [{"a","b","c","d","e"}]
       End With
       With .Controls.Add("Forms.ComboBox.1")
          .Left = c2.Left - r.Left
          .Top = c2.Top - r.Top
          .Width = c2.Width
          .Height = c2.Height
          .List() = [{"aaaa","bbbb","cccc","dddd","eeee"}]
       End With
    End With
    ole.Visible = False
    ole.Visible = True
 End Sub

 適当なシートをアクティブにして 上記のSampleControl を実行してみてください。

 アクティブシートにフレームが作成され、その中にコンボボックスが二つ作成されます。

 このコンボボックスのデータをクリアするには、

 Sub test()
    Dim g0 As Long
    With ActiveSheet.OLEObjects("frame1").Object
       For g0 = 1 To 2
          .Controls("combobox" & g0).Clear
       Next
    End With
 End Sub

 というようにControlsコレクションの使用が必要になります。

 私も仕事では使ったことはありませんけど・・・。

 試してみてください。

 ichinose


 ichinoseさん
 かなり目からウロコ・・・^^;
 OLEobjectの中のControlsまでは頭が回りませんでした。
 さすが・・・ 何かに使えそうですが、何に使うか閃かない。
 また勉強させられました。 ありがとうです。

 (momo)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.