• ベストアンサー

VBAでオートシェープのテキストを取得の際、ShapesとDrawingObjects?

エクセル2003です。 オートシェープの基本図形の「額縁」に以下のマクロを登録しました。 マクロを呼び出したオートシェープに表示してあるテキストを取得しようとするものです。 Sub test() x = Application.Caller MsgBox ActiveSheet.Shapes(x).Characters.Text End Sub ところが実行時エラーとなってしまいます。 試行錯誤の結果、ShapesをDrawingObjectsに変えるとうまくいきます。 なぜでしょうか?

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

Shapses(x) が テキストを含むとは限らないからでは? MsgBox ActiveSheet.Shapes(x).Name は通用します。 DrawingObjectsは互換用隠しオブジェクトですので使いたくないなら下記とか。 Sub aaa()  x = Application.Caller  MsgBox ActiveSheet.Shapes(x).Name  MsgBox ActiveSheet.Shapes(x).TextFrame.Characters.Text End Sub

shishishishi
質問者

お礼

> Shapses(x) が テキストを含むとは限らないからでは? 仰せの通りですね。理解できました。 > MsgBox ActiveSheet.Shapes(x).TextFrame.Characters.Text TextFrameを使うんですね、ありがとうございました。 うまくいきました。

関連するQ&A

  • オートシェイプの名前の取得

    エクセル2000を使用してます オートシェイプをクリックしたときはわかるのですが・・・ Sub オートシェイプ14_Click() Dim objShape As Shape Dim ShapeName As String Set objShape = ActiveSheet.Shapes(Application.Caller) ShapeName = objShape.Name End Sub 新規でオートシェイプ作成されたとき、その名前を取得するにはどうしたらいいのでしょう。 作成された順番にセルに表示したいのです

  • Excelでグループ化したオートシェイプにテキストを編集するコード

    Excelの四角のオートシェイプで、例えば、「四角1」「四角2」「四角3」という名前のオートシェイプが3つあったとしてテキスト編集で同じ文字列を入れたいとき、 For a = 1 To 3 ActiveSheet.Shapes("四角" & a).Select Selection.Characters.Text = "文字列" Next a とすればできるのですが、「四角1~3」をグループ化し、名前を「四角」としたとき、 ActiveSheet.Shapes("四角").Select Selection.Characters.Text = "文字列" とするとエラーが出てしまいます。グループ化されたオートシェイプのテキスト編集は、一度グループを解除し、それぞれテキスト編集しなければならないのでしょうか? 回答よろしくお願いします。

  • ShapeのVBAの中での取り扱い

    ShapeのVBAの中での取り扱いに関して、サジェスチョン願います。 Shapeに文字が書き込まれていない段階で、選択して文字を読み込み判定しようとするとエラーとなります。 下記のVBAでは、5番目のShapeが該当します。 このエラーを防ぐためには、On Error Resume Nextが有効ですが、他の方法を探しています。例えば、charactor=trueみたいなもの。 ----- Sub Shapeの調査() Dim nametemp(10) As String Dim temp As Integer Dim i As Integer Dim aaa As Variant 'On Error Resume Next ActiveSheet.Shapes.AddShape(msoShapeRectangle, 50, 50, 50, 50).Select ActiveSheet.Shapes.AddShape(msoShapeOval, 100, 100, 50, 50).Select ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 150, 150, 50, 50).Select ActiveSheet.Shapes.AddShape(msoShapeRectangle, 200, 200, 50, 50).Select ActiveSheet.Shapes.AddShape(msoShapeOval, 250, 250, 50, 50).Select temp = ActiveSheet.Shapes.Count For i = 1 To temp ActiveSheet.Shapes(i).Select nametemp(i) = ActiveSheet.Shapes(i).Name Next For i = 1 To temp / 2 + 1 '4つのshapeに対し、文字を書き込もうとする ActiveSheet.Shapes(nametemp(i)).Select Selection.Characters.Text = "" Next For i = 1 To temp / 2 '3つに対して、文字を書き込む ActiveSheet.Shapes(nametemp(i)).Select Selection.Characters.Text = "zzzzz" Next For i = 1 To temp ActiveSheet.Shapes(nametemp(i)).Select aaa = Selection.Characters.Text '<--5番目のShapeに対し If aaa = "zzzzz" Then MsgBox (aaa)'<--errorとなる。 Next End Sub

  • JavaScriptで書き出したオートシェイプにテキストを挿入したいの

    JavaScriptで書き出したオートシェイプにテキストを挿入したいのですができません。 先日、ExcelのシートにJavaScriptでオートシェイプを書き出す方法を質問した者です。 今度は書き出したオートシェイプにテキストを挿入したいのですが上手くいきません。 どうすれば良いのか教えてください。 ※またもやJavaScriptで解決したいです。 なお、現在悩み中のソースは以下のようです。 ※教えて頂いたソースほとんどそのままですが... function createShapes() { var excel = new ActiveXObject( "Excel.Application" ); excel.visible = true; var sheet = excel.Workbooks.Add().activeSheet; // オートシェイプ挿入:引数の105は吹き出しを示す sheet.Shapes.AddShape(105, 123, 37.5, 151.5, 94.5); // ココでメソッド、プロパティがないとエラーになってしまう...  sheet.Shapes("AutoShape 1").Characters.Text = "ほげほげ"; } よろしくお願いします。

  • エクセル2007でVBAが動きません、助けて下さい

    先日、使用していたエクセルを2003から2007に変更した所、 オブジェクトのテキストが読み込めなくなってしまいました。 マクロの記録なども試したのですが、問題が解決せず 困っています。 原因が分かる方が入らしたら、ぜひとも教えてください。 =================================== Sub namae() Dim namae1 As String Dim namae2 As String namae1 = Application.Caller namae2 = ActiveSheet.Shapes(namae1).TextFrame.Characters.Text MsgBox namae2 End Sub

  • 図形オートシェイプ内のテキスト検索マクロ作成についての質問

    VBS2年目のプログラマーです。 Excelで図形オートシェイプ内のテキストが検索できないので、 マクロを作成してみようと思いましたが2点問題が発生しましたので 解決方法または実現方法をご教授ねがいます。 (目標マクロ機能概要) (1)InputBoxで検索文字列を入力 (2)検索文字列と一致するテキストを持つ図形を選択 (3)検索文字列と一致する次の図形を検索するかをMsgboxから選択  (この時、一致する図形は選択されている状態であってほしい) (4)(3)で次の図形を検索しない、または図形をすべて検索するとマクロ終了 (問題) 1.機能概要(2)の選択される図形が現在のExcel画面外にある場合、画面が移動しないため、どこに検索ヒットした図形があるか使用者がわからない 2.機能概要(3)で、Msgbox実行時に図形選択が表示されず現在どの図形を選択しているのか使用者がわからない 問題1は、autoshapeオブジェクトのtop,left属性などを 使うしかないのかなとぼんやり考えています。 以下、コードです。 お忙しいところ、申し訳ありませんが 以上、よろしくお願いします。 ************************** Sub GetShapesText() Dim wk_shp As Shape 'オートシェイプ格納変数 Dim wk_search_str As String '検索文字列変数 '*** 検索文字列入力処理 *** wk_search_str = InputBox("検索する図形オートシェイプのテキストを入力してください。", "オートシェイプ内テキスト検索") If (Len(wk_search_str) = 0) Then '検索文字列が未入力の場合は、マクロ終了 Exit Sub End If '*** オートシェイプ検索処理 *** For Each wk_shp In ActiveSheet.Shapes If InStr(wk_shp.Name, "Line") = 0 Then 'オートシェイプが線(Line)以外の場合のみ以下を処理 If (InStr(wk_shp.TextFrame.Characters.Text, wk_search_str) > 0) Then 'オートシェイプのテキストに検索文字列が含まれる場合のみ以下を処理 wk_shp.Select '検索ヒットしたオートシェイプを選択 wk_next_search_flg = MsgBox("次を検索しますか?", vbYesNo) If (wk_next_search_flg = 7) Then '次を検索しない場合は、検索を終了 Exit For End If End If End If Next End Sub **************************

  • エクセルVBAの記述方法の質問です。

    エクセルです。12個のセルの文字列をオートシェープの吹き出しに順に表示させるマクロをつくりました。 Sub tenki2() Dim i As Integer Dim a As String For i = 1 To 12 a = Cells(i, 2).Value ActiveSheet.Shapes("AutoShape 4").Select Selection.Characters.Text = a Application.Wait Now + TimeValue("00:00:05") Next i End Sub これで思った通り表示されるのですが、できればオートシェープをセレクトしないようにしたいのです。 (シートを保護するため) それで ActiveSheet.Shapes("AutoShape 4").Select Selection.Characters.Text = a のところを ActiveSheet.Shapes("AutoShape 4").Characters.Text = a と変えたのですが、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」という実行時エラーがでてしまいました。書き方のどこがまずかったのでしょうか?ご教示いただければ幸いです。

  • Excelのマクロを使用してオートシェイプ図形の色を変えたいのです。

    Excelのマクロを使用してオートシェイプ図形の色を変えたいのです。 オートシェイプ図形を50個ならべて、マウスでクリックしてものは色が変わるようにしたいと思います。 マクロ記録をすると以下のようになりました。 Sub Macro1() ActiveSheet.Shapes("AutoShape 1").Select Selection.ShapeRange.Fill.ForeColor.SchemeColor = 45 Selection.ShapeRange.Fill.Visible = msoTrue Selection.ShapeRange.Fill.Solid End Sub このプログラムを50個書くわけにはいかないのですが、プログラムで処理するのに問題点が2つ出てきました。 ・オートシェイプ図形の名前が"AutoShape 1"となっていますが、これを変更したいのですが、書式設定にはありませんでした。変更するにはどうすればよいのでしょう? ・クリックしたオートシェイプ図形がどれであるかを返す関数がないと、どの図形がクリックされたかわからないのですが、これを返す関数はあるのでしょうか? よろしくお願いします。

  • エクセルVBAでオートシェープを識別して削除したいのです・・・

    エクセルシートにたくさん貼り付けた画像を一度に削除するため、下記のようなマクロを作成しました。 しかし、これでは「テキストボックス」や「→」のようなオートシェープも全部消えてしまいます。 画像データ(図)だけを認識して消すにはどうすればよいのでしょうか? Sub sakujo() Dim Myshape As Shape For Each Myshape In ActiveSheet.Shapes If Myshape.Type <> msoFormControl Then Myshape.Delete End If Next End Sub

  • Excel VBAのオートシェイプの名前の取得(?)

    いつもお世話になっております。 ある図形[名前:グループ1](イメージとテキストをグループ化したもの)と ある図形[名前:グループ2](イメージとテキストをグループ化したもの)を コネクター[名前:コネクター1]で接続しています。 (□―□ コンナカンジ・・・) 画面上のどちらかの図形をクリックした時に、 (1)クリックされた図形の名前を取得 (2)クリックされた図形に繋がっているコネクタの情報を取得、 (3)さらにそのコネクタの接続先の図形の名前を取得する ・・・というようなVBAのプログラムを組んでいるのですが・・・、 (1)(クリックされたオートシェイプの名前を取得) Dim objShape As Shape Dim ShapeName as string Set objShape = ActiveSheet.Shapes(Application.Caller) ShapeName = objShape.name (2)(繋がっているコネクタの情報を取得) ※正確には画面上の全シェイプをチェックしコネクタなら配列に格納 For Each sh In ActiveSheet.Shapes 'コネクタ検索 If (sh.Connector = msoTrue) Then Set con(i) = sh i = i + 1 End If Next この後、 If strShapeName = con(i).ConnectorFormat.BeginConnectedShape.Name then・・・ If strShapeName = con(i).ConnectorFormat.EndConnectedShape.Name Then・・・ というチェックをし、Trueなら、選択した図形にくっついているコネクタなんだな・・・というチェックをしたいのですが、ここで質問です。 (1)の段階で選択された図形の名前は、"グループ1"。 しかし、(2)のcon(i).ConnectorFormat.BeginConnectedShape.Nameでコネクタと繋がっている同じ図形の名前は、VBA上では何故か"Freeform 1"という名前を取得してしまいます。 これでは永遠に一致する事はありません。 Excelのワークシート上の左上にある名前空間(?シェイプを選択すると名前が出てくるところ・・・)には"グループ1"と表示されます。 しかし、ここに"Freeform 1"と入れても同じ図形が選択されます。 同じ図形なのに何故二つの名前を持ってしまっているのでしょうか・・・? そしてどうやったら、con(i).ConnectorFormat.BeginConnectedShape.Nameで、"グループ1"の名前を取得するのでしょうか?? どなたかご教授下さい。

専門家に質問してみよう