● 文字列を印刷する ●

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)

と、すればよい。ちなみに、上のサイズ設定は、うちのプリンターを基準としているので、細かい調整は各自で行ってね。

戻る