2014-09-25 3 views
0

У меня есть следующий код, этот код был написан на VB6, но я не могу открыть форму или проверить ссылки.Excel VBA & VB6 Printer

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 код, я постоянно получаю сообщение об ошибке, говорящее «USER DEFINED TYPE НЕ ОПРЕДЕЛЕНЫ», мне нужно ссылку, чтобы добавить на VBA в быть в состоянии получить возможность объявить переменную как «Принтер» или что-то еще?

Мой второй вопрос заключается в том, что я не полностью понял «Принтеры» в строке For Each objPrinter In printers, что такое «Принтеры»? может кто-нибудь, пожалуйста, объясните это мне.

Спасибо

ЧАСТЬ 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 для: 'application.printers excel', чтобы увидеть, как другие люди имеют дело с этим. Application.printers не существует в Excel. Нет эквивалента. Большинство людей используют WinAPI для получения списка принтеров. –

ответ

3

Он появляется Printers Коллекция доступна в среде MS Access VBA, но я не считаю, что это свойственно в Excel среды VBA.

Я использую объект WshNetwork из хоста Windows Script список доступных принтеров. Ниже я использую подпрограмму для заполнения ComboBox списком принтеров, подключенных к системе. Чтобы этот код работал, вам нужно будет добавить ссылку «Объектная модель хоста Windows Script» на ваш проект 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

I s Используйте эти ресурсы, чтобы найти множество ответов.

+0

Этот код работал отлично, но теперь мой следующий шаг имеет ошибку.Не могли бы вы взглянуть на «ЧАСТЬ 2» выше в вопросе. благодаря – HumanlyRespectable