How can I get a list of the available printer names?
Article contributed by Astrid Zeelenberg
It requires some Windows API trickery, because VBA (unlike VB) does not have a Printers collection. Paste the following into a separate module. The function ListPrinters returns a variant containing an array of printer names.
 
 Option Explicit
 
 
 
 Const PRINTER_ENUM_CONNECTIONS = &H4
 
 Const PRINTER_ENUM_LOCAL = &H2
 
 Private Declare Function  EnumPrinters  Lib "winspool.drv"
  Alias "EnumPrintersA" _
         (ByVal  flags  As Long,
  ByVal  name  As String,
  ByVal  Level  As Long, _
         pPrinterEnum  As Long,  ByVal
  cdBuf  As Long, pcbNeeded  As
 Long, _
         pcReturned  As Long)  As Long
 
 Private Declare Function  PtrToStr  Lib
  "kernel32"  Alias  "lstrcpyA" _
         (ByVal  RetVal  As
 String,  ByVal  Ptr  As
 Long)  As Long
 
 Private Declare Function  StrLen  Lib
  "kernel32"  Alias  "lstrlenA" _
        (ByVal  Ptr  As Long)
  As Long
 
 
 Public Function  ListPrinters()  As Variant
 
 
 Dim  bSuccess  As Boolean
 
 Dim  iBufferRequired  As Long
 
 Dim  iBufferSize  As Long
 
 Dim  iBuffer()  As Long
 
 Dim  iEntries  As Long
 
 Dim  iIndex  As Long
 
 Dim  strPrinterName  As String
 
 Dim  iDummy  As Long
 
 Dim  iDriverBuffer()  As Long
 
 Dim  strPrinters()  As String
 
 iBufferSize = 3072
 
 
 ReDim  iBuffer((iBufferSize \ 4) - 1)  As Long
 
 'EnumPrinters will return a value False if the buffer is
 not big enough
 bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
         PRINTER_ENUM_LOCAL, vbNullString, _
         1, iBuffer(0), iBufferSize, iBufferRequired, iEntries)
 
 
 If Not  bSuccess  Then
     If  iBufferRequired > iBufferSize
  Then
         iBufferSize = iBufferRequired
         Debug.Print  "iBuffer too small.
 Trying again with "; _
         iBufferSize & "
 bytes."
         ReDim  iBuffer(iBufferSize \ 4)
  As
 Long
     End If
     'Try again with new buffer
     bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
             PRINTER_ENUM_LOCAL, vbNullString, _
             1, iBuffer(0), iBufferSize, iBufferRequired, iEntries)
 
 End If
 
 
 If Not  bSuccess  Then
     'Enumprinters returned False
     MsgBox "Error enumerating printers."
     Exit Function
 
 Else
     'Enumprinters returned True, use found
 printers to fill the array
     ReDim  strPrinters(iEntries - 1)
     For  iIndex = 0  To
  iEntries - 1
         'Get the
 printername
   
      strPrinterName =
 Space$(StrLen(iBuffer(iIndex * 4 + 2)))
         iDummy = PtrToStr(strPrinterName,
 iBuffer(iIndex * 4 + 2))
         strPrinters(iIndex) = strPrinterName
     Next  iIndex
 
 End If
 
 ListPrinters = strPrinters
 
 
 End Function  
   
 
'You could call the function as follows:
Sub  Test()
 
 
 Dim  StrPrinters  As Variant, x  As Long
 
 StrPrinters = ListPrinters
 
 'Fist check whether the array is filled with
 anything, by calling another function, IsBounded.
 If  IsBounded(StrPrinters)  Then
 
     For  x = LBound(strPrinters)  To
  UBound(strPrinters)
         Debug.Print  StrPrinters(x)
     Next x
 
 Else
     Debug.Print  "No printers found"
 
 End If
 
 End Sub
 
Public Function IsBounded(vArray  As
 Variant)  As Boolean
 
     'If the variant passed to this function is an array, the function
 will return True;
     'otherwise it will return False 
     On Error Resume Next
     IsBounded = IsNumeric(UBound(vArray))
 
 
 
 End Function
