Type DEVMODE
dmDeviceName As String * 32
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 * 32
dmUnusedPadding As Integer
dmBitsPerPixel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Public Enum printer_status
PRINTER_STATUS_READY = &H0
PRINTER_STATUS_PAUSED = &H1
PRINTER_STATUS_ERROR = &H2
PRINTER_STATUS_PENDING_DELETION = &H4
PRINTER_STATUS_PAPER_JAM = &H8
PRINTER_STATUS_PAPER_OUT = &H10
PRINTER_STATUS_MANUAL_FEED = &H20
PRINTER_STATUS_PAPER_PROBLEM = &H40
PRINTER_STATUS_OFFLINE = &H80
PRINTER_STATUS_IO_ACTIVE = &H100
PRINTER_STATUS_BUSY = &H200
PRINTER_STATUS_PRINTING = &H400
PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
PRINTER_STATUS_NOT_AVAILABLE = &H1000
PRINTER_STATUS_WAITING = &H2000
PRINTER_STATUS_PROCESSING = &H4000
PRINTER_STATUS_INITIALIZING = &H8000
PRINTER_STATUS_WARMING_UP = &H10000
PRINTER_STATUS_TONER_LOW = &H20000
PRINTER_STATUS_NO_TONER = &H40000
PRINTER_STATUS_PAGE_PUNT = &H80000
PRINTER_STATUS_USER_INTERVENTION = &H100000
PRINTER_STATUS_OUT_OF_MEMORY = &H200000
PRINTER_STATUS_DOOR_OPEN = &H400000
PRINTER_STATUS_SERVER_UNKNOWN = &H800000
PRINTER_STATUS_POWER_SAVE = &H1000000
End Enum
Private Type PRINTER_INFO_2
pServerName As String
pPrinterName As String
pShareName As String
pPortName As String
pDriverName As String
pComment As String
pLocation As String
pDevMode As Long
pSepFile As String
pPrintProcessor As String
pDatatype As String
pParameters As String
pSecurityDescriptor As Long
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
JobsCount As Long
AveragePPM As Long
End Type
Private Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As DEVMODE
DesiredAccess As Long
End Type
Private Declare Function GetProfileStringA Lib "kernel32" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Private Declare Function GetPrinterApi Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal level As Long, Buffer As Long, ByVal pbSize As Long, pbSizeNeeded As Long) As Long
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function IsBadStringPtrByLong Lib "kernel32" Alias "IsBadStringPtrA" (ByVal lpsz As Long, ByVal ucchMax As Long) As Long
Public Function IsDefaultPrinterReady(Stat_type As String) As Boolean
Dim lret As Long
Dim pDef As PRINTER_DEFAULTS
Dim mPRINTER_INFO_2 As PRINTER_INFO_2
Dim mhPrinter As Long
Dim SizeNeeded As Long
Dim Buffer() As Long
Dim Idx As Long
lret = OpenPrinter(DefaultPrinterName, mhPrinter, pDef)
ReDim Preserve Buffer(0 To 1) As Long
lret = GetPrinterApi(mhPrinter, Idx, Buffer(0), UBound(Buffer), SizeNeeded)
ReDim Preserve Buffer(0 To (SizeNeeded / 4) + 3) As Long
lret = GetPrinterApi(mhPrinter, Idx, Buffer(0), UBound(Buffer) * 4, SizeNeeded)
On Error GoTo NA
With mPRINTER_INFO_2
.pServerName = StringFromPointer(Buffer(0), 1024)
.pPrinterName = StringFromPointer(Buffer(1), 1024)
.pShareName = StringFromPointer(Buffer(2), 1024)
.pPortName = StringFromPointer(Buffer(3), 1024)
.pDriverName = StringFromPointer(Buffer(4), 1024)
.pComment = StringFromPointer(Buffer(5), 1024)
.pLocation = StringFromPointer(Buffer(6), 1024)
.pDevMode = Buffer(7)
.pSepFile = StringFromPointer(Buffer(8), 1024)
.pPrintProcessor = StringFromPointer(Buffer(9), 1024)
.pDatatype = StringFromPointer(Buffer(10), 1024)
.pParameters = StringFromPointer(Buffer(11), 1024)
.pSecurityDescriptor = Buffer(12)
.Attributes = Buffer(13)
.Priority = Buffer(14)
.DefaultPriority = Buffer(15)
.StartTime = Buffer(16)
.UntilTime = Buffer(17)
.Status = Buffer(18)
.JobsCount = Buffer(19)
.AveragePPM = Buffer(20)
End With
IsDefaultPrinterReady = (mPRINTER_INFO_2.Status = Stat_type)
ClosePrinter (mhPrinter)
Exit Function
NA:
IsDefaultPrinterReady = False
End Function
Private Function StringFromPointer(lpString As Long, lMaxLength As Long) As String
Dim sRet As String
Dim lret As Long
If lpString = 0 Then
StringFromPointer = ""
Exit Function
End If
If IsBadStringPtrByLong(lpString, lMaxLength) Then
'\\ An error has occured - do not attempt to use this pointer
StringFromPointer = ""
Exit Function
End If
'\\ Pre-initialise the return string...
sRet = Space$(lMaxLength)
CopyMemory ByVal sRet, ByVal lpString, ByVal Len(sRet)
If Err.LastDllError = 0 Then
If InStr(sRet, Chr$(0)) > 0 Then
sRet = Left$(sRet, InStr(sRet, Chr$(0)) - 1)
End If
End If
StringFromPointer = sRet
End Function
Private Function DefaultPrinterName() As String
Dim strLPT As String * 255
Dim tStr As String
Call GetProfileStringA("Windows", "Device", "", strLPT, 254)
tStr = Trim(strLPT)
DefaultPrinterName = Left$(tStr, InStr(1, tStr, ",", vbTextCompare) - 1)
End Function
Public Sub print_ME()
'On Error GoTo err_me
With Application
If .EnableEvents Then .EnableEvents = False
If .ScreenUpdating Then .ScreenUpdating = False
If .Calculation <> xlCalculationManual Then .Calculation = xlCalculationManual
End With
Dim mrgn As Double
Dim mesg As String
Dim printer_name As String
Dim strLPT As String * 255
Dim tStr As String
Dim shtDSH As Worksheet
If IsDefaultPrinterReady(PRINTER_STATUS_READY) Then
Set shtDSH = ThisWorkbook.Sheets("Dashboard")
With shtDSH
With .PageSetup
mrgn = Application.InchesToPoints(0.25)
.LeftMargin = mrgn
.RightMargin = mrgn
.TopMargin = mrgn
.BottomMargin = mrgn
.HeaderMargin = mrgn
.FooterMargin = mrgn
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = 600
.Orientation = xlLandscape
.Draft = False
.PaperSize = xlPaperLegal
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = "$B$2:$AM$57" 'shtDSH.Range("B2:AM57").address
End With
End With
shtDSH.PrintOut Copies:=1
Else
Call GetProfileStringA("Windows", "Device", "", strLPT, 254)
tStr = Trim(strLPT)
printer_name = Left(tStr, InStr(1, tStr, ",", vbTextCompare) - 1)
mesg = "Please, verify the connection to your default printer [" & printer_name & "]." & vbLf & vbLf & "Thank you."
If IsDefaultPrinterReady(PRINTER_STATUS_PAPER_JAM) Then mesg = mesg & vbLf & vbTab & "• Paper Jam"
If IsDefaultPrinterReady(PRINTER_STATUS_ERROR) Then mesg = mesg & vbLf & vbTab & "• Printer Error Status"
If IsDefaultPrinterReady(PRINTER_STATUS_NOT_AVAILABLE) Then mesg = mesg & vbLf & vbTab & "• Printer Status Not Available"
If IsDefaultPrinterReady(PRINTER_STATUS_PAPER_PROBLEM) Then mesg = mesg & vbLf & vbTab & "• Printer Paper Issue"
If IsDefaultPrinterReady(PRINTER_STATUS_DOOR_OPEN) Then mesg = mesg & vbLf & vbTab & "• Printer Door Open"
If IsDefaultPrinterReady(PRINTER_STATUS_OFFLINE) Then mesg = mesg & vbLf & vbTab & "• Printer Offline"
MsgBox mesg, vbInformation, "Printer Error : : " & printer_name
End If
exit_me:
On Error Resume Next
With Application
If Not .EnableEvents Then .EnableEvents = True
If Not .ScreenUpdating Then .ScreenUpdating = True
End With
Exit Sub
err_me:
'logThis causedError:="Tools Worksheet_Activate Function Error: " & Err.Number & vbLf & Err.Description
Err.clear
GoTo exit_me
End Sub
Bookmarks