• ベストアンサー

Excel2002のマクロについて

マクロを使って、画像を貼付で困っています。 流れは、セルを選択し画像を写真サイズにして、回転させて貼り付けているのですが、選択したセルの左上角にあってくれません。 おそらく、回転前の角をあわせて、それから回転してしまっているのだと思います。 これを、回転させた画像がセルの左上角に合うように、画像の挿入をしたいのですが、マクロをどう記述すればいいのでしょうか? 教えください。

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

  • ベストアンサー
  • a999a999
  • ベストアンサー率68% (11/16)
回答No.6

微妙な質問ですが 単純に解釈すると簡単です。 Selection.ShapeRange.Height = 273.75 Selection.ShapeRange.Width = 364.5 とタテヨコの長さをセットしていますが セットする前に確認します。 If ~.Height > ~.Width Then タテ長の時の処理 Else ヨコ長の処理 End If (~は省略しています) すべての写真をヨコ長で 配置する場合は、タテなら回転を90 ヨコなら0にして他の処理は 同じで大丈夫です。 Ifでは、回転角度の変数に0か90かの セットだけ行い 後は共通の処理です。 微妙とは「保存してある」というのを 画像を開く前に判断したいという意味に 解釈したらということです。 ちょっと思い付きませんでした。 ダイアログで開く画像を選ばせる 処理のようなのでタテかヨコかは 分かるはずということにします。 ダイアログにせず決まったフォルダにある 画像を自動で処理するような場合は 仕方が無いので、いったん画像を 貼り付けてみて長さを比べて タテだけ有効なら、ヨコ長画像をすぐに Deleteして次の画像を・・ という処理にします。 具体的にはどういう処理をされているかが 分かればソースか何かで示すことができます。 良かったら回答下さい。 別件ですが、下の部分 Selection.ShapeRange.LockAspectRatio = msoTrue タテヨコの比率を固定するものですが タテヨコの長さが違う場合に有効です。 直後に ~.Height = 273.75 ~.Width = 364.5 と長さを与えていますが これはどちらかしか実際には使われていません。 (どちらかは調べてませんが) たぶん今回は元の画像が写真のサイズの 比率(タテヨコ)に近いものなので どちらでもOKなのだと思います。 たとえば少し細長い画像の場合 縮小、拡大する時に 1.タテがいっぱいになるまで拡大 2.ヨコが・・ を選ぶことができます。 ~.Height = 273.75 のみを指定するとタテの長さに合せて ヨコを自動調整させるということになります。 タテもヨコも枠からはみ出ない ワクいっぱいの表示をする場合などに使います。 .LockAspectRatioのあとは タテかヨコかを積極的に 使ってみるとおもしろいと思います。

noname#192965
質問者

お礼

いろいろな相談にご回答いただいているようで、ほんとにありがとうございます。 少ない時間ながら、ちょっとずつ試していますので、時間がかかってしまい、ご返事も遅くなってしまいました。 ご迷惑をおかけして申し訳ございません。 こちらの方は終了させていただきます。助かりました。 ほんとにありがとうございました。

その他の回答 (5)

  • a999a999
  • ベストアンサー率68% (11/16)
回答No.5

下のものを確認下さい。 Sub ちょうど() Application.Dialogs(xlDialogInsertPicture).Show Set 画像 = Selection.ShapeRange 画像.LockAspectRatio = msoTrue 画像.Height = 273.75 画像.Width = 364.5 画像.Rotation = 90# 位置の差 = (画像.Width / 2) - (画像.Height / 2) 画像.Left = Range("f20").Left - 位置の差 画像.Top = Range("f20").Top + 位置の差 End Sub セルはF20になっています。変更下さい。 これは、ヨコ長(90度回転してタテ長)の場合だけ だと思います。タテ長、ヨコ長のどちらもある場合は どちらが長辺かの判断が必要かもしれません。 回転後でも画像のleft,topの値は 元のヨコ長の時の位置のままでした。 元の位置を覚えていて、回転の指定があると 図形自体の中心点を基点に回す処理のようです。 逆算で、置きたいセルの座標との差を 求めて調整しました。 正方形以外は、90度まわすと、 上側は少し飛び出す、左右は少しスリムになります。 上がどの程度出るかは 図形の幅の半分 - 図形の高さの半分 この長さ分上側に出ます。 左右はこの分減ります。 ちなみに一つだけ教えてほしいのですが うちはExcel97ですが 写真の画像は回転不可です。 バージョンを教えてもらえますか。 買いに行きます。 不具合ありましたら連絡下さい。 勉強になりました。ありがとうございました。

