- ベストアンサー
WordのVBAでコントロール名に変数を使う方法
- Wordでコントロールツールボックスのコントロールを複数個並べて、コントロール名を変数で切り替える方法について調べています。ExcelではOLEObjectsを使うことで実現できますが、Wordではコンパイルエラーが出てしまいます。
- 例えば、テキストボックスを3つ並べた場合、For文を使用して変数を使ってコントロール名を切り替えたいです。
- WordのVBAでコンパイルエラーが出ずにコントロール名に変数を使う方法について教えていただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
訂正: OleObject が、TextBox だけではないので、ClassType を分岐に加えました。 Sub Test2R() Dim b As MsoShapeType Dim shp As Variant Dim i As Integer i = i + 1 For Each shp In ThisDocument.Shapes If shp.Type = msoOLEControlObject Then If shp.OLEFormat.ClassType = "Forms.TextBox.1" Then shp.OLEFormat.Object.Text = Chr(64 + i) 'ABCにしてみました。 i = i + 1 If i >26 Then Exit For End If End If Next End Sub p.s. しかし、Word 2003 と Word 2007 とは、こういう違いがあるとは思いませんでした。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >Image1~Image20やCommonDialogは出てくるのに、TextBoxはありません。 こちらで試してみてください。 こんどは、Word2003で試してみました。 Sub Test2() Dim b As MsoShapeType Dim shp As Variant Dim i As Integer i = i + 1 For Each shp In ThisDocument.Shapes If shp.Type = msoOLEControlObject Then shp.OLEFormat.Object.Text = i i = i + 1 End If Next End Sub いずれは、どれかに当たりますね。(^^;
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 Excelのコードでも、 >For i=1 to 3 >strName = "TextBox" & i >Me.OLEObjects(strName).Object・・・ >next i ループするとき、コントロールツール側は、キメウチ的にはあまり書きませんね。TextBox の数がわかっていることが条件ですから。 フォームツール側の時に、そのような書き方になるのは、フォーム側は、コントロール配列のようなスタイルで、きちんと数が取れるからからですね。 さて、Wordの場合、Wordのバージョンは、Word 2003 ですから、コンテンツコントロールはサポートされていないはずです。私は、だいたい、以下のような書き方をしていますが、数が、明示的になっているなら、もちろん、"TextBox" & iでも、構わないと思います。 Document の中のコントロールツール等のコレクションの名称は、InlineShapesと言います。現在は、Word 2007 でチェックしていますが、もし不具合があれば、Word 2003 で再チェックします。 Sub Test1() Dim obj As Variant Dim i As Integer i = 1 For Each obj In ThisDocument.InlineShapes If obj.OLEFormat.Object.Name Like "TextBox#*" Then obj.OLEFormat.Object.Text = i '数字を表示 i = i + 1 End If Next End Sub
お礼
ご回答ありがとうございます。 今回は、テキストボックスが20個配置されていて、ユーザが指定した数(最大20)だけ、ある文字列(strUserとします)が入るということを実現したいと思っています。 ユーザが指定した数が5の場合 TextBox1.Text = strUser(1) TextBox2.Text = strUser(2) TextBox3.Text = strUser(3) TextBox4.Text = strUser(4) TextBox5.Text = strUser(5) Wendy02さんに教えていただいた方法を応用すればできそうなのですが、問題が発生しました。 現在、TextBoxの他に、ImageやCommonDialogのコントロールもありますが、オブジェクトとしてImageやCommonDialogは取得できているのですが、TextBoxが取得できません。 具体的には、obj.OLEFormat.Object.NameをDebug.printで、書かせてみると、Image1~Image20やCommonDialogは出てくるのに、TextBoxはありません。 自分でも調べますが、何かおわかりでしたら、教えてください。 よろしくお願いします。
- xls88
- ベストアンサー率56% (669/1189)
こんな風でどうでしょうか。 For i = 1 To ActiveDocument.ContentControls.Count If ActiveDocument.ContentControls.Item(i).Type = wdContentControlText Then MsgBox ActiveDocument.ContentControls.Item(i).Range.Text End If Next i
お礼
回答ありがとうございます。 自分の環境を書き忘れていて、大変申し訳ありませんが、Word2003で開発をしており、「ContentControls」がないようです。 教えていただいたソースを実行してみましたが、 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」というエラーが出てしまいました。 他に方法はないでしょうか。
お礼
ありがとうございます。 テキストボックスも取得できました。 ただ、今回の「Shapes」では、CommonDialogとImageコントロールは取得できないようです。 なので、例えば、ImageとTextBoxを両方取得するときは、「InlineShapes」と「Shapes」とを組み合わせる必要がありそうです。 教えていただいた方法で、色々と応用ができそうなので、本当に助かりました。 ありがとうございました。