VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 グリッド(MSFlexGrid)関係のメニュー
1.MSFlexGrid の主要プロパティ・メソッド一覧表
2.MSFlexGrid ワンポイントテクニック集(その1)
3.MSFlexGrid ワンポイントテクニック集(その2)
4.MSFlexGrid で Excel のようにセルに直接データを入力する
5.MSFlexGrid/MSHFlexGridへのデータ表示設定色々
6.MSFlexGrid/MSHFlexGrid の表示データをファイルに保存方法色々
7.MSFlexGrid/MSHFlexGrid で項目(科目)別集計をする
8.MSFlexGrid/MSHFlexGrid でコピー・アンド・ペースト色々
9.MSFlexGrid/MSHFlexGrid で列幅設定/行の高さ設定色々
10.MSFlexGrid/MSHFlexGrid にチェックボックスを表示する及び操作色々
11.MSFlexGrid/MSHFlexGrid に表示中のデータを罫線付きで印刷する
12.
13.
14.
15.
16.
17.
18.
19.
20.その他、MSFlexGrid 関係で当サイト内に掲載しているサンプルの紹介


11.MSFlexGrid/MSHFlexGrid に表示中のデータを罫線付きで印刷する
1.MSFlexGrid/MSHFlexGrid に表示中のデータを罫線付きで全ページ印刷
2.上記印刷に関する付帯処理
3.
4. 
5. 
6. 

テストに使用しているデータはこちらをお使い下さい。このサイトでのMSHFlexGrid のサンプルで共通で使用しますので解凍してこのプログラムと同じフォルダーに全てのファイルを入れておいて下さい。(このデータを1万件コピーしてテスト計測しております。)
 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:
使用 API:
その他 :プロジェクト→コンポーネント→コントロールで Microsoft FlexGrid Control 6.0(SP6) 又は、
    :Microsoft Hierarchical FlexGridにチェックを入れ、表示されたコントロールをフォームに貼り付けて下さい。
    :尚、当サイトで掲載している MSFlexGrid / MSFlexGrid 関係のサンプルは、上記と同様とし、今後は省略します。
このページのトップへ移動します。 1.MSFlexGrid/MSHFlexGrid に表示中のデータを罫線付きで全ページ印刷
印刷するデータは、ここのサンプルのテスト用データ(dbtest.csv)を使って試しております。
後で、改造・使い回しがしやすいように単純に書いております。又、データエラー等には対応しておりません。
A4 縦向き印刷では、41 行 半角80文字程度位しか印刷できませんので、印刷する科目・文字数を調整して下さい。
文字等の印刷は、fStrCut 関数で後方にスペースを埋め込み左揃えで指定の文字数で印刷しております。
数値等は、fPadLeft 関数で前方にスペースを埋め込み右揃えで指定の桁数で印刷しております。
尚、印刷用フォントは、印刷位置がずれないように等幅フォントの12ポイントを指定しております。

