2014-09-25 203 views
0

我有下面的代码,这段代码是用VB6编写的,但我无法打开窗体或检查任何引用。Excel VBA和VB6打印机

Private Sub PopulatePrinterCombo(cmbDestination As ComboBox) 
    Dim objPrinter As Printer 'a printer in the Printers collection object 

    'Add the printers to the combo box 
    For Each objPrinter In printers 
    cmbPrinter.AddItem objPrinter.DeviceName 
    Next 

    'Set current selection to the default printer 
    cmbDestination.Text = Printer.DeviceName 
End Sub 

我目前复制代码到Excel的VBA宏,问题是Dim objPrinter As Printer代码,我不断收到一个错误信息说“用户定义类型没有定义”,我需要一个参考的VBA添加能够获得将变量声明为“打印机”的选项?

我的第二个问题是,我不完全理解行“For Each objPrinter In printers”中的“打印机”,什么是“打印机”?有人可以向我解释这一点。

谢谢

PART 2

我现在想打印文件,我有我的代码如下:

'Initialize values 
    intDraftsPrinted = 0 
    If objDraftPaths.Count > 1 Then 

    Else 
    intSelectedDraftCount = CountSelectedDrafts 
    End If 

    'prompt user to make sure 
    intMsgBoxResponse = MsgBox("You selected " & intSelectedDraftCount & " part numbers. After removing duplicates" & vbNewLine & "there were " & objDraftPaths.Count & " unique draft files found." & vbNewLine & "Do you want to print these files?", vbYesNo, "TD Printer") 

    If intMsgBoxResponse <> vbYes Then 
    intSelectedDraftCount = 0 'So the following for loop will not entered 
    Else 
    intSelectedDraftCount = objDraftPaths.Count 
    End If 

    For i = 1 To intSelectedDraftCount 

    booSuccess = False 

    'open the draft file 
    Set objDraftDocument = OpenSolidEdgeDraft(objDraftPaths.Item(i)) 
    If objDraftDocument Is Nothing Then 
     'could not open file 
     MsgBox "Could not open the following draft file:" & vbNewLine & _ 
      objDraftPaths.Item(i), vbExclamation, "Solid Edge Error" 
    Else 
     'Print the draft file 
     For Each objSheet In objDraftDocument.Sheets 
     strSheetSize = DetermineSheetSize(objSheet) 
     If strSheetSize <> "" Then 
      'Determine orientation 
      If InStr(1, strSheetSize, "90") <> 0 Then 
      'Print as landscape 
      intOrientation = vbPRORLandscape 

      Else 
      'Print as portrait 
      intOrientation = vbPRORPortrait 
      End If 
      'Specify Sheet Size 
      Select Case Left(strSheetSize, 1) 
      Case "A" 
       intPaperSize = VBRUN.PrinterObjectConstants.vbPRPSLetter 
      Case "B" 
       intPaperSize = VBRUN.PrinterObjectConstants.vbPRPS11x17 
      Case "C" 
       intPaperSize = VBRUN.PrinterObjectConstants.vbPRPSCSheet 
      Case "D" 
       intPaperSize = VBRUN.PrinterObjectConstants.vbPRPSDSheet 
      Case "E" 
       intPaperSize = VBRUN.PrinterObjectConstants.vbPRPSESheet 
      Case Else 
       intPaperSize = VBRUN.PrinterObjectConstants.vbPRPSLetter 
      End Select 

      'Enable error handling 
      On Error Resume Next 

      'Activate the current sheet 
      objSheet.Activate 
      If Err Then 
      'Could not activate sheet 
      MsgBox "An error occurred while attempting to print: " & vbNewLine & objDraftPaths.Item(i) & vbNewLine & "The error was:" & vbNewLine & "Error Number: " & Err.Number & vbNewLine & "Error Description: " & Err.Description, vbExclamation, "Solid Edge Error" 
      Err.Clear 
      Else 
      'Print to the printer specified by the combo box 
      objDraftDocument.PrintOut cmbPrinter.Text, 1, intOrientation, intPaperSize, , , , igPrintSelected 
      If Err Then 
       'Could not print document 
       MsgBox "An error occurred while attempting to print: " & vbNewLine & objDraftPaths.Item(i) & vbNewLine & "The error was:" & vbNewLine & "Error Number: " & Err.Number & vbNewLine & "Error Description: " & Err.Description, vbExclamation, "Solid Edge Error" 
       Err.Clear 
      Else 
       booSuccess = True 
      End If 
      End If 

      'Disable error handling 
      On Error GoTo 0 

     End If 
     Next 

     'Close the file 
     objDraftDocument.Close False 

     intDraftsPrinted = intDraftsPrinted + 1 

    End If 

    Next i 

    'Dereference objects 
    Set objSheet = Nothing 
    Set objDraftDocument = Nothing 
    'Set objDraftPaths = Nothing 

    PrintSelectedDrafts = intDraftsPrinted 

现在的问题是当我打线它说:intOrientation = vbPRORLandscape 在excel VBA中,它不识别“vbPRORLandscape”以及下一行“vbPRORPortrait”。有没有办法解决这个问题?

此外,我有一种感觉,VBRUN.PrinterObjectConstants.vbPRPSLetter和其余的这些线路可能无法正常工作。它在VB6中工作。

谢谢

+2

Google for:'application.printers excel'来看看其他人如何处理这个问题。 Excel中不存在Application.printers。没有相应的东西。大多数人都使用WinAPI来获取打印机列表。 – 2014-09-25 19:32:24

回答

3

看样子Printers Collection是可以在MS访问VBA环境,但我不相信这是内在的的Excel VBA环境。

我使用WshNetwork对象Windows脚本主机列出可用的打印机。我使用下面的子例程来填充连接到系统的打印机列表的ComboBox。为了使此代码正常工作,您需要将“Windows脚本宿主对象模型”引用添加到您的VBA项目中。 (菜单:工具>参考[从列表中选择])

我添加了(j)循环来按字母顺序排列列表。

Sub populatePrintersList() 
    Dim nwo As New WshNetwork 
    Dim i As Integer 
    Dim j As Integer 
    Dim bAdd As Boolean 

    bAdd = True 
    cmbPrinter.Clear 
    For i = 0 To (nwo.EnumPrinterConnections.Count/2) - 1 
     For j = 0 To cmbPrinter.ListCount - 1 
      If nwo.EnumPrinterConnections(i * 2 + 1) < cmbPrinter.List(j) Then 
       cmbPrinter.AddItem nwo.EnumPrinterConnections(i * 2 + 1), j 
       bAdd = False 
       Exit For 
      End If 
     Next j 
     If bAdd Then cmbPrinter.AddItem nwo.EnumPrinterConnections(i * 2 + 1): bAdd = True 
    Next i 

    cmbPrinter.ListIndex = 0 
End Sub 

第2部分:

MSDN包含用于Worksheet.PrintOut方法基准物质:Worksheet.PrintOut

在用于方法和Worksheet.PageSetup对象的属性深度的文档也可以在发现MSDN:Worksheet.PageSetup

我s使用这些资源来寻找过多的答案。

+0

该代码工作完美,但现在我的下一步有一个错误。你可以看看问题中上面的“第2部分”。谢谢 – HumanlyRespectable 2014-09-26 12:28:16