noname#192965
質問者

お礼

ほんとに親切にありがとうございました。 VBAもExcelのバージョンによって、できたりできなかったりするのですね。私Excel2002を使っております。 ついでといっては何ですが、保存されている画像が縦長なのか横長なのか、マクロで情報を得たいのですが、できますでしょうか? 例えば、横長ならそのまま貼付、縦長なら回転させて貼付といったことをしたいのですが、、、 画像の情報を得るコマンドがわからないでいます。 もしおわかりであれば教えてください。 新たに質問しなおした方がいいかもしれませんので、新たに質問もしてみます。 ありがとうございました。

  • a999a999
  • ベストアンサー率68% (11/16)
回答No.4

元の位置を覚えているようで 少し難しいですね。 なんとかなるかもしれませんが ひとまず別の方法を。 決まりの列、行に移動させるなら 移動させる距離をマクロの自動記録で 求めることができます。 画像を選択して、記録開始 画像を移動、記録停止 相対位置で記録されるので他の場所でも 見た目はこれを使えばできると思います。 画像の回転は、画像自体の中心を起点にまわります。 このために計算が難しくなるのかもしれない と考えています。 もう少し考えさせて下さい。

noname#192965
質問者

お礼

何度もありがとうございます。 とてもうれしいです。 結局、この上記の方法が、初心者の私には一番簡単そうですね。 とりあえずはこれを使ってみます。 しかし、まだいい案がでてくれば、書き込んでくださいね。しばらく、終了はしないでいますので。 何分、忙しくて、返事が遅れるかもしれませんが、必ず返事はしますので、よろしくお願いします。

  • a999a999
  • ベストアンサー率68% (11/16)
回答No.3

テストしましたが 回転後はだめですね。 回転前は大丈夫です。 top,leftを入れ替えてテスト中です。 何度もすいません。

  • a999a999
  • ベストアンサー率68% (11/16)
回答No.2

すいません、今試していたところでした。 下のものを試して下さい。 Set 画像 = Selection.ShapeRange MsgBox "左1 " & 画像.Left MsgBox "左2 " & Range("c4").Left 画像.Left = Range("c4").Left MsgBox "上1 " & 画像.Top MsgBox "上2 " & Range("c4").Top 画像.Top = Range("c4").Top 画像をセレクトしてからスタートして下さい。 セルの、画面左からセルまで位置を画像に与える 画面上からの位置も同じです。 まだテスト中です。

  • a999a999
  • ベストアンサー率68% (11/16)
回答No.1

考え方ですが 画像を貼り付けた直後に名前を付けます。 Selection.Name = "名前" サイズ変更、回転後 画像切り取り ActiveSheet.Shapes("名前").Cut セル選択 画像貼付け Range(セル位置).Select ActiveSheet.Paste で目的の位置に貼り付けられると思います。 画像名にセルのアドレスを使うと 削除や移動時に便利です。 作成例が必要なら作ります。 連絡下さい。

noname#192965
質問者

補足

ありがとうございます。 ぜひ例をみてみたいものですが、、、 参考まで、私のものせておきます、 これでうまくいきません。 なぜか、選択していたセルのひとつ下ぐらいになってしまいます。。。 Application.DialogsxlDialogInsertPicture).Show Selection.ShapeRange.LockAspectRatio = msoTrue Selection.ShapeRange.Height = 273.75 Selection.ShapeRange.Width = 364.5 Selection.ShapeRange.Rotation = 90# Selection.Name = "sq" & Selection.TopLeftCell.Address ActiveSheet.Shapes("sq" & Selection.TopLeftCell.Address).Cut ActiveCell.Select ActiveSheet.Paste まねてまねてつくったものですので、おかしなところがあるかもしれませんが、、、

関連するQ&A