ワンランク上のVBAを書いてみた その③

## 1. はじめに

* **目的**：ユーザー操作だけで用紙サイズ・向き・拡大率・カラー／モノクロ・両面印刷・印刷範囲を設定し、そのまま「プレビュー」または「印刷」できるフォームを作成
* **メリット**：標準ダイアログに頼らず、一度作ればプロジェクト横断で使い回し可能

---

## 2. フォーム設計概要

**フォーム名**：`frmPrintSetting`
**主なコントロール**

| コントロール名      | 種類            | 説明               |
| ------------ | ------------- | ---------------- |
| `cmbSize`    | ComboBox      | 用紙サイズ（A4／B5／A3…） |
| `cmbOrient`  | ComboBox      | 印刷の向き（縦／横）       |
| `cmbColor`   | ComboBox      | カラー／白黒           |
| `txtZoom`    | TextBox       | 拡大率（％）           |
| `spnZoom`    | SpinButton    | 拡大率用上下スピン        |
| `chkPreview` | CheckBox      | “印刷プレビューのみ”      |
| `chkDuplex`  | CheckBox      | “両面印刷（対応機種）”     |
| `txtRange`   | TextBox       | 印刷範囲（例：`A1:R31`） |
| `btnPrint`   | CommandButton | 実行（プレビュー or 印刷）  |
| `btnCancel`  | CommandButton | キャンセル（フォームを閉じる）  |

> **UserForm\_Initialize** で各リスト・キャプション・初期値を設定し、
> `spnZoom_Change`⇔`txtZoom_Change` で数値を同期・バリデーションを行います。

---

## 3. モジュール構成（PrintModule.bas）

```vb:PrintModule.bas
'──────────────────────────────────
' フォーム表示
Sub ShowPrintForm()
    frmPrintSetting.Show
End Sub

'──────────────────────────────────
' プリント設定反映 ＆ 印刷実行
Sub SetPrintSettings( _
    paperSize   As String, _
    orientation As String, _
    zoomPercent As Long, _
    previewOnly As Boolean, _
    duplex      As Boolean, _
    colorMode   As String, _
    printRange  As String)

    With ActiveSheet.PageSetup
        ' ズーム設定
        .Zoom = zoomPercent
        .FitToPagesWide = False: .FitToPagesTall = False

        ' 向き設定
        .Orientation = IIf(orientation = "縦", xlPortrait, xlLandscape)

        ' 用紙サイズ設定
        Select Case paperSize
            Case "A4": .PaperSize = xlPaperA4
            Case "B5": .PaperSize = xlPaperB5
            Case "A3": .PaperSize = xlPaperA3
            ' …追加可…
        End Select

        ' カラー設定
        .BlackAndWhite = (colorMode = "白黒")

        ' 両面印刷設定
        If duplex Then .Duplex = xlDuplexLongEdge

        ' 印刷範囲設定
        .PrintArea = IIf(printRange <> "", printRange, "")
    End With

    ' プレビュー or 実印刷
    If previewOnly Then
        ActiveSheet.PrintPreview
    Else
        ActiveSheet.PrintOut
    End If
End Sub
```

---

## 4. サンプルコード全文

（PrintModule.bas／frmPrintSetting.frm の完全版を GitHub Gist／添付ファイルリンクで掲載）

![スクリーンショット 2025-06-18 011619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12007/831e40f3-9ce8-429f-adfd-8d19d2fbe6ad.png)



```vb:PrintModule.bas
Option Explicit

Private Sub btnCancel_Click()
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    lblSize.Caption = "サイズ"
    cmbSize.AddItem "A4"
    cmbSize.AddItem "B5"
    cmbSize.AddItem "A3"
    cmbSize.ListIndex = 0


    lblOrient.Caption = "印刷の向き"
    cmbOrient.AddItem "縦"
    cmbOrient.AddItem "横"
    cmbOrient.ListIndex = 0

    lblColor.Caption = "色"
    cmbColor.AddItem "カラー"
    cmbColor.AddItem "白黒"
    cmbColor.ListIndex = 0

    lblZoom.Caption = "倍率"
    txtZoom.value = "100"
    spnZoom.Min = 10
    spnZoom.Max = 400
    spnZoom.value = 100
    
    chkPreview.Caption = "印刷プレビューのみ"
    chkDuplex.Caption = "両面印刷(対応機種)"
    
    txtRange.value = "" ' 空欄時はシート全体
    btnPrint.Caption = "印刷"
    btnCancel.Caption = "キャンセル"
    lblRange.Caption = "範囲指定"
End Sub

Private Sub btnPrint_Click()
    Me.Hide
    DoEvents
    Call SetPrintSettings( _
        cmbSize.value, cmbOrient.value, val(txtZoom.value), _
        chkPreview.value, chkDuplex.value, cmbColor.value, txtRange.value _
    )
End Sub


Private Sub spnZoom_Change()
    txtZoom.value = spnZoom.value
End Sub

Private Sub txtZoom_Change()
    If IsNumeric(txtZoom.value) Then
        Dim val As Long
        val = CLng(txtZoom.value)
        If val >= spnZoom.Min And val <= spnZoom.Max Then
            spnZoom.value = val
        End If
    End If
End Sub


```
---

## 5. 使い方 & 呼び出し例

```vb
' ボタンやメニューから…
Call ShowPrintForm
```

1. フォームで各項目を選択
2. 「印刷」ボタンで即実行 or プレビュー
3. 「キャンセル」でフォーム終了

---

## 6. カスタマイズ例

* 用紙サイズ／対応機種の追加
* 両面印刷モードの細分化
* デフォルト設定の永続化（レジストリ or 設定シート）
![スクリーンショット 2025-06-18 011922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12007/1d8a5586-de83-45a6-aef4-2d26dd2ef9f2.png)

---

## 7. まとめ & 今後の改善案

* **まとめ**：シンプルかつ汎用的なプリント設定フォームの実装手順を解説
* **改善案**：レイヤー化したプリセット機能、社員名シートへの自動連携など

---