• ベストアンサー

「オブジェクト変数または With ブロック変数が設定されていません。」の修正方法が分かりません

 いつも勉強させていただいております.どうぞよろしくお願いいたします.  とんちんかんな質問でしたらもうしわけございません.  多分オブジェクト定義あたりの問題だと思うのですが, .NETでエクセルのオートシェイプ文字をいじる際, Dim objShape As Object Dim objSelection As Object For i = 1 To WB.Worksheets(N_s).Shapes.count objShape = WB.Worksheets(N_s).Shapes(i) If objShape.Type = 6 Then objSelection = objShape.Select() For Each tbox In objShape.Ungroup() If TypeName(tbox) = "TextBox" Then tbox.Text = Replace(tbox.Text, OldStr, NewStr) End If Next objSelection.ShapeRange.Regroup() '←ここでエラーが出ます Else End If Next ずっと調べておりますと,同じような質問があり,解決しているようなのですが, 理解できませんでした... http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29246&forum=7  objSelection As Objectで宣言しているからOK.というわけでは ないのでしょうか??  とんちんかんな質問かもしれませんが,なんでもアドバイスいただけれると うれしいです.どうぞよろしくお願いいたします.

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

  • ベストアンサー
回答No.2

#1 redfox63さんの回答について .NETなので、Setステートメントは必要ないです。 MSDNで調べてみただけですが、ShapeオブジェクトのSelectメソッドは「Subプロシージャ」なので戻り値はないようです。 なので、objSelectionに何も値が入っていないのではないかと。 MSDNでは、Shape.UngroupメソッドでShapeRageを返しているので、 > objSelection = objShape.Select() > For Each tbox In objShape.Ungroup() この2行が次のようになるのではないかと推測。 objShape.Select() objSelection = objShape.Ungroup() 'objSelectionにShapeRangeが入る For Each tbox In objSelection こうしておいて、再グループ化するときは、 > objSelection.ShapeRange.Regroup() ではなく objSelection.Regroup() とすればよいような気がします。 ご提示されたコードとMSDNを見ただけの推測回答ですが、ご参考になれば。

MKT_
質問者

お礼

 どうもありがとうございます!!  おっしゃるとおりでした!一瞬で自分のやりたかったことができました. >ShapeオブジェクトのSelectメソッドは「Subプロシージャ」なので戻り値はないようです。 >なので、objSelectionに何も値が入っていないのではないかと。 >MSDNでは、Shape.UngroupメソッドでShapeRageを返しているので  MSDNというとあの赤いページですよね...検索中にしょっちゅう ひっかかるのですが,いつも理解できず...  どういう理由でそうなるか,までご丁寧に説明いただき どうもありがとうございます.  ご説明いただいた戻り値の部分を今日の夜から勉強します. 今回Wizard_Zero様からいただいたような,今の自分が何を理解しておらず どのへんを勉強すればよさそうなのかが分かりやすいご回答は 非常にうれしいです.  夜遅い時間にかかわらずご回答いただき本当にありがとうございました!!

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

オブジェクトの代入には Setという特別な命令が必要になります If objShape.Type = 6 Then   ' 行頭に Setを追加します   Set objSelection = objShape.Select()   For Each tbox In objShape.Ungroup()     If TypeName(tbox) = "TextBox" Then       tbox.Text = Replace(tbox.Text, OldStr, NewStr)     End If   Next   objSelection.ShapeRange.Regroup() '←ここでエラーが出ます Else End If

MKT_
質問者

お礼

 どうもありがとうございます!  試してみましたが,入力するとSetが消えてしまいます.. もう少しべんきょうしてみます.アドバイスいただきどうも ありがとうございました!!

関連するQ&A