Private Sub Command1_Click()
  Dim i    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 CharX  As Single    '印刷桁位置
  Dim CharY  As Single    '印刷行位置
  Dim Ken1  As Integer   '現在のページのデータ数

  With MSHFlexGrid1
    Ken = .Rows - 1     '印刷データ件数
    KaigyoH = 1.5      '改行高さを1.5倍に設定
    Tyousei = 0.25     '罫線内縦方向の印刷位置(0.25=縦方向中央印字 0.5=下揃え 0=上揃え)
    Uyohaku = 3       '上余白を3行分
    Lyohaku = 8       '左余白を8桁分

    Printer.PaperSize = vbPRPSA4              '用紙サイズをA4に
    Printer.Orientation = vbPRORPortrait          '縦向き印刷
    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               '印刷開始位置を左端に移動
    Printer.CurrentY = Uyohaku               '印刷開始位置を上端に移動
    Printer.Print " No   氏  名   支店   部署名   入社年月  今期目標 今期実績 達成率"
    '下記のようにして印刷すれば、印刷位置と文字数の計算が解りやすい
    'Printer.Print "12345678901234567890123456789012345678901234567890123456789012345678901234567890"

    Printer.CurrentY = Printer.CurrentY + 0.5        '改行
    '印字枚数の計算
    If Ken <= 41 Then
      Ken1 = Ken
      Mai = 1
    Else
      Peji = 1
      Mai = Ken \ 41
      Zan = Ken Mod 41
      If Zan Then
        Mai = Mai + 1
      End If
    End If

     '各個人データの印字
    For i = 1 To Ken
      Printer.CurrentX = Lyohaku  '罫線の印刷位置より1文字分右へ(以下同様)  'Noの印刷開始位置
      'fPadLeft 関数で前方にスペースを埋め込み右揃え(5文字)で印刷
      Printer.Print fPadLeft(.TextMatrix(i, 0), 5, " ");           'Noの印字
      Printer.CurrentX = Lyohaku + 7                     '氏名の印刷開始位置
      'fStrCut 関数で後方にスペースを埋め込み左揃え(14文字)で印刷
      Printer.Print fStrCut(.TextMatrix(i, 1), 14);              '氏名の印字
      Printer.CurrentX = Lyohaku + 21                     '支店の印刷開始位置
      Printer.Print fStrCut(.TextMatrix(i, 2), 8);              '支店の印字
      Printer.CurrentX = Lyohaku + 29                     '部署の印刷開始位置
      Printer.Print fStrCut(.TextMatrix(i, 3), 12);              '部署名の印字
      Printer.CurrentX = Lyohaku + 41                     '入社の印刷開始位置
      Printer.Print Format$(.TextMatrix(i, 4), "yyyy/mm/dd");         '入社年月日の印字
      Printer.CurrentX = Lyohaku + 53                     '目標の印刷開始位置
      Printer.Print fPadLeft(Format$(.TextMatrix(i, 5), "#,### "), 9, " "); '今期目標の印字
      Printer.CurrentX = Lyohaku + 63                     '実績の印刷開始位置
      Printer.Print fPadLeft(Format$(.TextMatrix(i, 6), "#,### "), 9, " "); '今期実績の印字
      Printer.CurrentX = Lyohaku + 73                     '達成の印刷開始位置
      Printer.Print fPadLeft(Format$(.TextMatrix(i, 7), "###.0 "), 8, " ")  '達成率の印字
      Printer.CurrentY = Printer.CurrentY + 0.5                '1行改行
      Printer.CurrentX = Lyohaku                       '印刷開始位置を左端に移動

      If Mai > Peji And (i Mod 41) = 0 And Ken > i Then
        '2ページ以上の場合の罫線処理及び改ページ(41件以上の場合)
        Ken1 = 41
        Call sLinePrint(KaigyoH, Tyousei, Uyohaku, Lyohaku, CharY, Ken1)  '罫線を印刷
        Peji = Peji + 1                           '印刷済みページ数
        '2ページ以降のタイトル及び項目名の印刷処理
        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                     '印刷開始位置を左端に移動
        Printer.CurrentY = Uyohaku                     '印刷開始位置を上端に移動
        Printer.Print " No   氏  名   支店   部署名   入社年月  今期目標 今期実績 達成率"
        Printer.CurrentY = Printer.CurrentY + 0.5
      End If
      If Mai >= Peji And Ken = i And Zan = 0 Then
        '1枚以内の場合の処理(1ページ分(41件の場合)ちょうどの場合)
        Call sLinePrint(KaigyoH, Tyousei, Uyohaku, Lyohaku, CharY, Ken1)
        Mai = 0
      End If
      If Mai = Peji And i = Ken And Zan Then
        '最後のページの罫線処理(41件未満の場合)
        Ken1 = Zan
        Call sLinePrint(KaigyoH, Tyousei, Uyohaku, Lyohaku, CharY, Ken1)
      End If
    Next i
    Printer.EndDoc   '印字終了
  End With
End Sub

このページのトップへ移動します。 2.上記印刷に関する付帯処理

