データを表形式で印刷する
                                                        玄関へお回り下さい。
データを表形式で印刷する               (024)

1.表形式に罫線を引いて印刷します。
2.見やすいように行の高さを1.5倍にします。
3.汎用性を持たすために改ページ処理をいれます。
4.変更が容易なように変数での処理をしました。


印刷でフォントサイズの変更等がうまくいかなかった人は、マイクロソフトの技術情報、 印刷関連の制限事項および注意点を参考にし、対処して下さい。

印刷処理                (024)
     メニューを作成し
Private Sub mnuFilePrint_Click()
'メニューの印刷部分
  Dim i    As Integer
  Dim j    As Integer
  Dim Zan   As Integer   '最後ページの人員
  Dim Mai   As Integer   '印刷枚数
  Dim Peji  As Integer   '印刷済ページ
  Dim Ken   As Integer   'データ個数
  Dim KaigyoH As Single    '改行高さ
  Dim Tyousei As Single    '調整値
  Dim Uyohaku As Integer   '上余白
  Dim Lyohaku As Integer   '左余白
  Dim Kamoku As Integer   '科目数
  Dim CharX  As Single    '印刷桁位置
  Dim CharY  As Single    '印刷行位置
  Dim Ken1  As Integer   '現在のページのデータ数

  Ken = MSFlexGrid1.Rows - 1
  KaigyoH = 1.5      '改行高さを1.5倍に設定
  Tyousei = 0.25     '微調整分を1/4行
  Uyohaku = 3       '上余白を2行分
  Lyohaku = 7       '左余白を7桁分
  Kamoku = 5       '科目数
  Printer.PaperSize = vbPRPSA4      '用紙サイズをA4に
  Printer.Orientation = vbPRORPortrait  '縦向き印刷
  Me.MousePointer = vbHourglass      '砂時計
  'カレントセルの反転表示を解除(表示を早くする)
  MSFlexGrid1.HighLight = flexHighlightNever
  DoEvents              '砂時計を表示してから次に進む
  Printer.ScaleMode = 4        'キャラクター単位に設定
  Printer.CurrentX = 31: Printer.CurrentY = 1 'タイトルの印刷位置
  Printer.FontName = "MS 明朝": Printer.FontBold = True
  Printer.FontSize = 16
  Printer.Print "成 績 表"
  Printer.FontSize = 12: Printer.FontBold = False
  CharX = Printer.TextWidth("あ")   'プリンター上での文字の幅を取得
  CharY = Printer.TextHeight("あ")  'プリンター上での文字の高さを取得
  Printer.CurrentX = Lyohaku + 1   '左余白
  Printer.CurrentY = Uyohaku     '上余白
      Printer.Print "No" & Space$(3) & _
        "氏   名" & Space$(4) & _
         "国 語 数 学 英 語 合 計 平均点"
  Printer.CurrentY = Printer.CurrentY + 0.5
    '印刷枚数の計算
    If Ken <= 42 Then
      Ken1 = Ken
      Mai = 1
    Else
      Peji = 1
      Mai = Ken \ 42
      Zan = Ken Mod 42
      If Zan Then
        Mai = Mai + 1
      End If
    End If

  '各個人データの印刷
  For i = 1 To Ken
    MSFlexGrid1.Row = i
    MSFlexGrid1.Col = 1
      Printer.CurrentX = Lyohaku + 1 '左余白

      Printer.Print Right$("  " & MSFlexGrid1.Text, _
        3) & " "; 'Noの印刷
      MSFlexGrid1.Col = 2
      Printer.Print MSFlexGrid1.Text; '氏名の印刷
      For j = 3 To Kamoku + 2
        MSFlexGrid1.Col = j
        If j = 7 Then
          '平均点の印刷
          Printer.Print Tab(11 + (j - 1) * 8 + 1) _
           ; Right$("    " & Format$(MSFlexGrid1. _
             Text, "######.0"), 8)
        Else
          '各科目の点数印刷
          Printer.Print Tab(11 + (j - 1) * 8 + 1); _
          Right$("    " & Format$(MSFlexGrid1.Text, _
            "########"), 8);
        End If
      Next j
    '改行幅を1.5倍に設定
    Printer.CurrentY = Printer.CurrentY + 0.5
    Printer.CurrentX = Lyohaku + 1 '左余白

    If Mai > Peji And (i Mod 42) = 0 Then
      '2ページ以上の場合の罫線処理及び改ページ
      Ken1 = 42
      Call sLinePrint(KaigyoH, Tyousei, Uyohaku, _
             Lyohaku, Kamoku, CharX, CharY, Ken1)
      Peji = Peji + 1
      Printer.NewPage  '改ページ
      Printer.CurrentX = 31: Printer.CurrentY = 1 'タイトルの印刷位置
      Printer.FontName = "MS 明朝": Printer.FontBold = True
      Printer.FontSize = 16
      Printer.Print "成 績 表"
      Printer.FontSize = 12: Printer.FontBold = False
      Printer.CurrentX = Lyohaku + 1 '左余白
      Printer.CurrentY = Uyohaku '上余白
      Printer.Print "No" & Space$(3) & _
        "氏   名" & Space$(4) & _
         "国 語 数 学 英 語 合 計 平均点"
      Printer.CurrentY = Printer.CurrentY + 0.5
    End If
    If Mai = 1 And Ken = i Then
      '1枚以内の場合の処理
      Call sLinePrint(KaigyoH, Tyousei, Uyohaku, _
             Lyohaku, Kamoku, CharX, CharY, Ken1)
      Mai = 0
    End If
    If Mai = Peji And i = Ken And Zan Then
      '最後のページの罫線処理
      Ken1 = Zan
      Call sLinePrint(KaigyoH, Tyousei, Uyohaku, _
             Lyohaku, Kamoku, CharX, CharY, Ken1)
    End If

  Next i
  Printer.EndDoc '印刷終了
  Form1.MousePointer = vbDefault  '砂時計から元に戻す
  'カレントセルを反転表示に戻す
  MSFlexGrid1.HighLight = flexHighlightAlways

End Sub


Private Sub sLinePrint(KaigyoH As Single, Tyousei As Single, _
    Uyohaku As Integer, Lyohaku As Integer, Kamoku As Integer, _
    CharX As Single, CharY As Single, Ken1 As Integer)
'罫線処理のサブルーチン

  Dim X As Integer
  Dim Y As Integer
  '最初の縦罫線
  Printer.Line (Lyohaku, Uyohaku - Tyousei)-(Lyohaku, _
    (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)
  '2本目の縦罫線
  Printer.Line (12, Uyohaku - Tyousei)-(12, _
    (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)
  '名前の後の縦罫線を科目事に引く
  For X = 0 To Kamoku * 4 Step 4
    Printer.Line ((14 + X) * CharX, Uyohaku - Tyousei _
      )-((14 + X) * CharX, (Ken1 + Uyohaku) _
        * (CharY * KaigyoH) - Tyousei)
  Next X
  '横罫線
  For Y = Uyohaku - 1 To Ken1 + Uyohaku
    Printer.Line (Lyohaku, (Y * CharY * KaigyoH _
      ) - Tyousei)-((14 + Kamoku * 4) * CharX, _
        (Y * CharY * KaigyoH) - Tyousei)
  Next Y
End Sub


ついでに終了のメニュー
Private Sub mnuFileExit_Click()
'終了のメニュー
  Unload Me
End Sub



2002/04/27