veit > microsoft.public.* > microsoft.public.office.excel

 #1  
25.05.2005, 11:43
Gert-Jan
Beste mensen,

Ik zoek naar het volgende :

Een macro die een Excel Document voor mij naar een specifieke printer
uitprint.
We werken met Office 2000.

Ik heb wel een een macro maar Visual Basic blijft een fout aangeven
Bij de Activeprinter.. Ik heb al verschillende andere manieren geprobeerd
zoals Application.Activeprinter of "Hp Laserjet 1010 on GurT"
Maar kom niet tot een oplossing.

Deze Macro gebruik ik nu....
In Word werkt deze macro met een kleine aanpassing wel goed...
Maar in Excel krijg ik een foutmelding.

Sub macro()

Dim sCurrentPrinter As String
sCurrentPrinter = ActivePrinter
AppExcel.ActivePrinter = "hp LaserJet 1010" <<< In deze zin zit de
fout....
Application.PrintOut FileName:="F:\Home\itstage\dagrapport.xls"

End Sub

Als iemand enig idee hebt waar de fout zit in deze macro of
kan helpen met een andere macro GRAAG !

M.v.g. Gert-Jan
 #2  
25.05.2005, 18:22
Rody
Zie:

[..]
Niet precies wat je wilt, maar wel een mogelijke oplossing

Groet Rody

"Gert-Jan" <GertJan> schreef in bericht
news:8549
[..]
 #3  
25.05.2005, 22:17
BBert
On Wed, 25 May 2005 02:43:11 -0700, Gert-Jan wrote...

> Ik zoek naar het volgende :
> Een macro die een Excel Document voor mij naar een specifieke printer
> uitprint.
> We werken met Office 2000.


Een aanvulling op het antwoord dat Rody reeds gaf:

Onderstaande printroutine van KeepItCool heb ik hier en daar wat
aangepast om hem voor mijn situatie werkbaar te maken. Het loopt echt
als een trein en ik heb nooit meer last van printers die op een netwerk
zitten en die ik niet kan benaderen omdat ze op Ne00 of Ne01 of Ne02
etc. zitten.
Met behulp van deze routine print ik rechtstreeks naar een
kopieerapparaat ergens in het gebouw.

Op deze site:
[..]
kun je nog wat (achtergrond) informatie vinden waarom het printen in
Word wel eenvoudig lukt en Excel kuren vertoont.

**********************
Private Declare Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" (ByVal lpAppName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long

Option explicit

Dim strFile As String
Dim weeknummer
Dim Pad
Dim vaList
Dim v
Dim n%, lRet&, sBuf$, sCon$, aPrn
Const lLen& = 1024, sKey$ = "devices"

Sub Bestanden_Printen_Op_Dienstencentrum()
'Vind alle printers
vaList = PrinterFind

'Toon alle printers in het Immediate Window
Debug.Print Join(vaList, vbLf), , "List of printers"

'Vind Oce kopierapparaat
vaList = PrinterFind(Match:="SERVER_DEA\Oce 3145 DC")

'Maak van de "Oce 3145" kopier de actieve printer
If UBound(vaList) = -1 Then
MsgBox "Printer not found"
ElseIf MsgBox( _
"from " & vbTab & ": " & _
ActivePrinter & vbLf & "to " & _
vbTab & ": " & vaList(0), vbOKCancel, _
"Switch Printers") = vbOK Then
Application.ActivePrinter = vaList(0)
End If
ChDrive "G"

Pad = "G:\Mijn documenten\Diversen"
ChDir (Pad)

'Geef weeknummer
weeknummer = InputBox("Geef weeknummer")

'Vorm bestandsnaam
strFile = Dir("*" & weeknummer & "*.xls")

'Open het bestand, print en sluit.
Do Until strFile = ""
Workbooks.Open Filename:=strFile

'Hier komt de print routine
Workbooks(strFile).Worksheets("idrf").PrintOut

Workbooks(strFile).Close savechanges:=False

'volgende bestand
strFile = Dir

Loop

End Sub

Public Function PrinterFind(Optional Match As String) As Variant

'------------------------------------------------------------------
'written by keepITcool

'requires xl2000 or newer.
'returns a zerobased array of complete localized printer strings
'results are filtered on Match string (not case sensitive),
'if no result the ubound = -1

'------------------------------------------------------------------

'Split ActivePrinter string to get localized word for "on"
aPrn = Split(Excel.ActivePrinter)
sCon = " " & aPrn(UBound(aPrn) - 1) & " "

'Read all installed printers (1k bytes s/b enough)
sBuf = Space(lLen)
lRet = GetProfileString(sKey, vbNullString, vbNullString, sBuf, lLen)
If lRet = 0 Then
Err.Raise vbObjectError + 513, , "Can't read Profile"
Exit Function
End If

'Split buffer string to a zero based array
aPrn = Split(Left(sBuf, lRet - 1), vbNullChar)

