• ベストアンサー

VBAによるセル内の画像の位置調整

Excel2007のVBAからShell関数で外部実行プログラムを起動します。 外部実行プログラムは画像データをクリップボードへデータを出力後、自動で終了します。 Shell関数とWin32APIを使用して外部プログラムを実行し、プログラムが終了するまで待つように処理して、 クリップボードから指定する複数の結合したセルへ画像を貼り付ける事は出来たのですが、 画像がセルの左上を基準に貼り付けられます。 この画像を、セルの中央に位置調整したいのですが可能なのでしょうか? また画像の回転(1度単位)は可能でしょうか? '指定セルへクリップボードの内容を貼り付け ActiveSheet.Paste Destination:=Worksheets("Sheet1").Range("H53") 画像ファイルなどを読み込む訳ではないため、画像データ自体に名前がありません。 手動で位置調整は可能ですが、自動化出来ないかと色々調べ試してみたのですが、思う様に実現できません。 セルの結合は5行、列は結合していません。 どなたか御存知でしたら回答下さい。

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

またまた登場,onlyromです。 百聞は一見に如かず、ということで新しいブックのSheet1で以下を実行してください。  H53~H57 を結合して(画像より大分大きめに幅、高さを広げておく) 任意の場所に画像を貼り付け、又は 挿入 その後、下記コードをコピペして実行 '--------------------------------------- Sub test()  With Selection   .Top = (Range("H58").Top - Range("H53").Top - .Height) / 2 + Range("H53").Top   .Left = (Range("I53").Left - Range("H53").Left - .Width) / 2 + Range("H53").Left  End With End Sub '---------------------------------------- どうですか? ど真ん中に移動したと思いますが。  

kiki_s
質問者

補足

