SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Excel VBAでさまざまな表印刷を行う

VBAでデータベースからの作表・印刷処理を自動化する 2

Excel VBAでさまざまな表印刷を行う - ユーザーフォーム編

ユーザーフォームの処理

 このフォームでは、クエリの実行とオートフォーマットの設定、ページ設定と印刷処理を行います。

選択クエリの作成

 最初に選択クエリを作成します。この処理は、フォームのInitializeイベントプロシージャとCommandButton1のClickイベントプロシージャに作成します。

  1. フォームの宣言セクションで変数RowNoを宣言します。クエリ結果の総レコード数や作表時の行番号として、複数のプロシージャで使用しますので、モジュールレベル変数で宣言しておきます。
  2. そして、Initializeイベントプロシージャで、ドロップダウンリストボックスのリスト項目を設定します。これらは、クエリの条件と同じ名前にしています。
    Dim RowNo As Integer, ColumnNo As Integer
    
    Private Sub UserForm_Initialize()
        With ComboBox1
            .AddItem "地球連邦軍"
            .AddItem "ジオン公国軍"
            .AddItem "エゥーゴ"
            .AddItem "ティターンズ"
            .AddItem "ネオ・ジオン"
            .Text = .List(0)
        End With
    End Sub
    
  1. CommandButton1はクエリを実行するボタンで、ここでデータベース処理を行なわせます。
  2. まず、ワークシートに残っている前回のセルデータを消去します。そして、ドロップダウンリストボックスで選択されたリスト項目を取得し、クエリ用SQL文字列を作成します。ここでは、データベースのフィールド「所属」の値でクエリを実行するようにしています。
    Private Sub CommandButton1_Click()
        Dim SQLstring As String
    
        Worksheets("Sheet1").Cells.Select
        Selection.Clear
        Range("A1").Select
    
        'データベースを開きクエリを実行する
        Select Case ComboBox1.Text
            Case "地球連邦軍"
                SQLstring = "Select * from MSデータ _
                              Where MSデータ.所属 = '地球連邦軍'"
            Case "ジオン公国軍"
                SQLstring = "Select * from MSデータ _
                              Where MSデータ.所属 = 'ジオン公国軍'"
            Case "エゥーゴ"
                SQLstring = "Select * from MSデータ _
                              Where MSデータ.所属 = 'エゥーゴ'"
            Case "ティターンズ"
                SQLstring = "Select * from MSデータ _
                              Where MSデータ.所属 = 'ティターンズ'"
            Case "ネオ・ジオン"
                SQLstring = "Select * from MSデータ _
                              Where MSデータ.所属 = 'ネオ・ジオン'"
        End Select
    
  1. SQL文字列ができたら、フィールド数を「4」にして標準モジュール「Module2」にあるデータベース処理用Functionプロシージャ「DBAccess」を実行します。クエリが実行され、レコードデータがワークシートのセルに転送されます。
  2. そして、戻り値であるクエリ結果の総レコード数を変数に格納しておきます。
        ColumnNo = 4
        RowNo = Module2.DBAccess(SQLstring, ColumnNo)
    End Sub
    

