[VBA] Visual Basic vraagje over printers

Pagina: 1
Acties:
  • 325 views sinds 30-01-2008
  • Reageer

  • sebasgrif
  • Registratie: Februari 2004
  • Laatst online: 28-01 18:26
Ik ben bezig met het maken van een word-macro. Gebruikers moeten als ze willen printen 1 scherm te zien krijgen met hierin alle optie's die ze nodig hebben en absoluut niet meer. dit is gelukt op 1 punt na.
Hoe kan je de aanwezige printers opvragen? dit is variabel omdat de macro op meerde pc's in verschillende domeinen gaat draaien. De gebruiker moet kunnen kiezen tussen de aanwezige netwerk printers, dit moet net als in word in een combobox komen.
Wie kan mij helpen??

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Alstublieft, wat een beetje zoeken allemaal niet kan doen ;)
MSDN rules...

[ Voor 8% gewijzigd door OZ-Gump op 19-02-2004 16:15 ]

My personal website


  • sebasgrif
  • Registratie: Februari 2004
  • Laatst online: 28-01 18:26
hummm, en ik maar denken dat ik de hele msdn had uitgeplozen....
Bedank!! ik ga me er ff over buigen, ziet er behoorlijk pittig uit (ben niet zo'n expert in dit soort zaken), de rest van mn code is minder tekst dan wat hier gegeven staat :)

[ Voor 176% gewijzigd door sebasgrif op 20-02-2004 09:44 ]


  • sebasgrif
  • Registratie: Februari 2004
  • Laatst online: 28-01 18:26
Sorry, maar deze code is echt abracadrabra... ik heb geprobeert dit te begrijpen, maar ik ben veels te veel VBA n00b hiervoor. Kan iemand mij misschien hiermee helpen, ik heb tot nu toe de volgende code:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Private Sub PrintKnop_Click()
Dim TestVariable As String

    If AllesOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintAllDocument
    ElseIf HuidigePaginaOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintCurrentPage
    ElseIf SelectieOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintSelection
    ElseIf AfdrukbereikOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintRangeOfPages
    End If
    
    If PositieStaandButton = True Then
        ActiveDocument.PageSetup.Orientation = wdOrientPortrait
    ElseIf PositieLiggendButton = True Then
        ActiveDocument.PageSetup.Orientation = wdOrientLandscape
    End If
   
    ActiveDocument.PageSetup.FirstPageTray = P1LadeVariable
    ActiveDocument.PageSetup.OtherPagesTray = RestLadeVariable
    ActiveDocument.PageSetup.TwoPagesOnOne = TweePaginasPerVelCheckBox.Value
    ActiveDocument.PrintOut Range:=TestVariable, Collate:=SorterenCheckBox.Value, _
Copies:=AantalExemplarenTextBox.Value, Pages:=PaginaBereikTextBox.Value
    End
End Sub

Private Sub AnnulerenKnop_Click()
    MsgBox "The name of the active printer is " & ActivePrinter
    End
End Sub



Private Sub UserForm_Initialize()

    PaginaEenLadeSelectieComboBox.AddItem "Handmatige Invoer (Briefpapier)"
    PaginaEenLadeSelectieComboBox.AddItem "Bovenste Lade (Normaal papier)"
    PaginaEenLadeSelectieComboBox.AddItem "Onderste Lade (Vervolg)"

    OverigePAginaLadeSelectieComboBox.AddItem "Handmatige Invoer (Briefpapier)"
    OverigePAginaLadeSelectieComboBox.AddItem "Bovenste Lade (Normaal papier)"
    OverigePAginaLadeSelectieComboBox.AddItem "Onderste Lade (Vervolg)"
End Sub

Private Sub PaginaEenLadeSelectieComboBox_DropButtonClick()

Dim P1LadeVariable As String

    Select Case PaginaEenLadeSelectieComboBox.Value
    Case 0  'Handmatige Invoer (Briefpapier)
        P1LadeVariable = wdPrinterManualFeed
        
    Case 1 'Bovenste Lade (Normaal papier)
        P1LadeVariable = wdPrinterUpperBin
        
    Case 2 'Onderste Lade (Vervolg)
        P1LadeVariable = wdPrinterLowerBin
        
    End Select
End Sub
Private Sub OverigePAginaLadeSelectieComboBox_DropButtonClick()

Dim RestLadeVariable As String

    Select Case OverigePAginaLadeSelectieComboBox.Value
    Case 0  'Handmatige Invoer (Briefpapier)
        RestLadeVariable = wdPrinterManualFeed
        
    Case 1 'Bovenste Lade (Normaal papier)
        RestLadeVariable = wdPrinterUpperBin
        
    Case 2 'Onderste Lade (Vervolg)
        RestLadeVariable = wdPrinterLowerBin
        
    End Select
End Sub


En de bedoeling is dat hier nog een dropdown combobox bij komt waarmee gebruikers kunnen selecteren welke aanwezige netwerkprinters ze willen gebruiken

Alvast bedankt!!

[ Voor 6% gewijzigd door sebasgrif op 25-02-2004 11:58 ]


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 31-07 15:50
Eh.. , het is de bedoeling op tweakers dat je zelf programeert ...

De code die OZ-Gump poste zit mischien moeilijk in elkaar, maar is wel heel simpel toe te passen. Als je namelijk de sub EnumeratePrinters4 uitvoerd:

The output should be similar to the following: There are 1 local and connected printers.
Printer: \\NCPRINT\HP5SI@1155 Server: \\NCPRINT
Attributes: 10

Oftewel je hoeft alleen de print naar het scherm opdrachten te vervangen door een arraytje waar je al deze printer informatie stopt. Het netst is als je van die sub een function maken en die een array met printer info laten returnen.

Dat van het arraytje staat trouwens ook al op die microsoft page:
NOTE: When using these functions in your own applications, you may want to return an array of data that can be displayed in a list box or grid rather than print the values.

The buffer is in the following format:
|rec1|rec2|...|recn|...garbage...|strn|...|str2|str1|

INFO records containing string pointers and numeric values are added from the left, and the string text for each record is added from the right. The area between the end of the last record and the start of the last string text contains garbage.

[ Voor 32% gewijzigd door djexplo op 20-02-2004 10:01 . Reden: quote ]

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


  • sebasgrif
  • Registratie: Februari 2004
  • Laatst online: 28-01 18:26
Nou, na emmers bloed, zweet en tranen ben ik er uit gekomen, bedankt voor jullie hulp!!

uiteindelijk ben ik tot de volgende code gekomen:


UserForm2:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Private Sub PrintCombobox_Change()
    ActivePrinter = PrintTekstBox.Value
End Sub

Private Sub PrintKnop_Click()
Dim TestVariable As String

    If AllesOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintAllDocument
    ElseIf HuidigePaginaOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintCurrentPage
    ElseIf SelectieOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintSelection
    ElseIf AfdrukbereikOptionButton = True Then
        TestVariable = WdPrintOutRange.wdPrintRangeOfPages
    End If
    
    If PositieStaandButton = True Then
        ActiveDocument.PageSetup.Orientation = wdOrientPortrait
    ElseIf PositieLiggendButton = True Then
        ActiveDocument.PageSetup.Orientation = wdOrientLandscape
    End If
   
    ActiveDocument.PageSetup.FirstPageTray = P1LadeVariable
    ActiveDocument.PageSetup.OtherPagesTray = RestLadeVariable
    ActiveDocument.PageSetup.TwoPagesOnOne = TweePaginasPerVelCheckBox.Value
    ActiveDocument.PrintOut Range:=TestVariable, Collate:=SorterenCheckBox.Value, 
Copies:=AantalExemplarenTextBox.Value, Pages:=PaginaBereikTextBox.Value
    
        
    End
End Sub

Private Sub AnnulerenKnop_Click()
    End
End Sub



Private Sub UserForm_Initialize()
    
    Module1.EnumeratePrintersWin
    
    PaginaEenLadeSelectieComboBox.AddItem "Handmatige Invoer (Briefpapier)"
    PaginaEenLadeSelectieComboBox.AddItem "Bovenste Lade (Normaal papier)"
    PaginaEenLadeSelectieComboBox.AddItem "Onderste Lade (Vervolg)"

    OverigePAginaLadeSelectieComboBox.AddItem "Handmatige Invoer (Briefpapier)"
    OverigePAginaLadeSelectieComboBox.AddItem "Bovenste Lade (Normaal papier)"
    OverigePAginaLadeSelectieComboBox.AddItem "Onderste Lade (Vervolg)"
End Sub

Private Sub PaginaEenLadeSelectieComboBox_DropButtonClick()

Dim P1LadeVariable As String

    Select Case PaginaEenLadeSelectieComboBox.Value
    Case 0  'Handmatige Invoer (Briefpapier)
        P1LadeVariable = wdPrinterManualFeed 'wdPrinterUpperBin
        
    Case 1 'Bovenste Lade (Normaal papier)
        P1LadeVariable = wdPrinterDefaultBin 'wdPrinterDefaultBin
        
    Case 2 'Onderste Lade (Vervolg)
        P1LadeVariable = wdPrinterLowerBin 'wdPrinterLowerBin
        
    End Select
End Sub

Private Sub OverigePAginaLadeSelectieComboBox_DropButtonClick()

Dim RestLadeVariable As String

    Select Case OverigePAginaLadeSelectieComboBox.Value
    Case 0  'Handmatige Invoer (Briefpapier)
        RestLadeVariable = wdPrinterManualFeed 'wdPrinterUpperBin
        
    Case 1 'Bovenste Lade (Normaal papier)
        RestLadeVariable = wdPrinterDefaultBin 'wdPrinterDefaultBin
        
    Case 2 'Onderste Lade (Vervolg)
        RestLadeVariable = wdPrinterLowerBin 'wdPrinterLowerBin
        
    End Select
End Sub

Module1:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Option Explicit

Const PRINTER_ENUM_CONNECTIONS = &H4
Const PRINTER_ENUM_LOCAL = &H2

Type PRINTER_INFO_1
   flags As Long
   pDescription As String
   PName As String
   PComment As String
End Type

Type PRINTER_INFO_4
   pPrinterName As String
   pServerName As String
   Attributes As Long
End Type

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
Declare Function PtrToStr Lib "Kernel32" Alias "lstrcpyA" _
   (ByVal RetVal As String, ByVal Ptr As Long) As Long
Declare Function StrLen Lib "Kernel32" Alias "lstrlenA" _
   (ByVal Ptr As Long) As Long
            

Public Function EnumeratePrintersWin()

   Dim Success As Boolean, cbRequired As Long, cbBuffer As Long
   Dim Buffer() As Long, nEntries As Long
   Dim I As Long, PFlags As Long, PDesc As String, PName As String
   Dim PComment As String, Temp As Long

   cbBuffer = 3072
   ReDim Buffer((cbBuffer \ 4) - 1) As Long
   Success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                         PRINTER_ENUM_LOCAL, _
                         vbNullString, _
                         1, _
                         Buffer(0), _
                         cbBuffer, _
                         cbRequired, _
                         nEntries)
   If Success Then
      If cbRequired > cbBuffer Then
         cbBuffer = cbRequired
         Debug.Print "Buffer too small.  Trying again with " & _
                  cbBuffer & " bytes."
         ReDim Buffer(cbBuffer \ 4) As Long
         Success = EnumPrinters(PRINTER_ENUM_CONNECTIONS Or _
                             PRINTER_ENUM_LOCAL, _
                             vbNullString, _
                             1, _
                             Buffer(0), _
                             cbBuffer, _
                             cbRequired, _
                             nEntries)
         If Not Success Then
            Debug.Print "Error enumerating printers."
            Exit Function
         End If
      End If
   Debug.Print "There are " & nEntries & _
                " local and connected printers."
   
   For I = 0 To nEntries - 1
      PFlags = Buffer(4 * I)
      PDesc = Space$(StrLen(Buffer(I * 4 + 1)))
      Temp = PtrToStr(PDesc, Buffer(I * 4 + 1))
      PName = Space$(StrLen(Buffer(I * 4 + 2)))
      Temp = PtrToStr(PName, Buffer(I * 4 + 2))
      PComment = Space$(StrLen(Buffer(I * 4 + 2)))
      Temp = PtrToStr(PComment, Buffer(I * 4 + 2))
      Debug.Print PFlags, PDesc, PName, PComment
      
      UserForm2.PrintCombobox.AddItem PDesc
      UserForm2.PrintTekstBox.Value = PComment
                
    Next I
   Else
      Debug.Print "Error enumerating printers."
   End If
    