Private Sub sLinePrint(ByVal KaigyoH As Single, ByVal Tyousei As Single, ByVal Uyohaku As Integer, _
            ByVal Lyohaku As Integer, ByVal CharY As Single, ByVal Ken1 As Integer)
'罫線処理のサブルーチン
  Dim Y As Integer
  
' 縦罫線   ( 右方向位置 , 上の位置 ) - ( 右方向位置 , 下側の位置(印刷行数によって変わる)
  Printer.
Line (Lyohaku - 1, Uyohaku - Tyousei)-(Lyohaku - 1, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)
  Printer.
Line (Lyohaku + 6, Uyohaku - Tyousei)-(Lyohaku + 6, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)   ' No の終わりの線
  Printer.
Line (Lyohaku + 20, Uyohaku - Tyousei)-(Lyohaku + 20, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)  '氏名の終わりの線
  Printer.
Line (Lyohaku + 28, Uyohaku - Tyousei)-(Lyohaku + 28, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)  '支店の終わりの線
  Printer.
Line (Lyohaku + 40, Uyohaku - Tyousei)-(Lyohaku + 40, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)  '部署の終わりの線
  Printer.
Line (Lyohaku + 52, Uyohaku - Tyousei)-(Lyohaku + 52, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)  '入社の終わりの線
  Printer.
Line (Lyohaku + 62, Uyohaku - Tyousei)-(Lyohaku + 62, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)  '計画の終わりの線
  Printer.
Line (Lyohaku + 72, Uyohaku - Tyousei)-(Lyohaku + 72, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)  '実績の終わりの線
  Printer.
Line (Lyohaku + 80, Uyohaku - Tyousei)-(Lyohaku + 80, (Ken1 + Uyohaku) * (CharY * KaigyoH) - Tyousei)  '達成率の終わりの線
  
'横罫線
  For Y = Uyohaku - 1 To Ken1 + Uyohaku
    
'      ( 左端 , 上下の位置(各行の位置)) -    ( 右端の位置  , 上下の位置(各行の位置))
    Printer.
Line (Lyohaku - 1, (Y * CharY * KaigyoH) - Tyousei)-(Lyohaku + 80, (Y * CharY * KaigyoH) - Tyousei)
  Next Y
End Sub


Private Function fPadLeft(ByVal myData As String, ByVal CutLen As Long, ByVal CutStr As String) As String
'文字を右寄せし、指定した文字列の文字数になるまで左側に指定した文字(0 や " " 等)を埋め込みます。
  Dim tmp As String
  tmp = Right$(String$(CutLen, CutStr) & myData, CutLen)
  fPadLeft = tmp
End Function


Private Function fStrCut(ByRef CutTxt As String, ByVal CutLen As Long) As String
'半角・全角の混在する文字列を半角換算文字長で取り出し
  Dim myLen As Long, SysCodeTxt As String
  SysCodeTxt = StrConv(CutTxt, vbFromUnicode)       '文字列を変換
  myLen = LenB(SysCodeTxt)                '半角換算のバイト数を取得
  If myLen <= CutLen Then                 '指定の長さより短い場合
    fStrCut = CutTxt & Space$(CutLen - myLen)      '足りない分はスペースで
  Else  '文字列の方が長い場合、指定のバイトでカットする
    fStrCut = StrConv(LeftB$(SysCodeTxt, CutLen), vbUnicode)
    If InStr(fStrCut, vbNullChar) > 0 Then
      '漢字1バイト目で分断された場合の処理
      fStrCut = Left$(fStrCut, InStr(fStrCut, vbNullChar) - 1) & " "
    End If
  End If
End Function

このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
MSFlexGrid で表データを罫線で囲って印刷する MSHFlexGrid で表データを罫線で囲って印刷する 表データを罫線で囲って印刷する MSFlexGrid の印刷
表データを印刷する  文字列を指定の長さにカットする自作関数 文字列の左側にスペースを埋める自作関数 数字の左側に0を埋める自作関数
フレキシブルグリッド (MSFlexGrid) コントロール 階層フレキシブルグリッド (MSHFlexGrid) コントロール 

このページのトップへ移動します。