• ベストアンサー

excel VBAで、プリンターの印刷余白及び用紙サイズを取得するには

Excelでラベル印刷を行っています。 社内には多種類のプリンターがあり、それぞれで印刷可能位置が違うため、中には最後の行が半分しか印刷できないようなプリンターもあります。 そのようなプリンターに関しては、印刷行数を1行減らすよう設定したいと思っています。 そこでプリンターが持っている印刷可能位置(上下・左右余白等)を取り込みたいのですがその方法が分かりません。 どなたかご教示お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

Declare Function CreateDC Lib "gdi32.dll" Alias "CreateDCA" _ (ByVal lpszDrive As String, ByVal lpszDevice As String, _ ByVal lpszOutput As Long, lpInitData As DEVMODE) As Long Declare Function GetDeviceCaps Lib "gdi32" ( _ ByVal hdc As Long, _ ByVal nIndex As Long _ ) As Long Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long Private Const HORZRES = 8 '実際のスクリーンの幅(実印刷領域) Private Const VERTRES = 10 '実際のスクリーンの高さ Private Const PHYSICALWIDTH = 110 '物理的幅(実用紙サイズ) Private Const PHYSICALHEIGHT = 111 '物理的高さ Private Const PHYSICALOFFSETX = 112 '印刷可能な左方向のマージン Private Const PHYSICALOFFSETY = 113 '印刷可能な上方向のマージン Public Const CCHDEVICENAME = 32 Public Const CCHFORMNAME = 32 Public Type DEVMODE dmDeviceName As String * CCHDEVICENAME dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName As String * CCHFORMNAME dmUnusedPadding As Integer dmBitsPerPel As Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type Const LOGPIXELSX = 88 Const LOGPIXELSY = 90 Sub test() 'http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200505/05050096.txt より 'アクティブプリンターの取得 Dim ret As Long Dim lngPrinter As Long Dim ActivePrinterName As String Dim devm As DEVMODE Dim intPos As Integer devm.dmSize = LenB(devm) intPos = InStr(1, Application.ActivePrinter, " on ") If intPos > 0 Then ActivePrinterName = Mid$(Application.ActivePrinter, 1, intPos - 1) End If If intPos = 0 Then intPos = InStr(1, Application.ActivePrinter, " の ") If intPos > 0 Then ActivePrinterName = Mid$(Application.ActivePrinter, intPos + 3) Else MsgBox ("ありえない") Exit Sub End If End If lngPrinter = CreateDC("WINSPOOL", ActivePrinterName, 0, devm) 'http://www.bcap.co.jp/hanafusa/VBHLP/pMargi.n.htmより 'プリンターの印刷余白を取得 Dim LeftMargin As Long, TopMargin As Long Dim RightMargin As Long, BottomMargin As Long Dim PhysHeight As Long, PhysWidth As Long 'マージンをピクセル単位で取得しそれをmmに変換 LeftMargin = ScaleX(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALOFFSETX)) TopMargin = ScaleY(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALOFFSETY)) PhysWidth = ScaleX(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALWIDTH)) PhysHeight = ScaleY(lngPrinter, GetDeviceCaps(lngPrinter, PHYSICALHEIGHT)) '用紙サイズから印刷可能領域を差引きマージンを求める RightMargin = PhysWidth - (ScaleX(lngPrinter, GetDeviceCaps(lngPrinter, HORZRES))) BottomMargin = PhysHeight - (ScaleY(lngPrinter, GetDeviceCaps(lngPrinter, VERTRES))) Debug.Print "プリンター用紙印刷余白(左) : " & LeftMargin & " mm" Debug.Print "プリンター用紙印刷余白(上) : " & TopMargin & " mm" Debug.Print "プリンター用紙印刷余白(右) : " & RightMargin & " mm" Debug.Print "プリンター用紙印刷余白(下) : " & BottomMargin & " mm" Debug.Print "プリンター用紙サイズ(幅)  : " & PhysWidth & " mm" Debug.Print "プリンター用紙サイズ(高さ) : " & PhysHeight & " mm" ret = DeleteDC(lnghPrinter) End Sub 'http://www.kit.hi-ho.ne.jp/h-suenaga/progtips.html#bcb1 より ピクセル->mmの計算式 '1インチ = 25.4mm Function ScaleX(ByVal lngPrinter As Long, ByVal Value As Long) ScaleX = Int(0.5 + 25.4 * Value / GetDeviceCaps(lngPrinter, LOGPIXELSX)) End Function Function ScaleY(ByVal lngPrinter As Long, ByVal Value As Long) ScaleY = Int(0.5 + 25.4 * Value / GetDeviceCaps(lngPrinter, LOGPIXELSY)) End Function