End Function

[ Voor 14% gewijzigd door sebasgrif op 24-02-2004 15:34 . Reden: [code] tags aangebracht ]


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB/AI

Front verplichte underscores

Leuk gedaan :)

Je zou trouwens even [code]..[/code] tags om de code kunnen zetten, zodat het mooi ingeprongen blijft :)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • sebasgrif
  • Registratie: Februari 2004
  • Laatst online: 28-01 18:26
Ik heb toch nog ff een klein vraagje, kan je met VBA ook met 1 commando debugging uit zetten. bijvoorbeeld bij het begin debug = false (dit werkt niet) ofzo.
ik wil de debug commando's erin laten zitten voor later onderhoud en vind het niet erg netjes om dit als commentaar neer te zetten

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB/AI

Front verplichte underscores

Het makkelijkst is zoek op Debug. en vervangen met ' Debug. (dus commentaar). Alternatief is je code aanpassen en #constDebug = True en #If constDebug = true then ... #else ... #end if gebruiken. Maar gewoon zoek&vervang is eenvoudiger :)

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • sebasgrif
  • Registratie: Februari 2004
  • Laatst online: 28-01 18:26
Ik heb er nu gewoon ' voor gezet, ik had nog een puntje waar ik niet uitkwam:
Hoe kan ik ervoor zorgen dat er eenfoutmeling te voorschijn komt als er in het PaginaBereikTextBox iets anders komt dan het goede "1,3-7", bijvoorbeeld een aantal letters=

  • sebasgrif
  • Registratie: Februari 2004
  • Laatst online: 28-01 18:26
**SCHOP**

Is er iemand die mij kan helpen?
Pagina: 1