オートフォーマットの設定処理

 今度は、オートフォーマットの設定処理です。コレクションは、4つのトグルボタンのClickイベントプロシージャで行います。

  1. まず、トグルボタンがユーザーによって押されると、ボタンは押し込んだ状態になり、Valueプロパティに「True」が格納されます。この値を調べ、ボタンが押し込まれていれば、他の3つのボタンのValueプロパティを「False」にセットし、それまで押し込まれているボタンがあればボタンをアップ状態にします。こうすることで、4つのトグルボタンコントロールを「ラジオボタン」のように、1つ押し込めばその前に押し込んでいた他のボタンがポップアップするような効果を作ることができます。
  2. 設定できるオートフォーマットは、必ず1つしかないからです。
    そして、AutoFormatメソッドを使用してデータのあるセル範囲にオートフォーマットを実行します。
    Private Sub ToggleButton1_Click()
        Range("A1").Select
        If ToggleButton1.Value = True Then
            ToggleButton2.Value = False
            ToggleButton3.Value = False
            ToggleButton4.Value = False
            Selection.AutoFormat Format:=xlRangeAutoFormatColor1
    
    1つを押し込むと
    1つを押し込むと
    それまで押し込まれていたボタンがポップアップする
    それまで押し込まれていたボタンがポップアップする
  1. もし、Valueプロパティの値がFalseであれば、ボタンはポップアップした状態なので、オートフォーマットを解除します。コレクションは、AutoFormatメソッドの引数FormatxlRangeAutoFormatNoneをセットして実行します。
  2.     Else
            Selection.AutoFormat Format:=xlRangeAutoFormatNone
        End If
    
    End Sub
    
  1. 同じような処理を、残り3つのトグルボタンのClickイベントプロシージャに作成します。それぞれ、AutoFormatメソッドの引数Formatの値を変え、違うスタイルのオートフォーマットが設定できるようにします。
  2. Private Sub ToggleButton2_Click()
        Range("A1").Select
        If ToggleButton2.Value = True Then
            ToggleButton1.Value = False
            ToggleButton3.Value = False
            ToggleButton4.Value = False
            Selection.AutoFormat Format:=xlRangeAutoFormatColor2
        Else
            Selection.AutoFormat Format:=xlRangeAutoFormatNone
        End If
    
    End Sub
    
    Private Sub ToggleButton3_Click()
        Range("A1").Select
        If ToggleButton3.Value = True Then
            ToggleButton2.Value = False
            ToggleButton1.Value = False
            ToggleButton4.Value = False
            Selection.AutoFormat Format:=xlRangeAutoFormatClassic2
        Else
            Selection.AutoFormat Format:=xlRangeAutoFormatNone
        End If
    End Sub
    
    Private Sub ToggleButton4_Click()
        Range("A1").Select
        If ToggleButton4.Value = True Then
            ToggleButton2.Value = False
            ToggleButton3.Value = False
            ToggleButton1.Value = False
            Selection.AutoFormat Format:=xlRangeAutoFormatList1
        Else
            Selection.AutoFormat Format:=xlRangeAutoFormatNone
        End If
    End Sub
    
AutoFormatメソッドの引数Formatの設定値
xlRangeAutoFormat3DEffects1 xlRangeAutoFormat3DEffects2
xlRangeAutoFormatAccounting1xlRangeAutoFormatAccounting2
xlRangeAutoFormatAccounting3xlRangeAutoFormatAccounting4
xlRangeAutoFormatClassic1xlRangeAutoFormatClassic2
xlRangeAutoFormatClassic3xlRangeAutoFormatClassicPivotTable
xlRangeAutoFormatColor1xlRangeAutoFormatColor2
xlRangeAutoFormatColor3xlRangeAutoFormatList1
xlRangeAutoFormatList2xlRangeAutoFormatList3
xlRangeAutoFormatLocalFormat1xlRangeAutoFormatLocalFormat2
xlRangeAutoFormatLocalFormat3xlRangeAutoFormatLocalFormat4
xlRangeAutoFormatNonexlRangeAutoFormatPTNone
xlRangeAutoFormatReport1xlRangeAutoFormatReport2
xlRangeAutoFormatReport3xlRangeAutoFormatReport4
xlRangeAutoFormatReport5xlRangeAutoFormatReport6
xlRangeAutoFormatReport7xlRangeAutoFormatReport8
xlRangeAutoFormatReport9xlRangeAutoFormatReport10
xlRangeAutoFormatSimplexlRangeAutoFormatTable1
xlRangeAutoFormatTable2xlRangeAutoFormatTable3
xlRangeAutoFormatTable4xlRangeAutoFormatTable5
xlRangeAutoFormatTable6xlRangeAutoFormatTable7
xlRangeAutoFormatTable8xlRangeAutoFormatTable9
xlRangeAutoFormatTable10

