2014-09-25 198 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