過去ログ

                                Page     796
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼印刷前にプリンタを選択  maeda 03/2/23(日) 17:45
   ┗Re:印刷前にプリンタを選択  つん 03/2/25(火) 16:15
      ┗Re:印刷前にプリンタを選択  maeda 03/2/25(火) 17:01

 ───────────────────────────────────────
 ■題名 : 印刷前にプリンタを選択
 ■名前 : maeda <fwhn0621@mb.infoweb.ne.jp>
 ■日付 : 03/2/23(日) 17:45
 -------------------------------------------------------------------------
   エクセルファイルに汎用性(どのPCでも)を持たせる為に、印刷処理前にリストボックス等で使用中の全てのプリンタを表示し、印刷するプリンタを2個指定し変数に取り込み、その後マクロでプリンタ1を印刷、プリンタ2で再度印刷。といった処理をしたいのですが、プリンタの選択処理が分かりません、ご教授ください。
 ───────────────────────────────────────  ■題名 : Re:印刷前にプリンタを選択  ■名前 : つん <honey@sweetparty.ne.jp>  ■日付 : 03/2/25(火) 16:15  -------------------------------------------------------------------------
   maeda さん、こんにちは

>エクセルファイルに汎用性(どのPCでも)を持たせる為に、印刷処理前にリストボックス等で使用中の全てのプリンタを表示し、印刷するプリンタを2個指定し変数に取り込み、その後マクロでプリンタ1を印刷、プリンタ2で再度印刷。といった処理をしたいのですが、プリンタの選択処理が分かりません、ご教授ください。

以前、私が作ったツールに似た(というかほとんど一緒?)機能がありますので、それをご紹介してみます。
私も、友達に教えていただいた方法なんですけど・・・・
とりあえず、フォームにリストボックスとコマンドボタンを一つずつ配置して、リストボックスにインストールされているプリンターをリストし、コマンドボタンで、選択しているプリンターをポート名付きで表示させました。ActivePrinterプロパティに設定する値ね♪

