1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-06-17

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_ChangetxtZoom_Change で数値を同期・バリデーションを行います。


3. モジュール構成(PrintModule.bas)

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

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. 使い方 & 呼び出し例

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

6. カスタマイズ例

  • 用紙サイズ/対応機種の追加
  • 両面印刷モードの細分化
  • デフォルト設定の永続化(レジストリ or 設定シート)
    スクリーンショット 2025-06-18 011922.png

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?