'Optionally Filter the array on Match
If Match <> vbNullString Then aPrn = Filter(aPrn, Match, -1, 1)

'Append localized "on" and 16bit portname for each Printer
For n = LBound(aPrn) To UBound(aPrn)
sBuf = Space(lLen)
lRet = GetProfileString(sKey, aPrn(n), vbNullString, sBuf, lLen)
aPrn(n) = aPrn(n) & sCon & _
Mid(sBuf, InStr(sBuf, ",") + 1, lRet - InStr(sBuf, ","))
Next

'Return the result
PrinterFind = aPrn

End Function
***********************
 #4  
26.05.2005, 11:29
keepITcool
Beste BBert..

'hier en daar wat aangepast' ... OUCH!

waarom laat je de variabelen niet gewoon binnen de functie????

Dim n%, lRet&, sBuf$, sCon$, aPrn
Const lLen& = 1024, sKey$ = "devices"

procedure level variabelen naar module level verplaatsen
is slechts ZEER zelden een goed idee.

voor het overige: (jouw aanpassingen)
waarom defineer je je variabelen allemaal als variant???

OP:
het origineel kun je vinden op:
[..]

zoek naar:

keepITcool PrinterFind
 #5  
26.05.2005, 12:42
BBert
On Thu, 26 May 2005 02:29:34 -0700, keepITcool wrote...

> waarom laat je de variabelen niet gewoon binnen de functie????


Dat moet je gewoon zien als mijn onervarenheid. Soms krijg ik een
foutmelding als ik de variabele binnen de sub of functie declareer en de
macro vervolgens naar een andere sub springt. Blijkbaar wordt de waarde
dan niet altijd goed meegenomen (of herkent). Ik heb gemerkt dat als ik
alles bovenaan neerzet, ik dat probleem niet heb.
Maar nogmaals, het heeft meer te maken met mijn gebrekkige kennis van
VBA. Het is echt ploeteren om alles aan de praat te krijgen, maar wel
leuk!

> Dim n%, lRet&, sBuf$, sCon$, aPrn
> Const lLen& = 1024, sKey$ = "devices"
> procedure level variabelen naar module level verplaatsen
> is slechts ZEER zelden een goed idee.


Ja is dat zo? Ik neem aan dat het tot onverwachte resultaten kan leiden
of zoiets. Trouwens, waar staan die tekens in de variabele eigenlijk
voor? Hebben die nog een functie? Ik doel op %, $, &.

> voor het overige: (jouw aanpassingen)
> waarom defineer je je variabelen allemaal als variant???


Ook hier weer onkunde. Ik weet niet altijd goed welke type de variabele
is en dan maak er maar gewoon een dimmetje van zonder typeaanduiding.
Echter, dankzij de functie Typename kan ik het wel achterhalen. Het is
inderdaad zo dat als je fatsoenlijk declareert (dus met type) dit tot
minder fouten leidt en als er al fouten ontstaan, ze sneller op te
sporen zijn.

Tenslotte, ik haal veel code van het internet en probeer het vervolgens
te doorgronden en aan te passen (aan mijn situatie) maar ik moet zeggen
dat het voor mij vaak koeterwaals is. Het gaat echt boven mijn pet. Toch
leer ik telkens wat bij, van deze groep, van de (code) voorbeelden, zelf
dingen uitzoeken, en van de op- en aanmerkingen van anderen. Dus ook
jouw suggusties zal ik zeker weer meenemen.
 #6  
26.05.2005, 13:03
keepITcool
Variabelen moet je zetten op de plaats waar je ze nodig hebt.
dat voorkomt veel fouten, zeker als je gaat "nesten".

Zo liever niet...
Dim i%

Sub ProcA()
For i = 1 to 5
Call ProcB ' wordt maar 1 keer aangeroepen
' i wordt immers buiten de procedure gewijzigd.
Next i
End Sub

Sub ProcB
For i = 1 to 10
debug.print "B"
Next i
End Sub

Als je variabelen wilt controleren tijdens de uitvoering
gebruik dan het venster "LOKALE VARIABELEN" in de VBE
en zet links en rechts een breakpoint. (of gebruik F6/F8)

het venster LOKAAL is echt zeer leerzaam!
ook vind je hier alle datatypes van je "varianten"

Dan het volgende:

"Hebben die nog een functie? Ik doel op %, $, &."

dat zijn "Type Declaration characters"

Dim n%, lRet&, sBuf$, sCon$, aPrn is verkorte notatie voor
Dim n as Integer, lRet as Long, sBuf as String enz...

Tijd voor een Boek?
(Power Programming with VBA van Walkenbach,
je bent nu iets gevorderd, dus dat is een leuk boekje voor het strand :)
 #7  
26.05.2005, 13:53
BBert
On Thu, 26 May 2005 04:03:01 -0700, keepITcool wrote...

