No.1
- 回答日時:
私ならプリントアウトするプリンターを決めVBの中にactiveprinterを取得するように組むけどなぁ
この回答への補足
ありがとうございます。初心者なのでよく分かりませんが、「activeprinterを取得…」はExcel VBAでもできるのですか?またどのように組めばよいのでしょう?
補足日時:2007/05/23 22:33No.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?p … より
'アクティブプリンターの取得
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.ht … より ピクセル->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
この回答へのお礼
お礼日時:2007/05/25 00:54
kurinkurinkurin さん ありがとうございました。 まだTEST段階ですが何とかなりそうです。詳しい説明本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ドコモメールをプリンターで印...
-
PCLとPSプリンタドライバーどっ...
-
エクセルVBA カレントモジュー...
-
ネットカフェでは、持ちこんだP...
-
ワードに貼り付けた図の印刷バ...
-
【EXCEL2013】条件付書式で文字...
-
Word プレビューと実際の印刷が...
-
自宅から会社のプリンターで印...
-
インターネットエクスプローラ...
-
印刷時一枚目が白紙で排出
-
Windows11でプリントできません
-
印刷できません
-
グラフの目盛り線が一部印刷さ...
-
wordで印刷できない(Windows10)...
-
Macで印刷できません!
-
削除済みのプリンターの印刷ジ...
-
筆王からの印刷…速度が遅いので...
-
印刷プレビューが出ないため、...
-
カバーオープン 印刷できない
-
1ページしか印刷しないのですが
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ドコモメールをプリンターで印...
-
プリンターについて 風景や星空...
-
PCLとPSプリンタドライバーどっ...
-
削除済みのプリンターの印刷ジ...
-
自宅から会社のプリンターで印...
-
タブレットでパワポの作品をコ...
-
ワードに貼り付けた図の印刷バ...
-
【EXCEL2013】条件付書式で文字...
-
Word プレビューと実際の印刷が...
-
ネットカフェでは、持ちこんだP...
-
1ページしか印刷しないのですが
-
Windows11でプリントできません
-
緊急です アイビスペイントで絵...
-
スマホのスクショを、PCのGmail...
-
ページ数多いPDFを印刷しようと...
-
エクセルで表の枠しか印刷出来...
-
プリンターの印刷待ちの解除方...
-
印刷時一枚目が白紙で排出
-
DVDのレーベル面に印刷をしたい...
-
印刷ができない
おすすめ情報