コメント等・・・そのままにしときます。
友達の所から来たそのまんまやけど〜(^^;

'**標準モジュール*******************************************:
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
'【関数名】 GetProfileString
'【機能】  WIN.INIから指定されたエントリの文字列を取得する
'【引数】
'      lpAppName:   String−エントリを検索するセクション
'      lpKeyName:   String−検索するキー名またはエントリ
'      lpDefault:   String−指定されたエントリが見つからなかった時に返される規定値
'      lpReturnedString:
'              String−nSizeバイトを割り当てる文字列バッファ
'      nSize:     Long−lpReturnedStringに格納できる最大文字数
'【戻り値】 lpReturnedStringバッファにコピーされたバイト数(最後のNull文字は含まれない)
'━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

'■ GetProfileString API関数(WIN.INIから指定されたエントリの文字列を取得する)
Private Declare Function GetProfileString Lib "kernel32.dll" Alias "GetProfileStringA" _
  (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, _
   ByVal lpReturnedString As String, ByVal nSize As Long) As Long
  
'==================================================================================================
'プリンタ名一覧を取得する関数
'戻り値:登録されているプリンタの数
'arg_vntPrinter():プリンタ名一覧(配列)
'arg_vntPort():ポート名一覧(配列)
'arg_strErr:エラーメッセージ
Public Function pb_fncGetPrinter(ByRef arg_vntPrinter() As Variant, _
            ByRef arg_vntPort() As Variant, ByRef arg_strErr As String) As Long
  
  Const STR_APPNAME As String = "Devices"        '目的のキーが所属しているセクションの名前(lpAppName)
  Const STR_DEFAULT As String = "見つかりませんでした"  '規定の文字列(lpDefault)
  Const LNG_SIZE As Long = 1024             '情報を格納するバッファのサイズ(nSize)
  Const STR_KEYNAME As String = vbNullString      'セクション内の全てのキーを取得(NULLを指定)
  
  Dim lngRet As Long   'GetProfileString関数の戻り値
  Dim strReturnedString As String * 1024
  Dim strTmp As String
  Dim lngNull As Long
  Dim i As Long
  Dim lngStart As Long
  Dim strErr As String
  
  On Error GoTo ErrHandler
  
  '-Start---------------------------------------------------------
  'プリンタ一覧を取得
  
  '指定したセクション名を検索、セクションの全キーを取得、該当データのバイト数を返す
  'バッファ(strReturnedString)に格納された文字数が返る
  lngRet = GetProfileString(STR_APPNAME, STR_KEYNAME, STR_DEFAULT, strReturnedString, LNG_SIZE)
  
  '最後のNULLを除く
  strTmp = Left(strReturnedString, InStr(1, strReturnedString, Chr(0) & Chr(0)) - 1)
  
  '戻り値チェック
  If strTmp = STR_DEFAULT Then
    strErr = "プリンター名が取得できませんでした"
    GoTo ErrHandler
  End If
  
  lngNull = 0
  i = 0
  lngStart = 0
  
  Do
    i = i + 1
    lngNull = InStr(lngNull + 1, strTmp, Chr(0))
    If lngNull = 0 Then lngNull = Len(strTmp)
    ReDim Preserve arg_vntPrinter(1 To i)
    arg_vntPrinter(i) = Mid(strTmp, lngStart + 1, lngNull - lngStart)
    If Right(arg_vntPrinter(i), 1) = Chr(0) Then  '末尾のNULLを削除
      arg_vntPrinter(i) = Left(arg_vntPrinter(i), Len(arg_vntPrinter(i)) - 1)
    End If
    lngStart = lngNull
  Loop Until lngNull = Len(strTmp)
  '-End-----------------------------------------------------------
  
  pb_fncGetPrinter = i
  ReDim arg_vntPort(1 To i)
  
  '-Start---------------------------------------------------------
  'ポート一覧を取得
  For i = 1 To pb_fncGetPrinter
      
    lngRet = GetProfileString(STR_APPNAME, arg_vntPrinter(i), STR_DEFAULT, strReturnedString, LNG_SIZE)
    
    '最後のNULLを除く
    strTmp = Left(strReturnedString, InStr(1, strReturnedString, Chr(0)) - 1)
    strTmp = Mid(strTmp, InStr(1, strTmp, ",") + 1)
    
    '戻り値チェック
    If strTmp = STR_DEFAULT Then
      strErr = "ポート名が取得できませんでした"
      GoTo ErrHandler
    Else
      arg_vntPort(i) = strTmp
    End If
  
  Next i
  '-End-----------------------------------------------------------
  
  Exit Function

ErrHandler:
  arg_strErr = strErr & vbCrLf & _
        "フォームを閉じて終了させてください。" & _
        vbCrLf & vbCrLf & Err.Number & " : " & Err.Description
  pb_fncGetPrinter = 0

End Function

'**フォーム*******************************************:
Private pr_strPrinterArray() As String 'プリンター&ポートのフルネーム

'==================================================================================================
Private Sub CommandButton1_Click()

  With ListBox1
    If .ListIndex = -1 Then
      MsgBox "なにも選択されていません"
    Else
      MsgBox "選択されているプリンターは" & pr_strPrinterArray(.ListIndex + 1) & " です"
    End If
  
  End With

End Sub

'==================================================================================================
Private Sub UserForm_Initialize()

  Dim strErrMsg As String
  Dim vntPrinter() As Variant   'プリンター名(配列)
  Dim vntPort() As Variant    'ポート名(配列)
  Dim lngPrinterCount As Long   'pb_fncGetPrinerの戻り値(登録されているプリンター数)
  Dim strActivePrinter As String
  Dim i As Long
 
  On Error GoTo ErrHandler

  '-Start---------------------------------------------------------
  'プリンター名、ポート名の設定
  lngPrinterCount = pb_fncGetPrinter(vntPrinter(), vntPort(), strErrMsg)
  If lngPrinterCount = 0 Then Resume ErrHandler
  
  ReDim pr_strPrinterArray(1 To lngPrinterCount)
  
  strActivePrinter = Application.ActivePrinter
  
  If strActivePrinter Like "* on *" = True Then
    strActivePrinter = Trim(Left(strActivePrinter, InStr(strActivePrinter, " on ") - 1))
    For i = 1 To lngPrinterCount
      pr_strPrinterArray(i) = vntPrinter(i) & " on " & vntPort(i)
    Next
  ElseIf strActivePrinter Like "* の *" = True Then
    strActivePrinter = Trim(Mid(strActivePrinter, InStr(strActivePrinter, " の ") + 3))
    For i = 1 To lngPrinterCount
      pr_strPrinterArray(i) = vntPort(i) & " の " & vntPrinter(i)
    Next
  End If
  
  With ListBox1
    For i = 1 To lngPrinterCount
      .AddItem vntPrinter(i)
    Next i
  End With
  '-End----------------------------------------------------------

  Exit Sub

ErrHandler:
  If Len(strErrMsg) = 0 Then
    strErrMsg = "フォームの表示段階でエラーが発生しました" & vbCrLf & _
          "フォームを閉じて終了させてください。" & vbCrLf & vbCrLf & _
          Err.Number & " : " & Err.Description
  End If
  MsgBox strErrMsg, vbCritical

End Sub


API関数は私もちょっち苦手で、詳しい説明を求められたらちと困るかも(^^;
そのときは、きっと誰かが助けてくれるやんねー♪(すんません・・頼りなくて)
 ───────────────────────────────────────  ■題名 : Re:印刷前にプリンタを選択  ■名前 : maeda <fwhn0621@mb.infoweb.ne.jp>  ■日付 : 03/2/25(火) 17:01  -------------------------------------------------------------------------
   ▼つん さん:
>maeda さん、こんにちは

早速の回答ありがとうございます。
私がやりたかったとおりのようです、早速明日試して見ます(今日は時間が足りそうにありません)

よかった よかった!!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 796