アプリ版:「スタンプのみでお礼する」機能のリリースについて

Wordでテキストボックスをレイアウト枠に変換するマクロを作りました。
簡単なコードだと思うのですが、「オブジェクト変数またはブロック変数が設定されていません」というエラーが出てしまいます。
どこに原因があるのでしょうか?

Sub テキストボックス変換()
Dim i
Dim sp As Shape
For i = 1 To ActiveDocument.Shapes.Count
If sp.Type = msoTextBox Then
sp.ConvertToFrame
End If
Next
End Sub

A 回答 (3件)

またまた登場、kobouzuなり。



Sub テキストボックス変換()
 Dim i
 Dim sp As Shape
● Set sp = ActiveDocument.Shapes(i)
▲ For i = ActiveDocument.Shapes.Count To 1 Step -1
  If sp.Type = msoTextBox Then
    sp.ConvertToFrame
  End If
 Next
End Sub

●と▲の順序が逆ですよ~、、、(^^;;;

------正しい順序------------------------------------
 For i = ActiveDocument.Shapes.Count To 1 Step -1
   Set sp = ActiveDocument.Shapes(i)
-----------------------------------------------------

それにしても何故、取っ付きにくいWord VBAを勉強されているのでしょう。
ExcelVBAに比べて、WordVBAは回答もつきにくいですよ。
    • good
    • 0
この回答へのお礼

>●と▲の順序が逆ですよ~、、、(^^;;;

そうなのですかぁ・・・? 「Set sp = ActiveDocument.Shapes(i)」
は上だと思ってました。なにせまだマクロ勉強し始めて数週間なもので。
とりあえずうまくいきました!

>それにしても何故、取っ付きにくいWord VBAを勉強されているのでしょう。

在宅でWord編集の仕事をしているんですよ。少しでも作業を効率アップさせたいというのが目的なんです。

>ExcelVBAに比べて、WordVBAは回答もつきにくいですよ。

そうなんですよね。Excel VBAは書籍も迷うほどあるというのに、Word VBAは今手に入るのは一冊のみ。ネットでも情報が乏しいし、詳しい方も少ないんでしょうねー。
でも、今はWordの仕事がほとんどだし、Wordで頑張ります。
Excelの仕事が増えれば、VBAも学びたいけど、まず一般機能からの勉強が必要だろうなぁ・・・。

またここでお世話になるかもしれませんが、そのときはよろしくお願いします。

今回はありがとうございました<m(__)m>

お礼日時:2007/04/12 23:38

No1,kobouzuです。



>Set sp = ActiveDocument.Shapes(i)」を追加したところ
>「指定したコレクションに対するインデックスが境界を超えています」というエラーが出てしまいました。

おっと、最重要事項を抜かしてました。(^^;;;

今回のようにコレクションの中のオブジェクトが減っていく処理をする時に
「For i=1 to 」のようにカウンターを使ってまわす場合は、
カウンターを、始めの方から最後へとまわすのではなくて
最後から始めの方へ、逆方向にまわさなければなりません。

For i = ActiveDocument.Shapes.Count To 1 Step -1

ですから、コレクションを扱う場合(特に今回のような場合)は、
コレクション用のFor Each を使う方がベターかな、と。
 

この回答への補足

kobouzuさん、何度もありがとうございます。

>カウンターを、始めの方から最後へとまわすのではなくて
最後から始めの方へ、逆方向にまわさなければなりません。

そうなのですか・・・。全然知らなかったです。
で、For i = ActiveDocument.Shapes.Count To 1 Step -1を追加しましたが、まだエラーがでます。どこが問題なのでしょうか?

Sub テキストボックス変換()
Dim i
Dim sp As Shape
Set sp = ActiveDocument.Shapes(i)
For i = ActiveDocument.Shapes.Count To 1 Step -1
If sp.Type = msoTextBox Then
sp.ConvertToFrame
End If
Next
End Sub

>ですから、コレクションを扱う場合(特に今回のような場合)は、
コレクション用のFor Each を使う方がベターかな、と。

やっぱりそうなんでしょうねぇ…。最近マクロの勉強を始めたので、今回はとりあえず構文を覚えるためにやってみているのですが、難しいですねー。

補足日時:2007/04/12 17:18
    • good
    • 0

こんばんは。



WordのVBAは使ったことないですが。。。

オブジェクト変数、SPにオブジェクトがセットされてないですよね。
 
For i = 1 To ActiveDocument.Shapes.Count
●Set sp = ActiveDocument.Shapes(i)
If sp.Type = msoTextBox Then

と●部分を追加するか、For Eachを使って

For Each sp In ActiveDocument.Shapes

でどうでしょう。
 

 
    • good
    • 0
この回答へのお礼

kobouzu_suさん、ありがとうございます。
「Set sp = ActiveDocument.Shapes(i)」を追加したところ、今度は「指定したコレクションに対するインデックスが境界を超えています」というエラーが出てしまいました。

>For Each sp In ActiveDocument.Shapes

はじめは上記の構文で作ってみたのです。
これでうまくいったのですが、マクロの勉強中なので、今度は「For to」の構文で作ってみようと思ったのです。が、なぜかエラーが出てうまくいかないのです・・・。
下記の構文ではエラーが出なかったんですけどね~。

Sub テキストボックス変換2()
Dim sp As Shape
For Each sp In ActiveDocument.Shapes
If sp.Type = msoTextBox Then
sp.ConvertToFrame
End If
Next
End Sub

お礼日時:2007/04/12 00:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!