WindowsのDPI設定(スケーリング)に負けないExcel改ページ標準化の施策

![スケーリングとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/c5479b7c-072c-62dd-724d-6ea8fecf590b.png)

### 1. まずWindowsのスケーリングとは（おさらい）

高解像度ディスプレイに対して、表示する文字の倍率を大きくするなどして、
極精細になりがちな文字などを、標準の人間が読める精度にするWindowsOSの標準機能です。
様々なディスプレイを搭載するパソコンがあるので、スケーリング設定は一律100%が普通、とはいかないのです。
(ITmedia 様)[Windows 10でディスプレイの表示スケールの設定を変更して見やすくする](https://atmarkit.itmedia.co.jp/ait/articles/1912/05/news019.html)
(ASCII.jp 様)[Windowsのディスプレイとモニター　いまだ96DPIが基準](https://ascii.jp/elem/000/004/038/4038068/)


### 2. スケーリングの違いでExcelの改ページがずれまくる事態が発生する問題

(SEからの脱出日記 様)[共有のExcel 印刷 ユーザーによって改ページ ずれる 対処方法](https://nw-engineer.work/excel-display/)
>Excel印刷レイアウトが正常だった人はディスプレイ解像度は100％でした。
>Excel印刷レイアウトがずれていた人はディスプレイ解像度は125％でした。
>年配の方は老眼の方が多くディスプレイ解像度をあげていたのです！！！

ん～、、老眼じゃなくても最近のノートPCは高解像度ディスプレイなので、
PCメーカのデフォルトでスケーリング125%（推奨）とか150%（推奨）が逆にデフォなのですよね。。

(Microsoft 様)[高 DPI デバイスでの Windows のスケーリングの問題](
https://support.microsoft.com/ja-jp/topic/%E9%AB%98-dpi-%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%A7%E3%81%AE-windows-%E3%81%AE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%95%8F%E9%A1%8C-508483cd-7c59-0d08-12b0-960b99aa347d)
(Microsoft 様)[Office ソリューションでの高 DPI と DPI スケーリングの処理](
https://docs.microsoft.com/ja-jp/office/client-developer/ddpi/handle-high-dpi-and-dpi-scaling-in-your-office-solution)
・・・いや、課題わかってるなら早く直しておいてよ、と。


そして、何もしてなくてもレイアウトが崩れてくれるExcel（！）は、
このスケーリングの違いでも見事にズレてくれるのです。。

これに気が付かなった私は、
スケーリング100%設定の方のエクセル原稿をスケーリング125%で校正した結果、
なんで毎回改ページがすれているんだろ！修正！・・・とやる度に無限ループになっていたのです。。


### 3. Windowsのスケーリング設定が違っても同じ改ページで編集出来るようにする施策

※この対策は、こちらの **[やっぱり「Excel方眼紙」でマニュアルを作ろうと思った(「Relax Tools Addin」のおかげ)](https://qiita.com/hiro-matsumoto/items/80f2ec1282044a8f0a59)** の運用を前提にしています。

スケーリング100%の時の改ページ位置を記載（例：1ページ34行）しておいて、
ExcelVBAで、改ページの位置をポイントしていく運用を考えました。
この機能を使えば、スケーリングが違うパソコン環境でも、スケーリング100%時の改ページ位置が分かるようになります。
その位置で明示的に改ページを設定していけば、スケーリングが違う環境でも同じ改ページ位置を確保できる訳です。

また、2ページ以降は「印刷タイトル」分行数を減らして全体が同じページ行数になるようにしています。

**Excel VBAコード**
```vb
Sub WindowsのDPI設定に負けないExcel改ページ標準化()

Dim PTRows As Variant
Dim PTRowsCount As Integer
Dim NumOfPL As Integer
Dim Pages As Integer

'mougモーグ 様
'行/列タイトルを設定する（PrintTitleRows/PrintTitleColumnsプロパティ）｜Excel
'https://www.moug.net/tech/exvba/0070015.html
    '構文　Object.PrintTitleRows     印刷タイトル行の設定/取得
    ' 　   Object.PrintTitleColumns  印刷タイトル列の設定/取得

    '印刷タイトルの行範囲取得
    With ActiveSheet.PageSetup
        PTRows = .PrintTitleRows
    End With

'大体でIT　様
'【VBA】Rangeの行、列、行数、列数を取得【Row、Column、Countを使う】
'https://daitaideit.com/vba-range/

    '印刷タイトルの行数カウント
    If PTRows = "" Then
        PTRowsCount = 0
    Else
        With ActiveSheet.Range(PTRows)
            PTRowsCount = .Rows.Count
            'MsgBox ("印刷タイトルの行数" & vbCrLf & .Rows.Count)
        End With
    End If

NumOfPL = ActiveSheet.Range("NumOfPL").Value    '指定された1ページの行数読み出し
Pages = ActiveSheet.Range("Pages").Value        '指定されたページ数読み出し

    'ポインタ書き出し列（AL列）の値削除
    Columns("AL:AL").Select
    Selection.ClearContents

'１ページ目の改ページポインタ「≪」書き出し
    ActiveSheet.Cells(NumOfPL, "AL").Value = "≪"

'2ページ目以降の改ページポインタ「≪」書き出し
    For i = 2 To Pages
      ActiveSheet.Cells(NumOfPL * i - PTRowsCount, "AL").Value = "≪"
    Next i

End Sub
```

**操作の様子**
（１）最初にスケーリング100%で改ページ位置を確認して値を決定する。
![WindowsのDPI設定に負けないExcel改ページ標準化(1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/20279aa7-57c1-c5d6-ff61-68f25d0bd86d.gif)

（２）次にスケーリングを変えると（125%など）自動改ぺージはずれるが、
　　　改ページ目安ポインタがあるので同じ位置で改ページを設定できる。
![WindowsのDPI設定に負けないExcel改ページ標準化(2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/970e213b-b875-8286-428c-cadc1faded9e.gif)

以上です。