• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:WordのVBAにてコントロール名に変数を使いたい)

WordのVBAでコントロール名に変数を使う方法

このQ&Aのポイント
  • Wordでコントロールツールボックスのコントロールを複数個並べて、コントロール名を変数で切り替える方法について調べています。ExcelではOLEObjectsを使うことで実現できますが、Wordではコンパイルエラーが出てしまいます。
  • 例えば、テキストボックスを3つ並べた場合、For文を使用して変数を使ってコントロール名を切り替えたいです。
  • WordのVBAでコンパイルエラーが出ずにコントロール名に変数を使う方法について教えていただけると助かります。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 とは、こういう違いがあるとは思いませんでした。

hana111_1978
質問者

お礼

ありがとうございます。 テキストボックスも取得できました。 ただ、今回の「Shapes」では、CommonDialogとImageコントロールは取得できないようです。 なので、例えば、ImageとTextBoxを両方取得するときは、「InlineShapes」と「Shapes」とを組み合わせる必要がありそうです。 教えていただいた方法で、色々と応用ができそうなので、本当に助かりました。 ありがとうございました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >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)
回答No.2

こんにちは。 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

hana111_1978
質問者

お礼

ご回答ありがとうございます。 今回は、テキストボックスが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)
回答No.1

こんな風でどうでしょうか。 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

hana111_1978
質問者

お礼

回答ありがとうございます。 自分の環境を書き忘れていて、大変申し訳ありませんが、Word2003で開発をしており、「ContentControls」がないようです。 教えていただいたソースを実行してみましたが、 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」というエラーが出てしまいました。 他に方法はないでしょうか。

関連するQ&A