ワークシート上のコントロールの一覧を取得して操作する
お酒はほどほどにしなければ・・おいしいんですけどね!
頭痛さえなければ。。
うぅ・・
今回は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の次は操作を元に戻してくれると良いですね。
いつまで経っても移行できません。

↑ポチして頂けると、とても励みになります
頭痛さえなければ。。
うぅ・・
今回は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の次は操作を元に戻してくれると良いですね。
いつまで経っても移行できません。

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




