すみません、教えてください。
以下のマクロは正常に動きます。
Sub TEST()
With ActiveSheet
For Each s In .Shapes
If s.AutoShapeType = msoShape5pointStar Then s.Delete
Next
.Cells.Interior.ColorIndex = 1
Set AA = .Shapes.AddShape(msoShape5pointStar, 55, 22, 25#, 25#)
AA.Fill.Visible = msoTrue
AA.Fill.Solid
AA.Fill.ForeColor.SchemeColor = 13
AA.Fill.Transparency = 0#
AA.line.Weight = 0.75
AA.line.DashStyle = msoLineSolid
AA.line.Style = msoLineSingle
AA.line.Transparency = 0#
AA.line.Visible = msoTrue
AA.line.ForeColor.SchemeColor = 64
' AA.Copy '(1)
' .Paste '(1)
' Set AB = Selection '(1)
' .Range("A1").Select'(1)
Set AB = AA.Duplicate '(2)
AB.Top = 44
AB.Left = 110
' AB.ShapeRange.Fill.ForeColor.SchemeColor = 10'(1)の2
AB.Fill.ForeColor.SchemeColor = 10 '(2)の2
End With
End Sub
ところが、 Set AB = AA.Duplicate '(2)の部分を、コメントアウトしている '(1)の記述に変えると、
AB.Fill.ForeColor.SchemeColor = 10 '(2)の2 の部分も
' AB.ShapeRange.Fill.ForeColor.SchemeColor = 10'(1)の2
に変えないとエラーになります。
' AA.Copy '(1)
' .Paste '(1)
' Set AB = Selection '(1)
も
Set AB = AA.Duplicate '(2)
も、同じことのように思えるのですが、この違いで、ShapeRangeというのを入れたり消したりしなければならないのはどうしてでしょうか?
エクセルは2000です。
No.5ベストアンサー
- 回答日時:
要は、
変数への格納の仕方、
Objectの指定の仕方が違う、
という話です。
Sub try4()
Dim A As Object
Dim B As Object
With ActiveSheet
With .Shapes.AddShape(msoShape5pointStar, 100, 100, 100, 100)
.Duplicate.Select
Set A = Selection 'Duplicateしたもの
.Copy
End With
.Paste
Set B = .Shapes(.Shapes.Count) 'Copyしたもの
End With
MsgBox "A: " & TypeName(A) & vbLf & "B: " & TypeName(B)
Stop
Set A = Nothing
Set B = Nothing
End Sub
Sub try5()
Dim A As Object
With ActiveSheet
.Shapes.AddShape msoShape5pointStar, 100, 100, 100, 100
Set A = .DrawingObjects(.DrawingObjects.Count)
MsgBox A.ShapeRange.Name
End With
Stop
Set A = Nothing
End Sub
> 変数への格納の仕方、
> Objectの指定の仕方が違う、
なるほど、同じ物でも
Set A = .DrawingObjects(.DrawingObjects.Count) とすれば型はRectangleだし、
Set A = .Shapes(.Shapes.Count) とすれば型はShapeになりますね。
有難うございます。
No.6
- 回答日時:
今日は暇なのでまた登場。
今回はこれで終わりにしまする。(^^;;;
>う~っ、結果としてそうなったShapeの下にShapeRangeが無く、Rectangleの下にはまずShapeRangeがきて、その下にFillがくるという構造になっているということなんでしょうね。わかったようでわからないような・・・・
VBAのプロになるのであればなんですが、
こんな小難しいことは考えなくてもいいのではないのですか?
何回も言ってるように
●選択された図形●を扱う場合は、ShapeRangeコレクションを使う、
と覚えておけばいいと思いますよ。
Selection.ShapeRange.Fill。。。。。。
なお、当方の回答は、あくまでも
質問のタイトルにある、「エクセルVBAでShapeRangeについて」です。
で、今回の質問については当方の回答は終了ということで。
大師さま、何度もお手間を取らせすみませんでした。
●選択された図形●を扱う場合は、Rectangle型になっているのでShapeRangeコレクションを使う。
選択しなくともRectangle型として変数に入れたオブジェクトもShapeRangeコレクションを使うということですね。
覚えます、有難うございました。
No.4
- 回答日時:
またまた登場、、、(^^;;;
>わたしも選択しているか否かのせいではないかと思いました。
>それで .Range("A1").Select'(1) をわざと書き加えたのです。
>これでA1セルが選択されて図形の選択が解除されていますよね?
Range("A1").Selectしたら図形選択は当然解除されますが、コードをよく見てください。
1。 AA.Copy
2。 .Paste
3。 Set AB = Selection
4。 .Range("A1").Select
2でコピーされた図形は選択された状態になり、
3でその選択された図形をABへセットしてますから
この3で、ShapeRangeコレクションにAddされるわけです
その後、4でセル選択して図形選択を解除しても
それは画面上で解除されただけで、ShapeRangeには選択された図形として入っていることになりませんか?
なりますよね。
4のセル選択は意味がないことになります。
なので、
>選択か否かではなくTypeNameがShapeかRectangleかの違いなのではないでしょうか?
これは、先ず、選択したか否かがあり、
結果としてShapeかRectangleがあるわけですから
結論は選択したか否か、ということになるのではありませんか?
そして、
>もっともDuplicateすればShapeのままで、CopyしてPasteしたらRectangleに変わるというのもなぜかわからないのですが・・・・
これについては、なぜか? という問いには誰も答えられないと思われます。
強いていうなら、Copyしたらではなくて、Selectionオブジェクトの仕様としか言いようがないですね。
ということで、今回の問題は、選択したか否か、ということです。
これでもう、ShapeRangeコレクションの使い方は分かりましたね?(^^;;;
以上です。
> 結果としてShapeかRectangleがあるわけですから
> 結論は選択したか否か、ということになるのではありませんか?
ここまではやっとわかりました。
> これでもう、ShapeRangeコレクションの使い方は分かりましたね?(^^;;;
う~っ、結果としてそうなったShapeの下にShapeRangeが無く、Rectangleの下にはまずShapeRangeがきて、その下にFillがくるという構造になっているということなんでしょうね。わかったようでわからないような・・・・
φ( ̄_ ̄;)
でも、そのように覚えておきます。
No.3
- 回答日時:
ちょっとごちゃごちゃ書きすぎて、解り難かったようです。
ごめんなさい。『Copyで作成された』から『Typeが違う』のではありません。
Sub try1()だけ実行してください。
Selectせずに変数に格納したら型がShapeであり、
SelectしてSelectionを変数に格納したら型がRectangleになります。
>Stop時、VBEのローカルウィンドウを表示し、変数A,Bに格納されたObjectの型を確認してください。
これは、確認してみられましたか?
さらに、A,Bそれぞれを展開してみてください。(左の田をクリック)
Objectは階層構造になっています。
Aの直下にFillプロパティがあります。
Bにはありません。
ただ、Bの直下にShapeRangeプロパティがあります。
これは ShapeRange コレクションを返します。
このShapeRangeをさらに展開してください。最後に Item1 があります。
これがAと同じものです。
>AB.ShapeRange.Fill.ForeColor.SchemeColor = 10
は
AB.ShapeRange.Item(1).Fill.ForeColor.SchemeColor = 10
と同じ事をしています。
>Selectメソッドで選択したObjectと、Selectionの内容は異なる事があります。
Shapeを選択しても、SelectionはShapeではない、という事です。
> Selectせずに変数に格納したら型がShapeであり、
> SelectしてSelectionを変数に格納したら型がRectangleになります。
CopyとDuplucateの違いではなかったのですね。わかりました。
> さらに、A,Bそれぞれを展開してみてください。(左の田をクリック)
こういうところがあるとは存じませんでした。
初体験です。
> Objectは階層構造になっています。
> Aの直下にFillプロパティがあります。
> Bにはありません。
なるほど、こういう違いがあるんですねえ。
有難うございました。
No.2
- 回答日時:
エキスパートさん、こんにちは。
寒くなりましたがいかがお過ごしでしょうか。
と、余計なご挨拶は置いといて。。。
質問の件はヘルプをみてもなかなか分かりづらいところがありますが、
簡単に言うと、その図形が選択されてるかどうか、です。
選択された図形はShapeRangeコレクションの中に入るので
その図形を扱うときはShapeRangeを使わないといけないということです。
但し、これは、今回のような【書式プロパティ】についてですが。
-------------------------------------------------
AA.Copy '(1)
.Paste '(1)
Set AB = Selection '(1)
このABは【選択された状態】ですから、ShapeRangeでないとダメ
---------------------------------------------------------
Set AB = AA.Duplicate
このABは、【選択されてない状態】であり、
Set AB = Activesheet.Shapes(2)
と同じなので、ShapeRangeは使わないでもよい
------------------------------------------------------
それから、
>AB.ShapeRange.Fill.ForeColor.SchemeColor = 10'(1)の2
>AB.Fill.ForeColor.SchemeColor = 10 '(2)の2
ActiveSheet.Shapes(AB.Name).Fill.ForeColor.SchemeColor = 10
とすれば問題はおこりませんが、コードがちょと綺麗じゃない?!
【結論】
選択された図形の書式プロパティを扱うときは、ShapeRangeコレクションを使う
と単純に覚える。
以上です。
大師さま、お久しゅうございます。
わたしも選択しているか否かのせいではないかと思いました。
それで .Range("A1").Select'(1) をわざと書き加えたのです。
これでA1セルが選択されて図形の選択が解除されていますよね?
ですから、選択か否かではなくTypeNameがShapeかRectangleかの違いなのではないでしょうか?もっともDuplicateすればShapeのままで、CopyしてPasteしたらRectangleに変わるというのもなぜかわからないのですが・・・・。
No.1
- 回答日時:
こんにちは。
Selectメソッドで選択したObjectと、Selectionの内容は異なる事があります。
Sub try1()
Dim A
Dim B
Set A = ActiveSheet.Shapes.AddShape(msoShape5pointStar, 100, 100, 100, 100)
A.Select
Set B = Selection
MsgBox "A: " & TypeName(A) & vbLf & "B: " & TypeName(B)
Stop
Set A = Nothing
Set B = Nothing
End Sub
Stop時、VBEのローカルウィンドウを表示し、変数A,Bに格納されたObjectの型を確認してください。
また、Selectionではなくとも、隠しObjectを使う事でも再現します。
(隠しObject...95以前のバージョンとの互換性を保持するためのもの)
Sub try2()
Dim A
Dim B
Set A = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 100, 100, 100, 100)
Set B = ActiveSheet.Rectangles.Add(200, 200, 100, 100)
MsgBox "A: " & TypeName(A) & vbLf & "B: " & TypeName(B)
Stop
Set A = Nothing
Set B = Nothing
End Sub
変数にVariant型を用いている事も要因のひとつです。
個人的には、きちんと変数宣言し明示して、Objectの型を意識したほうが良いと思います。
ただ、Selectionを用いると、型違いエラーが発生する事もあります。
Sub try3()
Dim A As Object
Dim B As Rectangle
Dim C As Shape
Set A = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 100, 100, 100, 100)
A.Select
Set B = Selection
On Error Resume Next
Set C = Selection 'エラー
Stop
Set C = A
Stop
Set A = Nothing
Set B = Nothing
Set C = Nothing
End Sub
Selection のような状況依存しないといけない時には..As Object を使う事もあります。
(上記例の Dim B As Rectangle...などは、あまり使わないとは思います)
有難うございます。
最初に生成された星型AAはTypeNameがShapeでした。
Duplicateで複製した星型ABは、オリジナルと同じくTypeNameがShapeでしたが、Copyで作成された星型ABはTypeNameがRectangleと、Typeが違うんですね!
ここまでは理解できました。
では、ABが"Shape"であれば
AB.Fill.ForeColor.SchemeColor = 10 でOKなのに
ABが"Rectangle"なら
AB.ShapeRange.Fill.ForeColor.SchemeColor = 10 と、"ShapeRange"というのを入れなければならないのはどうしてなのでしょうか?
(実はShapeRangeというのが何なのか良くわかってないのです。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
あなたは何にトキメキますか?
「きゅんとした〜♪」 と思う瞬間ってありますよね。 それは恋愛だったり、推し活だったり、映画のワンシーンだったり……。
-
【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
【お題】 ・急に朝起こしてきた母親に言われた一言とは?
-
エクセルのマクロでSelection.Shaperangeを使用した時のエラーについて
Visual Basic(VBA)
-
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
エクセルVBAでシートモジュールでのパブリック変数
Excel(エクセル)
-
-
4
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
5
エクセルマクロでシート内にある画像のみを選択する
Excel(エクセル)
-
6
split関数で区切り文字がない場合
Visual Basic(VBA)
-
7
エクセルvbaでの図形のカット(コピー)ペーストについて
Excel(エクセル)
-
8
VBAで選択した画像を貼り付けたい
Excel(エクセル)
-
9
エクセル マクロで、選択している画像の数を数えたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Office365 のExcelでオブジェク...
-
エクセルで図形やワードアート...
-
指定範囲内で図形等を削除する...
-
オートシェイプで任意のドーナ...
-
Excel に貼り付けた図形が、勝...
-
エクセル マクロで、選択してい...
-
ワードの図形をコピー&ペイス...
-
Excel組織図を横に展開する方法...
-
Excel 図形を移動させると複写...
-
パワーポイント(2016)、線を...
-
word2010 SmartArtで連絡網作...
-
エクセル コマンドボタン 丸...
-
ベクターワークスで線を複写
-
PowerPoint2013で、図形の枠線...
-
Excelで図形(線分)を挿入し、 ①...
-
エクセルの図形にハイパーリン...
-
jwCAD 登録した図形を呼び出し...
-
Illustratorで色の変更ができな...
-
エクセルVBAでShapeRangeについて
-
Excel2007で「サイズとプロパテ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで図形やワードアート...
-
Office365 のExcelでオブジェク...
-
指定範囲内で図形等を削除する...
-
word2010 SmartArtで連絡網作...
-
Excel組織図を横に展開する方法...
-
Excel に貼り付けた図形が、勝...
-
エクセル マクロで、選択してい...
-
Excel 図形を移動させると複写...
-
jwCAD 登録した図形を呼び出し...
-
ワードの図形をコピー&ペイス...
-
オートシェイプで任意のドーナ...
-
マウスで選択した図形のみVBAで...
-
マクロで選択した図形の選択状...
-
パワーポイント(2016)、線を...
-
EXCEL セルに配置した図形ごと参照
-
エクセル コマンドボタン 丸...
-
PowerPoint2013で、図形の枠線...
-
ベクターワークスで線を複写
-
ワードで大量の図形を一括でグ...
-
Excel2007で「サイズとプロパテ...
おすすめ情報