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) コントロール |