bird-land
質問者

お礼

kurinkurinkurin さん ありがとうございました。 まだTEST段階ですが何とかなりそうです。詳しい説明本当にありがとうございました。

その他の回答 (1)

回答No.1

私ならプリントアウトするプリンターを決めVBの中にactiveprinterを取得するように組むけどなぁ

bird-land
質問者

補足

ありがとうございます。初心者なのでよく分かりませんが、「activeprinterを取得…」はExcel VBAでもできるのですか?またどのように組めばよいのでしょう?

関連するQ&A

  • エクセルの余白について

     こんにちは!!  エクセルにて上下左右を5mmの余白を設けた表を作成しました。印刷のプレビューを見た際にはきちんと上下左右に5mmの余白がある状態で表示されますが、実際印刷すると上下と左のみ5mmの余白で、右は1cmの余白になってしまいます。他のプリンタにて印刷しても同じ現象が起きます。  この場合どの様な操作をすればきちんと上下左右を5mmの余白にすることが出来ますか?ご存知の方教えてください。  因みにエクセルは2000で、プリンタはエプソンPX-G900とキヤノンピクサス960iです。

  • エクセル2010の印刷のための余白について

    エクセル2010を使用していますが、印刷プレビューの時に余白の調整をするためには、どうすればよいでしょうか? 例えば、ページ設定→余白で上下左右及びヘッダーを調整できますが、数字を入力しなければなりません。もしくは、最後に使用した余白のユーザー設定で決まったサイズのひな形があってそこを選ばざるおえないか、先ほどのページ設定で設定するしかなくなっています。 そうではなくて、印刷プレビューの画面で、カーソルにより手動で調整したいです。以前使っていたエクセルでは印刷プレビュー時にセルのサイズまで調整できていました。 どなたかアドバイスをください。

  • EXCEL VBA----連続ラベル用紙に印刷したい

    EXCEL VBAで一覧表から製品ラベルを作成しているのですが 一覧表から条件に合ったオーダーの項目(オーダーNo.、品名等)を 別シートのデザインを決めたセルに貼りつけています。 それを連続用紙(ラベル用紙)に印刷するのですが プリンタの余白、上下余白、ヘッダー、フッダーを全て0にしても どうしてもページの区切り目で余白があいてしまい、2ページ目以降の行がずれてしまいます。 これはEXCELの性質上どうしようもないことだと聞いたことはあるのですが やはりこれは仕方のないことなのでしょうか? 他の方法として デザインシートには始めの1オーダー分のみを貼りつけて印刷 ↓ 2つめのオーダーを貼り付けて印刷 ↓ 3つめのオーダーを貼り付けて印刷 ・ ・ ・ このようにすると、ズレは解消するかとは思うのですが これをすると、1つのオーダーを印刷するとプリンタがページ送りをしてしまうのです。 (プリンタの自動改行はOFFにしています。) これをVBAで設定することは可能でしょうか? もしEXCELでは不可能であれば、WORDならこうすればできる等 ありましたらお教え下さい。 わかりにくいかもしれませんが、よろしくお願いします。

  • Excelの列幅・行高・余白のサイズについて

    ある帳票があって、複数の項目(列)と行があります。Excelでその帳票と同じ列幅の項目と行高のフォーマットを作り、印刷をするときはその帳票にしたいと思っています。その場合、帳票の列幅(単位cmまたはmm)はExcelの列幅と行高に置き換える場合、何か目安になるものはあるのでしょうか。またExcelのそれらの数字の単位は何なんでしょうか。 また、印刷するときの余白の数字の単位は何でしょうか。mmかなと思いますが、ピッタリではないように思います。上下・左右の余白を「0」に設定しても、少し余白があります。「0」に設定したときにある余白のサイズはどのくらいなのでしょうか。 よろしくお願いいたします。

  • エクセルの余白設定について

    mac でエクセルを使用しています。 うちのプリンターではどうしても上下左右のふちの5mmは印刷できません。 なのでぎりぎりのところまで印刷したいと思っています。 ヘッダーフッターと上下左右の余白すべて”0”にしてます。 印刷すると左右は5mmほどの余白ができます。→これは問題ありません。 ですが下部分に2cmくらいの余白ができてしまいます。 表を書いているので、この表自体が小さいのかと思い、 セルを挿入したり、セルの高さを高くすると 次ページまで突入してしまいます。 次ページまで突入しない程度のセル挿入ですと高さ3mmほどのセルしか入れません。 下部分も5mmぎりぎりまで印刷したいのですが、どうしたら良いでしょうか??

    • ベストアンサー
    • Mac
  • プリンターMP500での適正な余白サイズを教えてください

    Wordで作成した文章をMP500で印刷したところ、上下左右に大きく余白が出たので、上下左右の余白を0にしたら今度は文章が切れてしまいました。 フッダー、ヘッダーのサイズ設定もよくわかりません。 確か説明書に載ってるはずなのですが、手元にないので困っています。 よろしくおねがいします。

  • Excel 2007で余白が印刷されます

    Excel 2007でA4縦1Pに収まる住所録を作成しました。そして印刷プレビューのページ設定→余白の設定でぺージ中央の水平にチェックを入れたところ、印刷ページが2ページになります。1ページめは住所録、2ページ目は白紙です。 それで、余白の設定で左右の余白を少なくしてゆくと印刷ページが1ページになりますが、印刷位置はぺージ中央の水平にチェックを入れているにも関わらず、向かって左の位置(言い換えればぺージ中央の水平にチェックを外した状態)に移動します。 どうすれば、ちゃんと印刷できるようになりますか?

  • 『横』向き用紙の印刷の右側の余白をゼロにしたいのですが

    XP、Excel。プリンタはEPSON PM-730c。住所・氏名とか、印刷枠が刷り込んである、B4『横』用紙にプリントしたいのです。[印刷プレビュー]-[設定]で左右の余白を0にし、[余白]で左右の線を移動させようとするのですが、画面に向かって右側だけが、あと10ミリ程を残して外側へ動きません(=余白がゼロにならない)。上下・左側には動きます。用紙を『縦』にすれば上下・左右に外側ぎりぎり迄動きます。”用紙を『横』にしたとき、画面に向かって右側の余白をほぼ0にするには、どこの設定をどうすれば良いか”教えて下さい。

  • エクセルで特殊な用紙に印刷したいのですが(長文)

    エクセル2003のデータを特殊なラベル用紙に印刷する方法を教えて下さい。 用紙は両端に穴があり1ページ18の穴があいてます。一般的なプリンタではなくラインプリンタで印刷する予定です。 サイズはヨコが17.8cm、タテ22.8cm 真ん中にラベル(ヨコ9cm、タテ4cm)が5枚/1ページあります。 用紙の上余白が0.3cm、下余白は0.1cm、左と右の余白は4.4cm ラベルとラベルの間隔は0.6cmです。 印刷する内容は抽出された番号のみです。 ワードで差込印刷を試みたのですが、用紙サイズが特殊なため 断念しました。 エクセルでの特殊な印刷はマクロで設定が必要とのことらしいのですが、マクロにはまったく疎いため質問させていただきました。 ご回答どうぞよろしくお願い申し上げます。

  • 印刷の余白について

    いつもお世話になります。広報紙をワードを使って手作りで作るのですが、余白の設定に付いてお尋ねします。新聞作りの書いてある本を読んでいたら余白の設定を左右上下5ミリにするよう書かれていました。もちろん使っているプリンターによっては修正されますが、5ミリにする理由が分かりません。最大限印刷を可能にしたいと思ったら0ミリでもいいでしょうか?