Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【エクセルVBA】この係数「1.2」(倍)は何を意味していますか?【[オートシェイプ選択]-[図として保存]同等動作を想定】

解決したいこと

  • 必要な画像サイズを得るためにトライ&エラーの結果導けた係数「1.2」(倍)の意味を知りたい。

実際の動作とコード

  • 「4分割ウォール画面作成支援ツール.xlsm」を作成しましてこのように必要な動作は出来ています。
    • 操作内容
      • 「キャンバス」シートに原本画像を貼る。
      • 各「1」「2」「3」「4」シートの中央の枠に表示させたい画像の場所を合わせる。
      • 「プレビュー」シートで確認→「画像個別生成」ボタンを押す。
      • 作業フォルダに「PC_Layout-(1~4).jpg」が生成される。

「4分割ウォール画面作成支援ツール」動作の様子.avif

※この実行結果1つの画像サイズが「990×500」ピクセルのPNGファイルを4つ得られる。

  • 「画像個別生成」ボタンを押下した際に動作する標準モジュール
Sub SaveShapeAsPNG()
    Dim Shp As Shape
    Dim Cht As ChartObject
    Dim FileName As String
    Dim i As Integer
    
    ' 全てのシートの倍率を50%にする
    For Each bk In Workbooks
     bk.Activate
      For Each sh In bk.Worksheets
        sh.Select
        ActiveWindow.Zoom = 50
      Next
    Next
    
    ' プレビューシートへ移動してアクティブにする
    ThisWorkbook.Sheets("プレビュー").Select

    ' プレビューのシート保護を解除
    ActiveSheet.Unprotect

    ' プレビューシートに貼ってある「リンクされた図」(図 1~4)の画像を加工する
    For i = 1 To 4
        Set Shp = ActiveSheet.Shapes("Picture " & i)

        FileName = GetLocalPath(ThisWorkbook.path) & Application.PathSeparator & "PC_Layout" & "-" & i & ".png"

        With Shp
        ' セルの境界線も描画されてしまうのでトリミング
            .PictureFormat.CropTop = 1
            .PictureFormat.CropLeft = 1.75
            .PictureFormat.CropRight = 1.75
            .PictureFormat.CropBottom = 1
        ' 1枚のサイズを900×500ピクセルにする
            .Width = 990 * 1.2
            .Height = 500 * 1.2
        End With

    ' オートシェープをチャートにしないと図の保存ができない
    ' 参考情報(https://daitaideit.com/vba-shapes-export-picture/)など
        Set Cht = ActiveSheet.ChartObjects.Add(0, 0, Shp.Width, Shp.Height)

        With Cht
            Shp.CopyPicture Format:=xlBitmap 'オートシェイプを画像としてコピー
            .Chart.Parent.Select 'チャートを選択
            .Chart.Paste 'チャートに貼り付け
            .Chart.ChartArea.Format.Line.Visible = msoFalse '枠線を非表示
            .Chart.Export FileName
            .Delete 'チャートを削除
        End With

        With Shp
        ' 再度プレビューの枠に納める
            .Width = 495 * 1.2
            .Height = 250 * 1.2
        End With
    Next i

    ' プレビューのシート保護を再実施
    ActiveSheet.Protect

    MsgBox "画像を保存しました: PC_Layout-1.png から PC_Layout-4.png まで", vbInformation
End Sub

質問

  • このコード内の係数「1.2」を行う事で結果的に1つの画像サイズが「990×500」ピクセルのPNGファイルを得られたが、
        ' 1枚のサイズを900×500ピクセルにする
            .Width = 990 * 1.2
            .Height = 500 * 1.2

これは何を意味する数値なのか?

  • ※補足
    GetLocalPath(ThisWorkbook.path)は、OneDrive同期にてPathがおかしくなる回避策1のひとつである「VBA-FileTools(LibFileTools.bas)」2のコマンドです

自分で調査したこと

  • シートの倍率(50%)とポインタおよびピクセルの相関関係であるような情報を見たが、
    今回の場合具体的になぜそういう計算になるのかを教えていただきたい。

以上です。
よろしくお願いします。

  1. (furyutei様GitHubGist)[Excel][VBA] OneDrive 下に置いたブックの Path がおかしくなる不具合とその対策、他

  2. (stackoverflow)Excel's fullname property with OneDrive

0 likes

1Answer

GPT-5-mini(Cline - GitHub Copilot(VS Code LM API経由)による回答)

※もしや生成AIが回答できるのか?と思って試したら・・・出来ちゃいましたね。


結論: 係数「1.2」は「ピクセルで欲しい幅/高さ」をExcelの内部単位(ポイント)で指定するための補正係数で、画面のDPI(ディスプレイのピクセル密度)とシートのZoom値(ここでは50%)から導かれます。今回の環境では Windows の DPI が 120(表示スケーリング 125% に相当)で、シートズームが 50% のため次の式で計算され、1.2 になります。

説明と導出:

  • Excel の .Width/.Height は「ポイント(pt)」で扱われ、画像出力(Chart.Export)はポイント → ピクセル変換で DPI を使う。基本関係は以下。

$$ \text{ピクセル} = \text{ポイント} \times \frac{\text{DPI}}{72} \times \frac{\text{Zoom}}{100} $$

  • 逆に「あるピクセル数を得るために何ポイントにするか」は

$$ \text{ポイント} = \text{ピクセル} \times \frac{72}{\text{DPI}} \times \frac{100}{\text{Zoom}} $$

  • 今回の数値を当てはめる(DPI = 120、Zoom = 50)と

$$ \frac{72}{120} \times \frac{100}{50} = 0.6 \times 2 = 1.2 $$

したがって「990px にしたければ .Width = 990 * 1.2(ポイント)に設定する」と、Excel の出力処理を経て最終的に 990×500 ピクセルの PNG が得られます。

実務上の注意点(要点のみ)

  • DPI(Windows 表示スケーリング)やシートの Zoom を変えると係数は変わる。例: DPI=96(100%表示)かつ Zoom=100% なら係数は 72/96 * 100/100 = 0.75。
  • CopyPicture の形式や「リンクされた図」→チャート貼付けの処理順で出力結果に差が出る場合があるが、上記のポイント⇄ピクセルの変換が基本原理。
  • 汎用化するには、実行時に現在の Zoom とシステム DPI を参照して係数を自動計算するのが望ましい(DPI取得は WinAPI の GetDeviceCaps 等を使う必要あり)。
0Like

Your answer might help someone💌