>当方は動作確認してから投稿するようにしています。 決して意地悪をしている訳ではありませんので御容赦下さい。 時間を割いて回答頂いています事に感謝しています。 で、新しいブックで実行してみました。 確かにセルの中央に移動しました。 最初はエラーになるので、なぜなのか考えてみたら、 オブジェクトを選択状態にしないと駄目なんですね。 再度、質問になりますが、コード中の Range("H53").Top - .Height Range("H53").Left - .Width 「.Height」と「.Width」は挿入したオブジェクトの「高さ」、「幅」でしょうか? やはり、VBAは難しい(><

その他の回答 (5)

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

ANo.1 です。 >説明不足でしたがシートには、画像以外のものもあります。 (コマンドボタンなど) 何があっても関係ありません。 >確かに回転は不可能でした。 どんな画像か知りませんが、普通は回転できます。選択マークが黒四角になっていないでしょうね。 >移動は出来ましたが、微調整が微妙ですね。 私は、移動できることを示しただけで、細かいことは他の人の回答で十分です。onlyromさんでいいでしょう。 >セルのサイズを変更すると問題になりそうです。 セルサイズの変更とは関係ないようにもできます。 図の書式設定―プロパティ >挿入する順番は決まっていませんので、Indexで指定出来るかどうか・ なぜ指定できないのですか。indexがわかれば指定できるでしょう。indexをとっておけばいいですよ。 また、名前を知ることができますし、気に入った名前につけ変えることもできます。 ...Shapes(sn).name="適当な名前"

kiki_s
質問者

お礼

>なぜ指定できないのですか 「できない」はプログラムで実現できないではなく、VBA自体を理解できていないのでコードが書けないという意味です。 VB(NET以前)なら基本的な部分は理解出来るのですが、似た環境といっても、やはり違います。 エクセル自体使う機会が少ないですし。 コード自体は、もう少しのところで完成かな?というところまで進展しました。 名前のつけ変えもトライしてみたいと思います。 ありがとうございました。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.5

こんにちは。 Sub try()   Const n As Long = 4  'margin   Dim r  As Range   Dim x  As Double   With Worksheets("Sheet1")     Set r = .Range("H53").MergeArea     .Activate     .PasteSpecial Format:="図 (拡張メタファイル)"   End With   With Selection.ShapeRange     x = Application.Min((r.Width - n) / .Width, (r.Height - n) / .Height)     .LockAspectRatio = msoTrue     If x < 1 Then .Width = .Width * x     .Left = r.Left + (r.Width - .Width) / 2     .Top = r.Top + (r.Height - .Height) / 2   End With   ActiveCell.Select   Set r = Nothing End Sub こんな感じでどうでしょう。 >確かに回転は不可能でした。 との記述から、Paste後、その画像はObjectとして貼り付けられていませんか? 選択して[名前BOX]で確認してみてください。 回転させるなら、Shapeとして貼り付けるのが手っ取り早いです。 その場合は [Rotationプロパティ]や[IncrementRotationメソッド]が使えます。 Selectionを使いたくなければokormazdさんが書かれている ...Shapes(Sheet.Shapes.Count) で指定できますよ。 コマンドボタンなどの画像以外のものがあっても判定できます。 Shapes.Count、つまりShapesの最大値のIndexでShapeを指定しますから 最後に追加されたShapeになります。 #PasteSpecialの場合、たぶんSheet.Activateが必要なのでSelectionで充分だとは思いますが。

kiki_s
質問者

お礼

end-uさん、ありがとうございます。 >最後に追加されたShapeになります。 確かにそうなりました。 質問には書いていなかったのですが、画像は複数挿入します。 ただ、挿入する順番は決まっていませんので、Indexで指定出来るかどうか・・・ 提示頂いたコードは帰宅後試してみます。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

再度の登場、onlyromです。 >移動は出来ましたが、意図する位置に移動しませんでした。 当方は動作確認してから投稿するようにしています。 提示したコードも動作確認済です。 ちゃんとど真ん中に移動するはずです。 条件、■H53~H57の5セルが結合してありますか? 意図した動作をしないという質問者のコードをアップしてください。 一緒に解決しませう。  

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

●位置について● セルのTop,Leftプロパティと 画像のTop,Left,Height,Widthプロパティから位置を計算する。 ■H53~H57の5セルが結合してある場合 ActiveSheet.Paste Destination:=Worksheets("Sheet1").Range("H53") に続けて以下のコードを。。 With Selection  .Top = (Range("H58").Top - Range("H53").Top - .Height) / 2 + Range("H53").Top  .Left = (Range("I53").Left - Range("H53").Left - .Width) / 2 + Range("H53").Left End With '---------------------------------------------------- ●回転について● 図形(オートシェイプ)やグラフならIncrementRotationメソッドで回転できますが 貼り付けた(あるいは挿入した)画像(jpg,gif等)を回転させるメソッドはありませんので出来ません。 ただその貼り付けた画像はオートシェイプと同じく、Shapesコレクションに組み込まれますのでShapeオブジェクトで参照できます。 ということで回転はAPIになるでしょうからそれについてはネット検索してみてください。 以上。

kiki_s
質問者

お礼

onlyromさん、確かに回転は不可能でした。 移動は出来ましたが、意図する位置に移動しませんでした。 どちらかといえば右方向に移動したいのですが、左へ移動します。 コードと「にらめっこ」で色々調べてみたのですが・・・ 再度方法を思案中です。 VBなら基本的なところは理解できているのですが、 VBAは「似て非なる」ものですね。 ありがとうございました。

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

ActiveSheet.Paste Destination:=Worksheets("Sheet1").Range("H53") sn = ActiveSheet.Shapes.Count With ActiveSheet.Shapes(sn) .Top = 200 '画像の行 1上端からの距離(pixel) .Left = 200 '画像の列1左端からの距離(pixel) .Rotation = 5 '回転角 End With でどうでしょう。

kiki_s
質問者

お礼

okormazdさん、説明不足でしたがシートには、画像以外のものもあります。 (コマンドボタンなど) コードをそのまま利用させて頂いたのですが、 確かに回転は不可能でした。 移動は出来ましたが、微調整が微妙ですね。 セルのサイズを変更すると問題になりそうです。 再度方法を思案中です。 ありがとうございました。

関連するQ&A

  • VBAで、結合したセルの位置を変えたい

    エクセル2007のVBAですが、たとえば結合したセルG11があります。 このセルに、マクロ実行時に値を渡してセルの場所を変えることはできますか? たとえば(横の値,縦の値)とし、(1,0)という値を渡すとセルの位置はH11となり、 (0,1)という値を渡すとG12となる。 (-1,0)ならF11、といった感じです。 可能でしょうか?よろしくお願いします。

  • 現在のセルの位置を返す関数はありますか

    Excel97を使っています。 マウスで指定されたセルの位置が返される関数はありますか? 例えば、その関数をA1に入れておくと、マウスで指定したセルの位置がA1に返されるという関数です。 要するに数式バーの左端に現在のセルの位置が表示されていますよね。 それを関数で指定のセルに表示したいのです。

  • Excel VBA クリップボードの画像貼り付け

    こんにちは。 Excel VBAで次のようなことをしたいのですが、少し特殊な手順のため皆様のお知恵とお時間をお貸しいただけないでしょうか。 以下の作業をVBAで自動化したいと考えています。 ①クリップボードの画像を貼り付け  画像サイズを1.8cm×1.8cmに変更し、画像右角がセル『T66』に合うよう貼り付け位置を調整する ②これをExcelファイルの全てのワークシートに行う  (ワークシートのファイル名はすべて異なる) 作成したレポートに電子印を押印するのに、かなり時間がかかっているのでVBAで自動化したいと考えている次第です。 『パソコンに保存された画像』ではなく『クリップボードの画像を貼り付け』で自動化できれば、かなり時間短縮できるので上記の手順にてVBAを組んでいただけないでしょうか。 何卒、ご協力をお願い致します。

  • エクセルで結合したセルの高さの自動調整方法?

    エクセル2000、Win2000です。 いくつかのセルを横に結合し、セル内で「折り返して全体を表示する」にしています。 セルを結合してない場合は、入力文字数が多くなっても行の高さを自動調整にすれば、ちゃんと折り返して全部表示されますが、結合したセルの場合は、自動調整がきかず、 いちいち手動で調整しなくてはいけません。 1.結合セルでも自動調整する方法はないですか? 2.ない場合、VBAで行の高さを変えてみようと思いますが、セル内で折り返しているかどうか、および何行に折り返されているかはどう判別すればいいでしょうか?

  • エクセルVBA:データ端に画像があった場合の最終セル位置取得

     エクセル2000でVBA使用の場合の質問です。  既にシートに表や画像ファイルが配置されています。 あちこちの他データベースから、送付されてくるデータをそのシートの下端に自動で追加するマクロを組んでいます。 しかし、シートの一番下が不定な大きさの画像ファイルであった場合に、次のデータが、既にある画像に隠されない位置から貼り付けたいのですが、画像の最下位置をセル位置で取得する方法が判りませんでした。  こういう場合、どのような方法で取得すればいいのでしょうか?  最下データは必ずしも画像とは限らないので、出来れば同じコマンドかルーチンで画像であってもセル内データであっても、最下端セル(ここでは画像にが被っていないセルか、ヌルでないセル)位置、或いは最初の空きセル(ここでは、画像で隠されていず、かつヌルセルの位置の意味)位置を取得できれば嬉しいのですが、それが無理な場合、最後が画像か非ヌルセルかを判断した上で、画像だった場合の最下端情報を取得する方法(非ヌルセルと判断出来れば、情報取得方法はいくつか知っています)のどちらかを知りたいのです。

  • 【エクセル】 結合セルで行の高さを自動調整する方法

    通常、セルに多数の文字を書き込んでも列幅を変更 したくないときには、セルの書式設定で 「折り返して全体を表示する」 としておけば、列幅を広くすることなく、行の高さ が自動調整されます。 これを、結合セルでやろうとするとどうしても 自動調整してくれません。 結合セルでも、行の自動調整機能が働く方法を 教えてください。 よろしくお願いします。

  • EXCELでの画像位置調整マクロ(VBA)

    Excelの1シート内に大量の画像を貼り付けてあるブックがあります。 このシートをそのまま印刷した場合、1つの画像が2ページにまたがってしまう部分が いくつもあります。 これらを自動的に調整しなおして1つのブックにする方法はないでしょうか? 最終的に1つのファイルとして問題なく印刷できれば、どのような方法でもかまいません。 ただし、手動での位置調整は画像自体が大量にあるため、非常に時間がかかります。 マクロ的に処理できる方法をご存知の方、教えてください。

  • 結合されたセルの移動 VBA

    「結合されたセルの一部を変更することはできません」と言うメッセージイベントでVBAを実行するにはどうしたらよいでしょうか? 結合されたセルあるいは複数の結合されたセルを選んで移動する場合、移動先が自分のセルに重なると、「結合されたセルの一部を変更することはできません」と言うメッセージが現れます。 これを回避するには一旦何も無い離れたところに移動し、それから再び目的の場所に移動します。 私の技能では以下のようなマクロになると思います。 最初に元の結合セルを選び、場所を覚えるマクロを実行しする。 次に移動先を指定し、「一旦何も無い離れたところに移動し、それから再び目的の場所に移動」するマクロを実行します。 これをワン・アクションで、「結合されたセルの一部を変更することはできません」と言うメッセージが出るタイミングで実行するにはどうしたらよいでしょうか。 よろしくお願い申し上げます。

  • EXCELのVBAから画像ファイルを指定してPhotoEditorを起動したい。

    Excel2002のVBA(Ver6.0)を使っています。指定した画像ファイル(セル内に文字列データとして格納)をPhotoEditorを起動させて表示させるのが目的です。Shell関数ではPhotoEditorは起動できるのですが、ファイルが指定できませんでした。GetObject関数が使用できるではと思い、試してみましたがうまくいきません。  どなたか解決方法をお教えください。(ちなみにユーザーフォームでの表示はできています。)

  • Excel VBAで結合セルに連番を振っていくには?

    Microsoft Excel 2003での質問です。 表を作成しました。 結合セルが複数ある1列に(セル数はまちまち・複数の列には非結合)、連番を振っていく作業をしています。 これをVBAを使って自動化したいのです。 列に連番がすでに入力されている最終行の下のセル(つまりこれから連番が入る空白セル)を選択、 範囲指定し(セル数はまちまちなのでこれは手作業)、 セルを結合させるまではできたのですが、 この結合させたセルに、[(一つ上の結合セル)+(1)]の値を入力させるにはどうプログラムしたらよいでしょうか? わかりにくい説明で恐縮ですが、どなたかご教示ください。

専門家に質問してみよう