質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

Excel VBA オートシェイプ座標の微妙なズレ

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 13K+

DgRp_08

score 56

急ぎのため端的に質問させていただきます。ご了承ください。

同じBOOK内のExcelシートに「旧シート」と「新シート」があります。
「旧シート」にオートシェイプを複数配置してあるのを、新シートにVBAでコピー&ペーストしているのですが、ペースト後座標反映の際「旧シート座標(single型)」から「新シート座標(Double型)」になってしまい、新シートで座標にズレが生じます。
どのように解決したら良いでしょうか。
※旧シートのオートシェイプはループで全て読取り、1つずつコピペ処理しています。
以下、ほんの一部実装部分(大文字小文字の違いは見逃してください)

Dim wkOldSht As workSheet '旧シート
Dim wkNewSht As workSheet '新シート

'以下ループ内の記述(大幅省略)

wkOldSht.Shapes(li).Copy
wkNewSht.Paste
'以下座標取得にてdouble/Variant=single の状態になり座標がずれてしまう
Selection.Top = wkOldSht.Shapes(li).Top
Selection.Left = wkOldSht.Shapes(li).Left


【追記】
ケータイからなので短めで失礼します。
ウォッチ式に出る値の例です
旧シート座標→5671.909
新シートに入った座標→5672.25

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ttyp03

    2016/05/24 08:48

    Excel2010ではShapesでCopyが使えないのですが、Excelのバージョンを教えてもらえますか。

    キャンセル

  • DgRp_08

    2016/05/24 09:40

    バージョンを失念しておりました。
    バージョンは2010ですが、こちらではCopy使用でコピー自体はできているのですが…

    キャンセル

  • ttyp03

    2016/05/24 09:45

    失礼しました。Copyが使えなかったのはこちらのミスでした。

    キャンセル

  • ttyp03

    2016/05/24 09:54

    同じようなコードを書いてやってみましたが問題なかったです。掲載していないコード以外に何かあるのかもしれないですね。

    キャンセル

回答 3

checkベストアンサー

0

対象を一度アクティブにして、貼り付け時と同じSelectionから座標を取得してはどうでしょう?

Dim dblTop As Double
    Dim dblLeft As Double

    '元シートでShapeを選択し、座標を取得
    wkOldSht.Activate
    wkOldSht.Shapes(li).Select
    dblTop = Selection.Top
    dblLeft = Selection.Left

    '旧⇒新にコピー&ペースト
    wkOldSht.Shapes(li).Copy
    wkNewSht.Activate
    wkNewSht.Paste

    Selection.Top = dblTop
    Selection.Left = dblLeft

貼り付けのたびにシート切替を行うのでちらつくと思います。
これがまずい場合は再描画OFF設定

Application.ScreenUpdating = False


もあわせて実装すれば抑制できると思います。
        

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/24 14:16

    教えていただいた方法で出来ました!
    ありがとうございます

    元々の記述的に「double=single」のせいでズレが生じるから、左辺もなんとかsingleにしなければならない、と対処法を真逆に勘違いしてました。

    また一つ勉強になりました。本当にありがとうございました!

    キャンセル

  • 2016/05/24 14:25

    オートシェイプの座標を揃えるという目的から考えて、考え方は正しかったと思います。

    今回はそのやり方では(貼り付け後のオートシェイプの特定など)面倒なことが多かったので、裏道から回り込んだアドバイスをさせていただきました(^-^;

    キャンセル

0

Excel 2013 で動きを確認しました

wkNewSht.Shapes(wkNewSht.Shapes.Count).Top = wkOldSht.Shapes(li).Top
wkNewSht.Shapes(wkNewSht.Shapes.Count).Left = wkOldSht.Shapes(li).Left


こんな感じに新シートの方もShapesで取り扱ってあげるのはだめでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/24 10:17

    アドバイスいただきましてありがとうございます!
    試してみたのですが、ダメでした。
    コピー対象外に元々配置してあるボタンや凡例記号群などもあるのでもしかしたらカウントがずれてるのかもしれませんので、そこは調査してみます。。

    キャンセル

0

確認してみました。
確かにShapeとSelectionでは、型が異なるようですね。
但し、こちらで確認した感じは次のような感じで、あくまでも小数点以下の差異でしかありませんでした。

18.88638                   ←Shape
18.8863773345947     ←Selection

今ある情報からの対策としてはtakitoさんと同じ回答になってしまいますが、Selectionを使わずにShapeに対して設定してみるくらいでしょうか。

wkNewSht.Shapes(li).Top = wkOldSht.Shapes(li).Top
wkNewSht.Shapes(li).Left = wkOldSht.Shapes(li).Left

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/24 14:20

    回答有り難うございました!
    jawaさんの方法で解決することが出来ました。
    selectionを使わないやり方はうまく行きませんでした。もしかしたらものすごく大量にコピー対象外にもオートシェイプがあることでどこかしらカウントがずれてるのかもしれませんが、原因特定はまだできていません。
    ありがとうございました。
    また何かありましたらよろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る