• ベストアンサー

オブジェクト名が同じ図形の変更

アクティブセル値と同じオブジェクト名のテキストボックスが複数有ります。そのテキストボックスの大きさやテキスト(アクティブセル値と同じ)の内容に書き換えたいと思っています。 サイズとテキスト書き込みのステートメントをFor Eachで括りました。 途中にMsgboxを入れて確認するとボックスの数だけ繰り返しているのは間違いないのですが、変更できるのは1個だけです。 最初に作った(?)テキストボックスのみを何度も書き換えているのかな?と思っているのですが、複数個の変更をするにはどの様にしたらいいのでしょうか。 宜しくお願い致します。 Sub test() A = ActiveCell.Formula For Each shp In ActiveSheet.Shapes If shp.Name = A Then ActiveSheet.Shapes(A).Select Selection.ShapeRange.Height = 19.5 Selection.ShapeRange.Width = 19.5 With ActiveSheet.Shapes(A).TextFrame .Characters.Text = A End With With Selection.Font .Size = 7 End With End If Next shp End Sub

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

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

For Each shp In ActiveSheet.Shapes で全シェープを1個づつチェックしているのに、途中で ActiveSheet.Shapes(A).Select とか With ActiveSheet.Shapes(A).TextFrame としているために、変数Aに格納されている名前のシェープの「最初のシェープ」を選んで、そのシェープに対して各種設定しているためだと思います。 で、以下みたいでどうでしょうか? Sub test1() Dim A As String Dim shp As Shape A = ActiveCell.Formula For Each shp In ActiveSheet.Shapes If shp.Name = A Then shp.Select Selection.Height = 19.5 Selection.Width = 19.5 Selection.Text = A Selection.Font.Size = 7 End If Next shp End Sub または Sub test2() Dim A As String Dim shp As Shape A = ActiveCell.Formula For Each shp In ActiveSheet.Shapes If shp.Name = A Then shp.Height = 19.5 shp.Width = 19.5 shp.TextFrame.Characters.Text = A shp.TextFrame.Characters.Font.Size = 7 End If Next shp

ae-1sp
質問者

お礼

原因の解説ありがとうございます。 なるほど、Selectせているのダメなのですね。 まだまだ未熟で「マクロの記録」に頼る部分も多く、中々その辺りが理解出来ていませんでした。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

疑問点 (1)A = ActiveCell.Formula はA = ActiveCell.Valueでは (2)Shapesを探すのに繰り返しているが、Aのほかに繰り返さなくて良いのかな。Aが複数あるという全提でこうなるのか。 (3)アクティブセル値と同じオブジェクト名のテキストボックスが複数有ります テキストボックスには「オブジェクト名」しかないと思うがどういうこと。 ーーー 私の場合、オートシェイプの横書きテキストボックスを1つ張り付け。 その名前がText Box 3であるので A1にText Box 3 を入れてアクチブにして下記を実行。 Sub test03() Dim shp As Object A = ActiveCell.Value For Each shp In Worksheets("Sheet1").Shapes If shp.Name = A Then MsgBox shp.Name ActiveSheet.Shapes(A).Select Selection.ShapeRange.Height = 19.5 Selection.ShapeRange.Width = 40 ActiveSheet.Shapes(A).TextFrame.Characters.Text = "SSA" ActiveSheet.Shapes(A).TextFrame.Characters.Font.Size = 17 End If Next End Sub で1つのシェイプのテキストボックスに対し、文字の設置と、フォントの設定、ボックスのサイズ設定はうまく行った。 参考に。 ただし、>そのテキストボックスの大きさやテキスト(アクティブセル値と同じ)の内容に書き換えたいと思っています。 が、小生の浅学か、出来てない。

ae-1sp
質問者

お礼

