PowerPoint (一般・VBA)

PowerPoint 一般・VBAに関する話題を扱うフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : その他)
エクセルのセル範囲を拡張メタファイルで貼り付けたときのサイズがPCによってバラバラ
投稿日時: 22/09/05 16:41:20
投稿者: Alice

下記ソフトを使用しています。
・PowerPoint for Microsoft 365 MSO
・Excel for Microsoft 365 MSO
 
Excelをセル範囲指定してコピーし、PowerPointへ拡張メタファイルでペーストしています。
ただ、PCによってペースト時の縦横のサイズが異なり、以降の処理(※)でペーストしたものがスライドからはみ出してしまいます。
(言わば、下記URLと同様の状況です。こちらのURLでの質問は対象がWordですが。
https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%82%B0/08ccb02f-8cff-4515-9180-6bf7ee4db6d7
 
どのPCでもExcelからPowerPointへのペースト後のサイズが統一されるようにするには、どうすればよいでしょうか?
ご教示いただけると幸いです。
何卒、宜しくお願い致します。
 
※縦横比を固定にして、スライド内に見栄えが整うようにサイズ調整
 この処理をExcel VBAで行っています。
 参考までに該当箇所のExcel VBAコードも載せておきます。
-----------------------------------

引用:
'表をコピー
Range(Cells(start_row, start_col), Cells(end_row, end_col)).Copy
                         
'pptにペースト
Set ppslide = ppPrs.Slides(direct_file(i, 1))
 ppslide.Shapes.PasteSpecial DataType:=2, Link:=msoFalse 'datatypeが2は拡張メタファイル
                     
'ペーストした図のインデックス番号取得(最後にペーストした為、図のカウント数の最大値が該当インデックス番号)
  p_ind = ppslide.Shapes.Count
                     
   '図の位置やサイズ調整
   With ppslide.Shapes(p_ind)
       .LockAspectRatio = msoFalse '縦横比を固定
                         
         If direct_file(i, 1) = 2 Then 'スライド2枚目
           .Width = 834.803149606299
           .Top = 82.2047244094488
           .Left = 4.25196850393701
                             
         ElseIf direct_file(i, 1) = 3 Then 'スライド3枚目
            .Width = 836.220472440945
            .Left = 2.83464566929134
                         
        End If
                         
   End With

回答
投稿日時: 22/09/06 09:30:52
投稿者: Suzu

「サイズ」とは?
  Shape の Width と Height ?
  それとも、その Shape内 の 各セルの大きさ?
 
Excel 側の Rangeの範囲や、各Range の大きさが違えば
貼付後の 各セルの大きさも違って当たり前と思います。
 
後者を揃えたいなら、
 Range指定範囲 全体としてののWidth/Height を 揃える
 フォントの大きさを揃える
を行うか
 
Shapeの大きさを 指定 "しない"
 
と思います。
 
 
でも、そもそも

.LockAspectRatio = msoFalse '縦横比を固定

これは、縦横比 固定ではなく、比率保持しない 設定です。これが意図と違う原因かも知れませんが。

回答
投稿日時: 22/09/06 09:33:48
投稿者: Suzu

もし解像度が違う事が原因なのであれば、解像度を取得し、検証してみましょう。
 
ディスプレイの解像度を取得する(API)
https://www.moug.net/tech/acvba/0020006.html

投稿日時: 22/09/06 10:22:02
投稿者: Alice

Suzu様
 
早速のコメントありがとうございます。
 

引用:
「サイズ」とは?

 
パワーポイントにペーストされた時の縦と横の長さです。
(パソコンAでは、縦 16.25、横 29.08でペースト。パソコンBでは、縦 16.83、横 26.69でペースト)
 
パワーポイントへのコピペ前に、対象Excelファイル上で列・行幅指定やフォントサイズ変更は、本件の質問で掲載したコード前にコーディングしています。
 
引用:
でも、そもそも
.LockAspectRatio = msoFalse '縦横比を固定
 
これは、縦横比 固定ではなく、比率保持しない 設定です。これが意図と違う原因かも知れませんが。

 
引用:
もし解像度が違う事が原因なのであれば、解像度を取得し、検証してみましょう。

 
→ご指摘ありがとうございます。
 (.LockAspectRatio = msoFalse を正しく理解していませんでした。。)
 この2点について調べてみたいと思います。
 
 「ディスプレイの解像度を取得する(API)」のURLも記載して下さり、大変助かります。 Very Happy

回答
投稿日時: 22/09/06 11:40:23
投稿者: Suzu

引用:
パワーポイントにペーストされた時の縦と横の長さです。
(パソコンAでは、縦 16.25、横 29.08でペースト。パソコンBでは、縦 16.83、横 26.69でペースト)

 
これは、パワーポイントに張り付けたShape の張り付けた時点での、
高さ と、幅 のサイズ であり、単位は、cm と言うことで良いですよね。
 
コードでは、その Shape に対し、Width を設定していますから、
パソコンA パソコンB で 幅 の値はあまり変わらないはずです。
 
それなのに、Width を指定しても パソコンA パソコンB で 幅が違うと言うことでしょうか?
 
それが、
引用:
.LockAspectRatio = msoFalse '縦横比を固定

への勘違いによる Height の値の違いの事であれば良いのですが・・
 
 
サイズの考え方について サイトのリンクを挙げておきますね
 
PowerPointマクロ上での長さ(pixel)とcmを換算する方法
https://www.momen40.net/entry/2016/11/17/202127
 
今更聞けない!ピクセルとセンチ、解像度(dpi)の関係とは
https://uxmilk.jp/48376
 
Excel VBAでオートシェープ図形のサイズを書式サイズに合わせて計算する
https://neverendworks.com/news/calculate-the-size-of-an-auto-shape-shape-in-excel-vba-to-fit-the-format-size/

回答
投稿日時: 22/09/06 11:56:09
投稿者: Suzu

Width を指定しても やはり パソコンにより cm 表示の値が異なってしまうのであれば
 
ppslide.Shapes.PasteSpecial DataType:=2, Link:=msoFalse 'datatypeが2は拡張メタファイル
 
メタファイル【以外】を試してみてはどうでしょう。

投稿日時: 22/09/07 15:53:39
投稿者: Alice

Suzu様
 
たくさんアドバイスを記載して下さり、ありがとうございます。
参考になる情報のリンクを掲載して下さり、勉強になります。
 
自分のPCと、他のPCの解像度を確認したところ、その点は同じでした。
ですが、「拡大縮小とレイアウト」項目の「テキスト、アプリ、その他の項目のサイズを変更する」が異なっていた(※参照)為、自分のPCをもう一方のPCと同様にしたところ、同様の現象が見受けられました。
そこで原因は、この点にあると考えています。
 
(※参照)
・自分のPC→100%
・他のPC→150%
 
取り急ぎ、「テキスト、アプリ、その他の項目のサイズを変更する」を他のPCと同様にした状態で、ペースト後の下記Width等の数値を変えて対処中です。
 

引用:
With ppslide.Shapes(p_ind)
       .LockAspectRatio = msoFalse '縦横比を固定
                          
         If direct_file(i, 1) = 2 Then 'スライド2枚目
           .Width = 834.803149606299
           .Top = 82.2047244094488
           .Left = 4.25196850393701
                              
         ElseIf direct_file(i, 1) = 3 Then 'スライド3枚目
            .Width = 836.220472440945
            .Left = 2.83464566929134
                          
        End If
                          
   End With

 
引用:
.LockAspectRatio = msoFalse

→ここの点を気にして下さっていましたが、他の箇所でも同様の記述をしていて見返したところ、単に私が「msoTrue」にしていなかったというオペミスでした。
お恥ずかしいケアレスミスを記載してしまいました。
 
リモートワーク等で、別PCですぐにリトライできない状態の為、別PCで解決できたことを確認してから本件の質問をクローズしようと思います。

回答
投稿日時: 22/09/08 16:16:12
投稿者: Suzu

引用:
「拡大縮小とレイアウト」項目の「テキスト、アプリ、その他の項目のサイズを変更する」が異なっていた(※参照)為、自分のPCをもう一方のPCと同様にしたところ、同様の現象が見受けられました。
そこで原因は、この点にあると考えています。
 
(※参照)
・自分のPC→100%
・他のPC→150%

 
そういえば、貼り付けサイズはその設定に影響を受けますね。
失念しておりました。失礼いたしました。
 
 
 
掲示頂いたコードは コードを実行すると、貼り付け後、幅変更がなされますよね?
 
変えているのは、幅だけなので、縦横を固定していないなら、
その他の項目のサイズを変更するに影響を受けます。
 
22/09/07 15:53:39 のコードは、
22/09/05 16:41:20 質問時 のコードとサイズ変更の部分については 一緒ですよね?
 
と言うことは、コード上では変更せずに
 
PCの設定
引用:
「テキスト、アプリ、その他の項目のサイズを変更する」を他のPCと同様にした

で対応したと言うことでしょうか?
 
.LockAspectRatio = msoFalse
 のままで 幅と同時に 高さもコードで指定すれば済むと思うのですが、
縦横の比率が変わるのが嫌と言うことでしょうか?

投稿日時: 22/09/14 13:52:30
投稿者: Alice

Suzu様
 
コメントの記載ありがとうございます。
まだ他のPCで試せていないこともあり、返信が大変遅くなりました。申し訳ないです。
 

引用:
そういえば、貼り付けサイズはその設定に影響を受けますね。

→そうなんですね( ノД`)。
 今後、同様の作業を自動化する時は、気に留めなくてはならないですね。
 
引用:
.LockAspectRatio = msoFalse
 のままで 幅と同時に 高さもコードで指定すれば済むと思うのですが、
縦横の比率が変わるのが嫌と言うことでしょうか?

 
→上長からの指示で「縦横の比率を固定で!」の為、Suzu様がおっしゃるとおりのことができないのです。。
(以前は、縦横の比率を固定せず、縦と幅のサイズを指定していたのですが、そうすると文字や数字が縦長になり「見栄えが悪い」ということで。)
 
自分のPCのディスプレイ設定の下記項目を敢えて、別PCと同じパーセントにした上で目視チェックしながらペーペースト後、見栄えが整うように幅等の数値を指定する作業を続けていました。
 
・「拡大縮小とレイアウト」項目の「テキスト、アプリ、その他の項目のサイズを変更する」

回答
投稿日時: 22/09/15 10:09:36
投稿者: Suzu

引用:
→上長からの指示で「縦横の比率を固定で!」

引用:
自分のPCのディスプレイ設定の下記項目を敢えて、別PCと同じパーセントにした上で目視チェックしながらペーペースト後、見栄えが整うように幅等の数値を指定する作業を続けていました。

 
VBA 処理として考えうるのは
・一時的に100%に変更し コピペ
・VBAで コピー/貼付後のサイズ を比較し、コピー元のサイズを調整
 
後者は
1) 貼付後の Shape の Width/Height (比率)を決める
2) コピー範囲 の Rangeの Width/Height を取得後 コピペ
3) 貼付後のShapeの Width/Height を取得
4) Rangeの Width または Height を調整
5) Rangeをコピペ
 
の様にすれば、比率に依存する事は無くなります。
 
試していませんが 1) の 比率 の値を
・解像度
・「拡大縮小とレイアウト」項目の「テキスト、アプリ、その他の項目のサイズを変更する」
の設定毎に 持たせる 事で 自動化できませんかね。
 
 
"テキスト、アプリ、その他の項目のサイズを変更する" VBA で WEB検索をすると
テキスト、アプリ、その他の項目のサイズを変更する の 値 についてのコードを発見する事ができました。
 
試してみるのも一考かと。
 
 
ただ、画面のちらつきは出てしまうのかな・・
新規仮想デスクトップ を VBAで作成し 100% に設定としても、ちらつくのでしょうね。。
 
 
解像度、倍率 それぞれの時の 係数を予めもっておき〜
 が、ちらつき と言う上では有利でしょうね。

投稿日時: 22/10/03 12:10:28
投稿者: Alice

Suzu様
 
追加のコメントを記載して下さりありがとうございます。
 
本日ようやく、別のPC(※)で試したところpptのスライドに収まるようになりました。
 
※「拡大縮小とレイアウト」項目の「テキスト、アプリ、その他の項目のサイズを変更する」が150%
 自分のPCは100%。
 
今回は自分のPCを別PCと同様のディスプレイ設定にして地道にスライドに収まるようにサイズ修正をしたマクロで運用していきますが、今後類似の作業を自動化させたい際はSuzu様のアイデアも取り入れてみようと思います。
 
Suzu様のコメントは、自分の知識以上の提案をして下さり大変勉強になります。
改めてありがとうございました。