> Tijd voor een Boek?
> (Power Programming with VBA van Walkenbach,
> je bent nu iets gevorderd, dus dat is een leuk boekje voor het strand :)


Ha, zeker met dit weer en dan een biertje erbij. Maar ik ben bang dat ik
dan al gauw alle variabelen voor een operator aan zie ;-)

In ieder geval bedankt voor de uitleg en ik zal het boek van Walkenbach
eens bij bol.com opzoeken en kijken wat het te bieden heeft.
 #8  
26.05.2005, 14:28
Gert-Jan
Thx,

Hiermee moet het wel lukken

"BBert" schreef:
[..]
 #9  
26.05.2005, 15:11
Gert-Jan
Of toch niet....

Hoe geef ik nu een Activeprinter aan in Excel ?!
Mischien makkelijker als je on topic blijft...

ActivePrinter = NewPrinter & " on " & _
GetPrinterInfo(NewPrinter).PortName

?
 #10  
27.05.2005, 20:57
BBert
On Thu, 26 May 2005 06:11:02 -0700, Gert-Jan wrote...

> Hoe geef ik nu een Activeprinter aan in Excel ?!
> Mischien makkelijker als je on topic blijft...


Sorry voor het ongemak.

> ActivePrinter = NewPrinter & " on " & _
> GetPrinterInfo(NewPrinter).PortName
> ?


Nogmaals hier de (niet bewerkte)code en alles fatsoenlijk gedeclareerd
zoals de schrijver het bedoeld heeft.

De actieve printer wordt ingesteld in het ElseIf statement. Eerst krijg
je een msgbox met alle printers die bij jou geinstalleerd zijn. Stel je
hebt een Canon(de actieve printer) en een Laserjet en je wilt van die
Laserjet de actieve maken. Door op de OK knop te drukken, switch je van
actieve printer.
Dat gebeurt daar waar staat: Application.ActivePrinter = vaList(0)
vaList is een array (oftewel matrix) waarin de namen zijn opgeslagen.
Elke naam is een element. Het getal tussen haakjes geeft aan welk
element moet worden opgehaald. In dit geval geeft de 0 de eerste
Laserjet aan die gevonden is.
Zoals je wellicht hebt kunnen lezen in het artikeltje waarnaar ik
verwijs, voldoet ActivePrinter = "HP LaserJet" niet in Excel. Excel moet
namelijk ook de portname hebben.

**********************
Option Explicit

Private Declare Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" (ByVal lpAppName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long

Sub test()
Dim vaList
'Get all printers
vaList = PrinterFind
'Show m
MsgBox Join(vaList, vbLf), , "List of printers"

'Get all laserjets
vaList = PrinterFind(Match:="Laserjet")

'Switch to the first laserjet found
If UBound(vaList) = -1 Then
MsgBox "Printer not found"
ElseIf MsgBox( _
"from " & vbTab & ": " & ActivePrinter & vbLf & "to " & _
vbTab & ": " & vaList(0), vbOKCancel, _
"Switch Printers") = vbOK Then
Application.ActivePrinter = vaList(0)
End If
End Sub

Public Function PrinterFind(Optional Match As String) As Variant
Dim n%, lRet&, sBuf$, sCon$, aPrn
Const lLen& = 1024, sKey$ = "devices"
'------------------------------------------------------------------
'written by keepITcool

'requires xl2000 or newer.
'returns a zerobased array of complete localized printer strings
'results are filtered on Match string (not case sensitive),
'if no result the ubound = -1

'------------------------------------------------------------------

'Split ActivePrinter string to get localized word for "on"
aPrn = Split(Excel.ActivePrinter)
sCon = " " & aPrn(UBound(aPrn) - 1) & " "

'Read all installed printers (1k bytes s/b enough)
sBuf = Space(lLen)
lRet = GetProfileString(sKey, vbNullString, vbNullString, sBuf, lLen)
If lRet = 0 Then
Err.Raise vbObjectError + 513, , "Can't read Profile"
Exit Function
End If

'Split buffer string to a zero based array
aPrn = Split(Left(sBuf, lRet - 1), vbNullChar)

'Optionally Filter the array on Match
If Match <> vbNullString Then aPrn = Filter(aPrn, Match, -1, 1)

'Append localized "on" and 16bit portname for each Printer
For n = LBound(aPrn) To UBound(aPrn)
sBuf = Space(lLen)
lRet = GetProfileString(sKey, aPrn(n), vbNullString, sBuf, lLen)
aPrn(n) = aPrn(n) & sCon & _
Mid(sBuf, InStr(sBuf, ",") + 1, lRet - InStr(sBuf, ","))
Next

'Return the result
PrinterFind = aPrn
End Function
********************
 #11  
30.05.2005, 08:47
Gert-Jan
thx :)

"BBert" schreef:
[..]
Soortgelijke onderwerpen