ありがとうございます。 (2)(3)についてはNo,1さんのお手数ですが、お礼欄参照してください。 (1)私は何時も値を取得するのにFormulaを使っていますが、Valueでも可能なのでしょうか?チョット良く判りません。 人間がアクティブにせずに実行したいと思っています。 説明不足の性で混乱を招いた様で申し訳ありませんでした。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

1. Text Boxの名前はいつ、どこで、どういう風に決めているのですか。オブジェクト名が同じText Boxなんてありません。全部名前が違うはずです。 2. はじめにAをActiveCellからとっていて、For文実行中、Aは変わらないからいつも同じだ。 3. If文で名前がAだったらといっているので、何回繰り返そうと、Aは同じだから、なまえがAのText Boxがあったとしたら、それしか変更されない。 4. つぎのようにすれば、全部変更するが、特定の名前のText Boxだけ変更したいなら、If文のAが変わっていくようにしなければだめだ。 Sub test() A = ActiveCell.Formula For Each shp In ActiveSheet.Shapes MsgBox shp.Name 'If shp.Name = A Then 'ActiveSheet.Shapes(A).Select shp.Select Selection.ShapeRange.Height = 19.5 Selection.ShapeRange.Width = 19.5 'With ActiveSheet.Shapes(A).TextFrame With shp.TextFrame .Characters.Text = A End With With Selection.Font .Size = 7 End With 'End If Next shp End Sub

ae-1sp
質問者

お礼

早速のご回答ありがとうございます。 説明不足で申し訳有りません。これ以外の部分は雑多になる為省いていました。 1・ コレとは別のプロシージャーでセルの値(同列に1~順番に並んだ複数の値)と同じ名前を持ったオブジェクトを作成しています。 2、3・ この文は本来同列に入力されている値のMinとMaxを取得して、Min=MaxとなるまでDo Whilで繰り返しています。

