Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
ディスプレイの拡大率で図形が変形する件
投稿日時: 22/11/22 17:03:33
投稿者: コンギョ

いつもありがとうございます。
 
accessからexcelの操作をしていて、変数にセットしたブック「xlSheet2」にあるオートシェイプ「A」をコピーして、別の変数にセットしたブック「xlSheet」に図として貼り付けを行っています。
 
    xlSheet2.Shapes("A").Copy
    With xlSheet
        .PasteSpecial Format:="図 (PNG)"
        With .Pictures(.Pictures.Count)
            .Left = 100
            .Top = 100
            .Placement = xlFreeFloating
            .Name = "AA"
        End With
    End With
 
この処理をデスクトップのディスプレイ設定→拡大縮小のレイアウトを、125%や150%のパソコンで行ったときに100%のパソコンで開くと明らかに楕円に変形してしまいます。その逆も100%で処理した場合、125%や150%で開くと楕円に変形してしまいます。
ディスプレイ設定125%で処理をして、125%で図形のサイズを確認すると高さ・幅共に倍率は100%になっています。それをディスプレイ設定100%で確認すると倍率は100%ではなくなるので変形してしまいます。
色々調べて、「セルに合わせて移動やサイズ変更しない」の設定で、.Placement = xlFreeFloatingをやってみても変化はありませんでした。
 
これはどうしようもないでしょうか?
 
何か別の方法で、どんなディスプレイ設定でも同じ大きさの画像を貼り付ける方法などご教授いただきたいです。
 
どうぞよろしくお願い致します。

回答
投稿日時: 22/11/24 11:38:14
投稿者: Suzu

良く出てくる問題ですね。
 
直近ですと下記もそうです。
 
エクセルのセル範囲を拡張メタファイルで貼り付けたときのサイズがPCによってバラバラ
https://www.moug.net/faq/viewtopic.php?t=81725
 
 
VBAでなく、手動で行っても 縦横比が変わり、楕円になりませんか?
 
 
原因としては、「ポイント」と「DPI」と「ピクセル」の関係性です。
 
パソコンにより
・解像度(縦横比)
・拡大縮小とレイアウトの 倍率
それぞれが違った場合、それらが 掛け算となり見た目の縦横比が大きく違う様に見える一因となります。
 
詳しくは下記をどうぞ。
 
DPI制御の問題【Excelでお仕事】
https://www.asahi-net.or.jp/~ef2o-inue/vbnet/sub13_09_030.html
 
エクセル 画面表示拡大率によってセルの幅が変る【教えて!goo】
https://oshiete.goo.ne.jp/qa/2319079.html
 
 
 
手動で行った場合どうでしょうか? その場合も、縦横比が違う様になりませんか?
手動でも同様であるなら、VBA『だから』と言うわけではありません。
 
そうなると、貼付時にどうこうできる事ではなくなりますから
 
ブックの開くときイベントで
PCの 解像度や倍率を取得し それに合わせて 幅・高さ を 設定する必要があります。
Excelの ブックの開くときイベントで制御が必要になり、マクロを含んだブックにする必要があります。
 
そこまでする必要があるのか 検討してみましょう。

投稿日時: 22/11/25 11:50:15
投稿者: コンギョ

Suzu様
 
いつもありがとうございます。

引用:
VBAでなく、手動で行っても 縦横比が変わり、楕円になりませんか?

手動でも同じ結果になりました。
手動であれこれやってて分かったのが、[サイズとプロパティ]⇒[サイズ]⇒[原型のサイズ]⇒[リセット]ボタンをクリックすると元のサイズに戻りました。
引用:
ブックの開くときイベントで
PCの 解像度や倍率を取得し それに合わせて 幅・高さ を 設定する必要があります。
Excelの ブックの開くときイベントで制御が必要になり、マクロを含んだブックにする必要があります。

これをヒントにブックを開くときのイベントに下記を追加して解決に至りました。
For Each obj In ActiveSheet.Shapes
    If obj.Name = "探したい図形の名称" Then
        With obj
            .ScaleHeight 1, msoTrue
            .ScaleWidth 1, msoTrue
        End With
        Exit For
    End If
Next
 
リセット後は位置が若干ズレますが、これはもう諦めました。あれこれやりすぎると起動時間に影響があるので。
どうもありがとうございました。