[[20161021230250]] 『画像のRotationプロパティの取得について』(ぽんた999) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『画像のRotationプロパティの取得について』(ぽんた999)

 前置きが長くなりますがご容赦ください。

 まずやりやりたいことはシートに貼り付けた画像を、セルの大きさに合わせ
 縦横比を維持したまま自動調整することです。
 だいぶ前に作ったマクロで利用していましたが、最近、貼り付けた画像を回転させると
 うまく働かない事に気が付きました。
 その対応を [20161019214612] で質問し、算数で補正する とのアドバイスを
 頂きました。

 アドバイスに従い、各画像のRotationプロパティを求め、90および270の時は
 大きさ調整は  Hight,Widthを入れ替え。
 貼り付け位置は TOP、LEFT値を補正し
 目的を達成することが出来ました。

 この場を借りて、γ様、β様に改めてお礼申し上げます。

 さてこのマクロは報告書作成に使用しており貼付け画像は数十枚あることは珍しくなく
 複数選択した画像のみ対象する場合と、シートに貼りつけた画像全部を対象とする
 以下のような二つのマクロを用意していました。MyA = Pic.Rotation を追加

 ====【A】選択した画像のみ対象================
 For Each Pic In Selection.ShapeRange
 〜
 Pic.Select
 MyA = Pic.Rotation
 〜
 Next
 =======================================以上====

 ====【B】シートに貼りつけた画像全部を対象=====
 For Each Pic In ActiveSheet.Pictures
 〜
 Pic.Select
 MyA = Pic.Rotation
 〜
 Next
 =======================================以上====

 ここでようやく質問です。
 上で目的を達成と申しましたが、実際うまくいったのは【A】のみで
 【B】は MyA = Pic.Rotation のコードで
   実行時エラー483
   オブジェクトは、このプロパティまたはメソッドをサポートしていない
 となってしまいました。

 シートに貼りつけた画像全部を対象に各Rotationプロパティを取得する方法を
 教えて頂きたくよろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 最近のトピなので見つけやすいかとは思いますが念のため、リンクを以下に。

[[20161019214612]] 『貼り付けた画像を回転させた時のHight,Widthを再吹x(ぽんた999) 

 To ぽんた999 さん

 別トピを参照する場合、そのトピの一番下に

 このページを参考にして新しく投稿する → 参照登録

 こんなところがあって、この 参照登録 をクリックすると、
 リンクが自動設定された新規トピ入力画面になります。

 今後のご参考に。

(β) 2016/10/21(金) 23:13


恐れ入ります。

 Sub test()
     Dim pic As Picture

     For Each pic In ActiveSheet.Pictures
         'Stop 
         Debug.Print pic.ShapeRange.Rotation
     Next
 End Sub
 のようなことですか?

 調べ方:
 Stopのところで、ローカルウインドウで、picにどんなプロパティがあるか調べる、
 というのが真っ当な対応でしょう。

(γ) 2016/10/21(金) 23:22


 γさんとかぶりますが、メモしましたので。

 質問の件ですが、その前に A も B も Pic.Select ? 選択して何をするのですか?
 少なくともアップされたコードを見る限り、MyA = Pic.Rotation と、Pic そのものを指定していて
 Selectionは使っていないでしょ? 不要ですね。これは。

 で、本題です。

 Rotation は Shape のプロパティです。Picture は Shape という 「段ボール箱」のなかの「品物」です。
 B で取得している Pic は Picture ですから、その中には Rotation というプロパティはありません。

 じゃぁ、どうするかというと、ちょっと、ややこしくなりますが Shape関連の階層は

 ShapeRange (なんだかあやしげな コンテナ)
     Shape (コンテナに入っている段ボール)
         Picture 等 (品物 実態)

 こうなっていて、PictureからShapeを見る必要があるのですが、Picture.Shape という指定が(なぜか)できない仕掛けになっていて
 2階層上のShapeRange しか取得できません。 つまり、Pic.ShapeRange ですけど、これは コンテナであって
 段ボール箱ではないので コンテナに入っている1番目の段ボール箱 ということで MyA = Pic.ShapeRange(1).Rotation と書きます。
 ただ、今回の場合、Pic からさかのぼれば段ボール箱は1つしかないのでγさんアドバイスの
 MyA = Pic.ShapeRange.Rotation でもOKです。

(β) 2016/10/21(金) 23:34


 補足します。

 取得したPicture.ShapeRange という書き方は、実は、すでに ぽんた999さんが A で書いているんですよ。

 つまり、Aの処理は事前に 該当の Shape を Ctrlキーを押しながら選択していますよね。
 その時の Selection 、実は、これは Shape(s) ではなく DrawingObject(s) つまり Picture(s)なんです。
 なぜ、そうなるのかは、混乱するかもしれないのでさておきますが、いずれにしても Selection は Picture(s) です。
 なので、Selection(つまりPicture).ShapeRange として、ShapeRangeを取得しているんです。

 で、ご自分で A においては 取得したPicture.ShapeRange.Rotation としているのに B では
 同じご本人が、取得したPicture.Rotation と書いているわけですから、これは、だめですよね。

(β) 2016/10/21(金) 23:53


β様、γ様 重ね重ね御指導ありがとうございました。

 特にβ様には詳細な解説も付けて頂き感謝いたします。
 ネットでサンプルコードを探し、流用で大体用が足りて済ませてきました。
 今回の事例のように基礎を知らないと、当たり前のことが手も足も出ない
 事がある事がよく分かりました。

 また参照登録の件、これを契機に「初めての方へ(詳細版)」を真面目によみ
 リンクは二重括弧も知り赤面の至りです。

 今後は質問する前にもう少し勉強してから行いますのでよろしくお願いいたします。

(ぽんた999) 2016/10/22(土) 22:07


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.