Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12311 / 13645 ツリー ←次へ | 前へ→

【11013】プリンタについて ふきゅ 04/2/24(火) 10:41 質問
【11014】Re:プリンタについて 名無しの笛の踊り 04/2/24(火) 11:54 回答
【11015】Re:プリンタについて ふきゅ 04/2/24(火) 12:39 発言
【11039】Re:プリンタについて りん 04/2/24(火) 19:23 回答
【11051】Re:プリンタについて ふきゅ 04/2/25(水) 13:33 発言
【11060】Re:プリンタについて りん 04/2/25(水) 21:18 発言
【11188】Re:プリンタについて ふきゅ 04/3/2(火) 13:29 発言

【11013】プリンタについて
質問  ふきゅ  - 04/2/24(火) 10:41 -

引用なし
パスワード
   APIを使って使えるプリンタを取得して、リストボックスで設定したり
設定の中のプリンタを取ってきてメッセージBOXで使用するプリンタを
せっていする例はあるのですが・・・

私のやりたい事はAPIを使用せずに
アクティブプリンタをリストに表示して、なおかつマシンに設定してある
プリンタをリストボックスに表示してその中から使うプリンタを設定する事です。
OS/IEが変わっても対応できるように無理に文字列の編集は
したくないのですが可能でしょうか?またその際に、アクティブプリンタ名と
リストに出す使用できるプリンタは名前を同じフォーマットにしたいのですが・・
いっぱい欲張って無理難題を言っていると思いますが、よろしく
お願いします。

問題点
Set Win = CreateObject("Shell.Application")
For Each objItem In Win.NameSpace(4).items
  If Left(objItem.Name, 4) <> "プリンタ" Then
   Debug.Print objItem.Name・・・1
  End If
Next
Debug.Print Application.ActivePrinter・・・2
以上の取得だと1と2で名前が違ってしまうという事です。

【11014】Re:プリンタについて
回答  名無しの笛の踊り  - 04/2/24(火) 11:54 -

引用なし
パスワード
   ▼ふきゅ さん:
>私のやりたい事はAPIを使用せずに
>アクティブプリンタをリストに表示して、なおかつマシンに設定してある
>プリンタをリストボックスに表示してその中から使うプリンタを設定する事です。

組み込みダイアログを使ってみたり
Sub TEST()
  Application.Dialogs(xlDialogPrinterSetup).Show
  MsgBox Application.ActivePrinter
End Sub

【11015】Re:プリンタについて
発言  ふきゅ  - 04/2/24(火) 12:39 -

引用なし
パスワード
   お答えありがとうございます。
当初このやり方も考えたのですが、説明不足でした、すいません。

やりたい場所がエクセル上にリストボックスを貼り付けてそこ限定なんです。

こんなわがままだらけですが、何か他に方法があればうれしいのですが・・・
よろしくお願いします。

【11039】Re:プリンタについて
回答  りん E-MAIL  - 04/2/24(火) 19:23 -

引用なし
パスワード
   ふきゅ さん、こんばんわ。

>やりたい場所がエクセル上にリストボックスを貼り付けてそこ限定なんです。

かっこいいやり方ではないですが、
通常使うプリンタを変更 → 情報取得を繰り返します。


Sub tempo()
  Dim win As Object, Acp As String, objItem As Object, rr As Long
  Set win = CreateObject("Shell.Application")
  '
  Acp = Application.ActivePrinter
  '
  Workbooks.Add
  '
  For Each objItem In win.NameSpace(4).items
   If Left(objItem.Name, 4) <> "プリンタ" Then
     rr = rr + 1
     objItem.InvokeVerb "通常使うプリンタに設定(&F)"
     ActiveSheet.Cells(rr, 1).Value = objItem.Name
     DoEvents 'これを入れないと反映されないみたいでした
     ActiveSheet.Cells(rr, 2).Value = Application.ActivePrinter
     If Acp = Application.ActivePrinter Then _
      ActiveSheet.Cells(rr, 3).Value = "←"
   End If
  Next
  '戻す
  Application.ActivePrinter = Acp
  DoEvents 'これを入れないと反映されないみたいでした
End Sub

こんな感じです。
A列の値をリストボックスに入れて、B列の値でActivePrinterを設定するようにしたらいいと思います(そのときは別にセルに入れなくてもいいですよ)。

【11051】Re:プリンタについて
発言  ふきゅ  - 04/2/25(水) 13:33 -

引用なし
パスワード
   お手数おかけしました、ありがとうございます。

このやり方で試してみたら、ほぼやりたい事が出来ていました。
しかし、コントロールパネル内の通常使うプリンタが

Left(objItem.Name, 4) <> "プリンタ"

で最後に取り出してきたプリンタになってしまうのですが
元に戻す事はできないでしょうか?

Application.ActivePrinter = Acp
DoEvents 'これを入れないと反映されないみたいでした
上記の設定でエクセル自体のプリンタは元のプリンタに
なっていました。ありがとうございます。

【11060】Re:プリンタについて
発言  りん E-MAIL  - 04/2/25(水) 21:18 -

引用なし
パスワード
   ふきゅ さん、こんばんわ。

>このやり方で試してみたら、ほぼやりたい事が出来ていました。
>しかし、コントロールパネル内の通常使うプリンタが
>
>Left(objItem.Name, 4) <> "プリンタ"
>
>で最後に取り出してきたプリンタになってしまうのですが
>元に戻す事はできないでしょうか?
Sub tempo()
  Dim win As Object, Acp As String, objItem As Object, rr As Long, Idx As Integer
  Set win = CreateObject("Shell.Application")
  '
  Acp = Application.ActivePrinter
  '
  Workbooks.Add
  '
  For Each objItem In win.namespace(4).items
   If Left(objItem.Name, 4) <> "プリンタ" Then
     rr = rr + 1
     objItem.InvokeVerb "通常使うプリンタに設定(&F)"
     ActiveSheet.Cells(rr, 1).Value = objItem.Name
     DoEvents 'これを入れないと反映されないみたいでした
     ActiveSheet.Cells(rr, 2).Value = Application.ActivePrinter
     If Acp = Application.ActivePrinter Then
      Idx = rr '行番号取得
      ActiveSheet.Cells(rr, 3).Value = "←"
     End If
   End If
  Next
  '戻す
  Set objItem = win.namespace(4).items.Item(ActiveSheet.Cells(Idx, 1).Value)
  objItem.InvokeVerb "通常使うプリンタに設定(&F)"
  DoEvents 'これを入れないと反映されないみたいでした
  '開放
  Set objItem = Nothing
End Sub

>上記の設定でエクセル自体のプリンタは元のプリンタに
>なっていました。ありがとうございます。
 指定の方法がそもそも間違えてましたすみません。コンパネを変更してるのにエクセルだけ戻してました。

 このマクロだと、コンパネでの「通常使うプリンタ」と、エクセルで一時的に変更されたアクティブなプリンタが一致しないとき(手動で変更ずみとか)にはうまく動作しないようなのでコンパネでの「通常使うプリンタ」かどうかを判定するフラグが必要なようですが、今の私にはわかりません。ごめんね。

【11188】Re:プリンタについて
発言  ふきゅ  - 04/3/2(火) 13:29 -

引用なし
パスワード
   >今の私にはわかりません。ごめんね。
いえいえ、頑張っていただいたのに謝られると
申し訳ないです。

少々時間を空けてみましたが、他に回答が出てこなかったので
多分無理なのでしょうかねぇ(苦笑

ありがとうございました。

12311 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free