関連するQ&A

  • エクセルVBA オートシェイプを操作したいです

    エクセルでセルの入力内容によって楕円をオートシェイプで出現させたいと思います。 http://oshiete1.goo.ne.jp/qa809742.htmlで見つかったものを参考にし、 Private Sub worksheet_Activate() Dim Shp As Shape Set P11 = Range("P11") If P11 Is Nothing Then Exit Sub If P11.Value = 1 Then For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N14:N15")) Is Nothing Then Shp.Delete End If Next Shp With ActiveSheet.Range("N14:N15") ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _ Left:=.Left,TOP:=.TOP,Width:=.Width,Height:=.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse End With Range("N14").Select Else For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N14:N15")) Is Nothing Then Shp.Delete End If Next Shp End If If P11.Value = 2 Then For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N16")) Is Nothing Then Shp.Delete End If Next Shp With ActiveSheet.Range("N16") ActiveSheet.Shapes.AddShape(Type:=msoShapeOval, _ Left:=.Left, TOP:=.TOP, Width:=.Width, Height:=.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse End With Range("N16").Select Else For Each Shp In ActiveSheet.Shapes If Not Application.Intersect(Shp.TopLeftCell, _ Range("N16")) Is Nothing Then Shp.Delete End If Next Shp End If End Sub とつなげて見ました。 動くには動くのですが、データ元のセルがP11からT30と100セルあり、さらにP11に入力されるデータが1,2,3,4の4種類、AQ11に5,6,7,8,9の5種類などと、ばらばらです。 P11に1が入力されるとN14:N15(結合されています)に円が入り、2が入力されるとN16に円が入る。 Q11に5が入力されるとR13に円が入り、6が入力されるとR14:R15に円が入る・・・・のようにしたいのです。 一生懸命、セルNo.を打ち込んでいたら、 「コンパイルエラー:プロシージャが大きすぎます」とエラーが出てしまいました。 ループさせればよいのだろうと試してみたのですが、元のセルの指定方法や、オートシェイプの出現させるせるの指定方法がわかりません。 どのようにすれば、データー元の範囲を指定して、それに対応したセルにオートシェイプを出現させる事が出来るようになるでしょうか。 お知恵を貸していただけないでしょうか。よろしくお願い致します。

  • Excel VBA テキストボックスの値の取得

    テキストボックスの値が必要となり参照しようと思い、検索したところdebug.printにある3つの方法がヒットし、試して見ましたが、エラーになります。 テキストボックスの名前にはどれもtxtの文字を含んでいます。 Sub ShapeValue() Dim Shp As Shape For Each Shp In ActiveSheet.Shapes If InStr(Shp.Name, "txt") <> 0 Then Debug.Print Shp.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません。 Debug.Print Shp.TextFrame2.TextRange.Text '指定された値は境界を超えています。 Debug.Print Shp.ShapeRange.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません End If Next Shp End Sub どうすれば取得できるでしょうか?

  • VBAのGroup化について

    お世話になります。以下のマクロがうまく動きません。 ------------------------------------------------- Dim objShp1 As Shape For Each objShp1 In ActiveSheet.Shapes If objShp1.Name = "Picture 3" Then ActiveSheet.Shapes.Range(Array("A", "B", "Picture 3")).Select Selection.ShapeRange.Group.Select Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 Else ActiveSheet.Shapes.Range(Array("A", "B")).Select Selection.ShapeRange.Group.Select <---------(1) Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 End If Next ------------------------------------------------- このマクロは全体の一部分になりますが、(1)のところでエラーになります。 どこが間違っているのか、さっぱりわかりません。 すみませんが、お助けいただければ幸いです。

  • 図形 Selectionが省略できない VBA

    「タイトル」という名の図形はシート上に存在するのですが、 Sub a() ActiveSheet.Shapes.Range(Array("タイトル")).ShapeRange.Height = 110 End Sub Sub b() ActiveSheet.Shapes.Range(Array("タイトル")).Select Selection.ShapeRange.Height = 110 End Sub aだとエラーになりますが、 bだと正常に動きます。 SelectやSelectionは省略できるものだと思ってるのですが なぜaだとエラーになるのでしょうか? 一度図形をアクティブにする動作が必要なのですか?

  • Excelマクロ ○印図形を消したい

    ○印図形を消したい Private Sub CommandButton2_Click() ' ○印をつける Dim a As Range If TypeName(Selection) = "Range" Then Set a = Selection ActiveSheet.Shapes.AddShape(msoShapeOval, a.Left, _ a.Top, a.Width, a.Height).Select Selection.ShapeRange.Fill.Visible = msoFalse a.Select End If End Sub Private Sub CommandButton3_Click() 上記のマクロでつけた○印を下記のようなマクロで(指定の範囲のセルにつけた○印を全て)消したいのですが、上記のマクロは問題なく動作するのですが、下記のマクロがうまく動きません、どこをどのように変更したらよいのでしょうか?、どなたかご教示ください。 ' 指定したセル範囲にある図形を削除する() ' ○印の削除 指定セル範囲 = "U32:X41" With ActiveSheet Set セル範囲 = .Range(指定セル範囲) For Each 図形 In .Shapes If 図形.Type = msomsoPicture Then Set 共有セル範囲 = Intersect(Range(図形.TopLeftCell, _ 図形.BottomRightCell), セル範囲) If Not (共有セル範囲 Is Nothing) Then 図形.Delete End If End If Next End With End Sub

  • エクセルVBAのWith~End With構文

    Win2000エクセル2000です。 下記のMacro11はTEST11のようにWith~End Withでくくれると思うのですがエラーになります。 どこがおかしいのでしょうか? Sub Macro11() ActiveSheet.Shapes.AddShape(msoShapeSun, 450, 150, 120, 120).Select Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 Selection.ShapeRange.Fill.ForeColor.SchemeColor = 10 Selection.ShapeRange.Fill.OneColorGradient msoGradientFromCorner, 1, 0.59 Selection.ShapeRange.Adjustments.Item(1) = 0.3016 Selection.ShapeRange.ThreeD.SetThreeDFormat msoThreeD7 Selection.ShapeRange.ThreeD.PresetMaterial = msoMaterialMetal Selection.ShapeRange.ThreeD.Depth = 144# End Sub Sub TEST11() With ActiveSheet.Shapes.AddShape(msoShapeSun, 450, 150, 120, 120) .ShapeRange.Line.Weight = 0.75 .ShapeRange.Line.ForeColor.SchemeColor = 64 .ShapeRange.Fill.ForeColor.SchemeColor = 10 .ShapeRange.Fill.OneColorGradient msoGradientFromCorner, 1, 0.59 .ShapeRange.Adjustments.Item(1) = 0.3016 .ShapeRange.ThreeD.SetThreeDFormat msoThreeD7 .ShapeRange.ThreeD.PresetMaterial = msoMaterialMetal .ShapeRange.ThreeD.Depth = 144# End With End Sub

  • 図形に赤枠をつける

    指定の場所 例;C1に画像を挿入し、 挿入した画像を縦横比固定120パーセント、 枠を赤に太さを2.25でつけるマクロを書きたいのですがどうしても上手くいきません 赤枠と太さはどのように記述したらよろしのでしょうか? Sub 図形リサイズ縦横比固定120パーセント() With Selection.ShapeRange .LockAspectRatio = msoTrue '縦横比固定 .Width = .Width * 1.2 '120%に図形サイズ変更 End With ActiveSheet.Shapes With Selection.ShapeRange.Line .ForeColor.RGB = RGB(255, 0, 0) '赤枠に .Weight = 2.25 '線の太さを2.25に End With End Sub

  • VBA フォントの色を設定するには?

    Sub test() Dim shp As Shape With ActiveWindow.Selection.SlideRange For Each shp In .Shapes shp.TextEffect.FontSize = 9 Next shp End With End Sub これで、現在のシートのテキストのすべてのフォントサイズを設定できたのですが、 全ての色を設定するにはどうすればいいでしょうか? たとえば現在のシートのすべての文字の色を赤(255)にしたい場合は、どういうコードになりますか? ヘルプを見てもよくわかりませんでした。

  • エクセルマクロでオブジェクトを選択する方法

    エクセル(2002)を使っています。マクロの記録機能を使って円を描くマクロを作成しました。 Sub Maru(xpos, ypos, hankei) ActiveSheet.Shapes.AddShape(msoShapeOval, xpos, ypos, hankei, hankei).Select Selection.ShapeRange.Fill.Visible = msoFalse Selection.ShapeRange.Fill.Solid Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255) End Sub 次にこの円を削除したいと思い、同じようにマクロの記録機能を使ったところ、 Sub Macro3() ActiveSheet.Shapes("Oval 64").Select Selection.Delete End Sub となりました。"Oval 64"はオブジェクトの名前のようですが、名前がわかっていないオブジェクト(但し上記マクロで書いたので場所はわかっている)を選択するにはどうしたらいいでしょうか。

  • マクロにてオブジェクトの線を太線にするには?

    テキストBOXとオブジェクトが数個混在しているシートにおいて、 1.テキストBOXは文字有りで枠線なし 2.オブジェクトは線あり の場合で、 ドラッグして選択した任意の個数のテキストBOXの文字は太字に                 オブジェクトの線は太線に 変更するマクロを作りたいのですが、よろしくおねがいします。 ちなみに、EXCELでは以下でOKです。 Sub aaa()   Dim SelOb As Object   Set SelOb = Selection   If TypeName(SelOb) = "DrawingObjects" Then     For Each DrOb In SelOb       If TypeName(DrOb) = "TextBox" Then        Selection.Font.Bold = True       Else        Selection.ShapeRange.Line.Weight = 1.5       End If     Next   End If   Set SelOb = Nothing End Sub

専門家に質問してみよう