印刷パラメータの設定処理

 表を1ページに収めて印刷する処理を組み立てます。また、印刷を実行する際の部数やページ番号印刷など、印刷にかかわるパラメータを設定する処理を作成します。

  1. スピンボタンコントロールは、印刷部数を設定するようにしました。スピンボタンを押すと、コントロールにはChangeイベントが発生し、またValueプロパティにその時の押した量が格納されます。それを、ラベルコントロールのCaptionプロパティにセットし、現在の操作量が一目で分かるようにします。
  2. Private Sub SpinButton1_Change()
        Label1.Caption = SpinButton1.Value
    End Sub
    
  1. コマンドボタン「CommandButton2」は「印刷」ボタンで、ページ設定と印刷処理を実行します。
  2. イベントプロシージャの冒頭で、クエリが実行されていないのに印刷ボタンが押された場合の処理を組んでおきます。データベース実行プロシージャの戻り値を格納している変数RowNoを調べれば、クエリが実行されたのかどうかが分かりますので、「0」の場合はメッセージを表示しこのプロシージャを終了します。
    Private Sub CommandButton2_Click()
        Dim Ret As Integer
        Dim Ttl As Single
        Dim Title As String
    
        If RowNo = 0 Then
            MsgBox "クエリを実行してください"
            Exit Sub
        End If
    
  1. 続いて、表のタイトルをテキストボックスコントロールから取得し、変数に格納します。また、セル幅をセルのデータに合わせるオートフィットを実行します。そして、セルの列幅の合計寸法を計算し、cmに換算します。
  2.     Title = TextBox1.Text
    
    Range(Cells(1, 1), Cells(1, ColumnNo)).Select
    Selection.EntireColumn.AutoFit
    
    For i = 1 To ColumnNo
        Ttl = Ttl + Cells(1, i).Width
    Next
    
    Ttl = Round(Ttl * 0.35) / 10
    
  1. 合計寸法を元に、ページ設定を切り替えます。これは、既に標準モジュール「Module1」に作成してあるプロシージャ「PrintSet」を呼び出します。この辺は、コードバージョンとまったく同じコードです。コードを書くモジュールが違っていますので、参照するモジュール名を付加しているだけです。
  2. Select Case Ttl
        Case Is < 17
            Call Module1.PrintSet("A4縦", 2, Title)
        Case 17 To 19
            Call Module1.PrintSet("A4縦", 1, Title) '左右のマージンで調整
        Case 20 To 26
            Call Module1.PrintSet("A4横", 2, Title)
        Case 27 To 28
            Call Module1.PrintSet("A4横", 1, Title)
        Case Is > 28
            Call Module1.FitPage(Title)   'データを用紙に収めて印刷する
    End Select
    
  1. 「その他の設定」のチェックボックスを調べ、チェックが入っていればその設定を、チェックが外れていれば設定を解除する操作をします。
  2. まず、白黒印刷設定です。チェックボックスコントロールがユーザーによってチェックされると、ValueプロパティにTrueが格納されます。そこで、この値を調べチェックされていればPageSetupオブジェクトの「BlackAndWhite」プロパティをTrueにします。チェックされていなければFalseにします。
    If CheckBox1.Value = True Then
        Worksheets("Sheet1").PageSetup.BlackAndWhite = True
    Else
        Worksheets("Sheet1").PageSetup.BlackAndWhite = False
    End If
    
    ページ番号の印刷設定は、フッターを使用します。フッター領域の中央にページ番号をつけますので、「CenterFooter」プロパティに、ページ番号を指定する書式コードを設定します。その際、「- 1 -」という文字列になるようにしています。チェックが付いていなければ、このプロパティに""(空白)をセットし、ページ番号を印刷しないようにします。
    If CheckBox2.Value = True Then
        Worksheets("Sheet1").PageSetup.CenterFooter = "- &P -"
    Else
        Worksheets("Sheet1").PageSetup.CenterFooter = ""
    End If
    
    行列番号の印刷設定は、「PrintHeadings」プロパティを使用します。Trueにすると、ワークシートの行列番号もいっしょに印刷します。
    If CheckBox3.Value = True Then
        Worksheets("Sheet1").PageSetup.PrintHeadings = True
    Else
        Worksheets("Sheet1").PageSetup.PrintHeadings = False
    End If
    
  1. ここまでのページ設定ができたら、印刷を開始します。PrintOutメソッドの引数Copiesに、スピンボタンのValueプロパティの値をセットし、印刷部数を指定します。また、変数RowNoを「0」に戻し、次の操作時にクエリが実行されないのにこのボタンが押された場合の処理に備えます。
  2. 最後に、「閉じる」ボタンの処理です。このボタンが押された場合は、何もせずにマクロを終了します。
        '印刷開始
        With Worksheets("Sheet1")
            .Range("A1").Select
            .PrintOut Copies:=SpinButton1.Value
        End With
    
        RowNo = 0
    End Sub
    
    Private Sub CommandButton3_Click()
        Unload Me
        End
    End Sub
    

次のページ
完成ソース

この記事は参考になりましたか?

Excel VBAでさまざまな表印刷を行う連載記事一覧
この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1251 2007/05/11 08:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー