VBって印刷関係が弱いのよね。困っちゃう。 by 某駅にいたプログラマーと思われる女性
この女性が言っていたことは、おそらく帳票関係の印刷のことだと思うけど、文字列印刷に関しても併せて弱い。 さて文字列を印刷するには…。結構、難しいテーマである。以下の関数では、文字列を1頁当りの指定行数、1行当りの文字列を指定して印刷できる。コードを読むと分かるんだけど、1文字ずつ文字解析して文字列を整えている。当然、処理時間はそれなりにかかる。まあかねしてちょ〜。
'---------------------------------------------------------------- ' 関数名 : PrintText ' 機能 : 文字列を印刷する ' 引数 : (in) srcForm … フォーム ' (in) srcText … 対象の文字列 ' (in) MAX_SIZE … 1行あたりの文字数 ' (in) MAX_LINE … 1ページあたりの行数 ' 戻り値 : なし ' 備考 : 処理はやや遅いが、完璧(多分) S-JIS用 '---------------------------------------------------------------- Public Sub PrintText(ByVal srcForm As Form, ByVal srcText As String, ByVal MAX_SIZE As Integer, ByVal MAX_LINE As Integer) Dim TotalString As String '印刷文字列格納バッファ Dim OneChar As String '1文字用格納変数 Dim CharByte As Long '1文字当りのバイト数 Dim CharNum As Long 'カウント用バイト数 Dim TextLength As Long 'テキストの文字列 Dim PageNum As Integer 'ページナンバー Dim Lines As Long '行数 Dim i As Long '作業用変数 Dim OldCaption As String 'フォームのデフォルトのキャプション 'マウスポインターを砂時計にする Screen.MousePointer = vbHourglass 'デフォルトキャプション取得 OldCaption = srcForm.Caption TextLength = Len(srcText) Lines = 1 '行数 PageNum = 1 'ページナンバー 'キャプション設定 srcForm.Caption = "印刷 - " & PageNum & " ページ目" For i = 1 To TextLength + 1 OneChar = mID(srcText, i, 1) '一文字ずつ取り出す '2バイト文字なら2、1バイト文字なら1を返す CharByte = LenB(StrConv(OneChar, vbFromUnicode)) CharNum = CharNum + CharByte 'バイト数をカウント '1文字ずつ追加していく TotalString = TotalString & OneChar '改行文字である If InStr(1, OneChar, vbCr) = 1 Then TotalString = TotalString & vbLf i = i + 1 ' vbLf分カウンタを進める CharNum = 0 'カウント用バイト数を初期化 Lines = Lines + 1 '行数をカウント ElseIf MAX_SIZE <= CharNum Then TotalString = TotalString & vbCrLf CharNum = 0 'カウント用バイト数を初期化 Lines = Lines + 1 '行数をカウント End If '最下段になった If Lines = MAX_LINE Then Printer.Font = "MS ゴシック" Printer.Print TotalString Printer.NewPage PageNum = PageNum + 1 'キャプション設定 srcForm.Caption = "印刷 - " & PageNum & " ページ目" Lines = 1 '行数を初期化 TotalString = "" '印刷文字列格納バッファを初期化 End If Next i Printer.Font = "MS ゴシック" Printer.Print TotalString Printer.EndDoc PageNum = PageNum + 1 'キャプション設定 srcForm.Caption = "印刷 - " & PageNum & " ページ目" 'マウスポインターを元に戻す Screen.MousePointer = vbDefault 'キャプションを元に戻す srcForm.Caption = OldCaption End Sub ざっと、こんなもんかな。あとは、フォームがForm1、文字列が strBuff 変数に格納されているとすると、 A4サイズであれば、 Call PrintText(Form1, strBuff, 62 * 2, 90) B5サイズであれば、 Call PrintText(Form1, strBuff, 55 * 2, 75) と、すればよい。ちなみに、上のサイズ設定は、うちのプリンターを基準としているので、細かい調整は各自で行ってね。 |