スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
拍手する
↑ポチして頂けると、とても励みになります

ワークシート上のコントロールの一覧を取得して操作する

お酒はほどほどにしなければ・・おいしいんですけどね!
頭痛さえなければ。。
うぅ・・

今回はExcelのVBAでワークシート上に設置したコントロールを列挙して操作する方法の私的メモです。
フォームコントロールをコンテナとして使用し、Controlsコレクションから列挙する方法はあるのですが、
基本的に私はVBAではフォームを使用しないため、別の方法はないかと長いこと悩んでいました。
VBAではCheckBoxが10個とか、少し規模が大きくなると一気にコーディングが煩雑で難しくなります。
本当はVBのようにコントロール配列が使えれば苦労はないのですが、
VBAでは何故かコントロール配列が使えないのですから・・・




OS:Windows 7 x64 Ultimate Edition
環境:Microsoft Office 2000, 2003 SP3

<ワークシート上のコントロールの一覧を取得して操作する>
下記コードでワークシート上のコントロールを全て取得、必要なものを操作します。

'シートの指定はインデックスを使用することもできます。
'下記の場合、「Sheet1」は操作が必要なシート名に合わせて変更します。
Dim objtmp as object
For Each objtmp in Thisworkbook.Worksheets("Sheet1").OLEObjects
   If objtmp.Name = "CheckBox1" Then
     objtmp.Object.Value = True
   End If

   If objtmp.Name = "TextBox1" Then
     objtmp.Object.Text = "AIUEO"
   End If

   If objtmp.Object.Caption = "Error" Then
     objtmp.Object.Caption = "OK"
   End If
Next

今回の最大のポイントは、取得したobjtmpからは直接操作ができないという点でした。

objtmp.Text = "AIUEO" ⇒ 実行時エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。

これを、下記のように書き換えるとすんなり動きます。
objtmp.Object.Text = "AIUEO" ⇒ OK!

これに気づくのに、非常に長い時間がかかってしまいました。
Google先生で検索しても、表題のような検索ワードではなかなか見つけられなかったのです。
ただ、検索文字の候補に上がってくるほど悩んでいる人も多いみたいなので、ここにメモしておきました。

--
ちなみに、オートシェイプに対してはShapesコレクションがあり、
これで似たような形のコードが書けそうになるのですが、
当然シェイプクラスのインターフェイスには操作に必要なメンバが準備されていません。
(というかShapesでも普通にコントロールが列挙されてくることに驚きました)

というか・・Office2007の次は操作を元に戻してくれると良いですね。
いつまで経っても移行できません。

拍手する
↑ポチして頂けると、とても励みになります

コメントの投稿

非公開コメント

Blog Search Form
Access Counter
since 2009/03/22
thank you for coming to my blog...
World Community Grid
参加中。ランク1万台を脱するのはいつの日か・・
カテゴリ
最新記事
・・新着順に5件表示中・・
コメント
月別アーカイブ
RSSリンクの表示
リンク
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。