Miten saisi VB:llä tai Accessillä luotua PDF tiedoston atomaattisesti?
Nyt ohjelma toimii niin, että käyttäjä saa ruudulle tekstin, jonka joutuu tulostaman manuaalisesti PDF tiedostoksi.
Käytöä helpottaisi se, että painiketta painamalla ohjelma tekisi PDF:n automaattisesti oikeaan kansioon oikealla nimellä.
Kiitos etukäteen.
Moikka Viskers!
Tee aliohjelma, joka vaihtaa tulostuksen ajaksi järjestelmän oletustulostinta ja palauttaa tulostuksen jälkeen edellisen oletustulotimen...pikku esimerkki
Sub UlostaPDF()
Dim Ulostin As Printer
Dim OletusUlostin As String
Dim OletusPolku As String
OletusUlostin = Printer.DeviceName
OletusPolku = Environ("HOMEPATH")
For Each Ulostin In Printers
Select Case Ulostin.DeviceName
Case "AcrobatDistiller", "Foxit PDF Printer", "jne."
Set Printer = Ulostin: Exit For
End Select
Next
'ChDir(polku)
'tähän tulostusrutiini
'...
'ChDir(OletusPolku)
For Each Ulostin In Printers
Select Case Ulostin.DeviceName
Case OletusUlostin
Set Printer = Ulostin: Exit For
End Select
Next
End SubMoikka taas Viskers!
tässä vielä VB:llä testattu tulostusrutiini...
Sub UlostaPDF(ByVal Tiedosto As String, _
ByVal Sisältö As String)
'...
On Error Resume Next
SendKeys Tiedosto
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{ENTER}"
Printer.Print Sisältö
Printer.EndDoc
If Err <> 0 Then
Err.Clear: On Error GoTo 0
End If
'...Moikka taas Viskers!
tässä vielä samaa uloste-huumoria VBA-versiona...
Sub EsiUlostus()
ChDir (Environ("userprofile") & "\Työpöytä")
UlostaPDF ActiveWorkbook.Name & "_" & _
ActiveSheet.Name & "_PDF" '(Excel)
ChDir (Environ("HOMEPATH"))
End Sub
Sub UlostaPDF(ByVal PDFDocumentti As String)
Dim OletusUlostin As String
Dim Ulostin As String
Dim Nimi As String, i As Integer
Nimi = "Foxit PDF Printer" 'esim.
OletusUlostin = Application.ActivePrinter
Set WshNetwork = CreateObject("WScript.Network")
Set Ulostimet = WshNetwork.EnumPrinterConnections
For i = 0 To Ulostimet.Count - 2 Step 1
Ulostin = Ulostimet.Item(i + 1) & " porttiin Ne00:"
If InStr(Ulostin, Nimi) > 0 Then Exit For
Next
i = 0
ret:
On Error Resume Next
Application.ActivePrinter = Ulostin
If Err > 0 And i < 9 Then
Err.Clear: On Error GoTo 0
Dim splitti() As String
splitti = Split(Ulostin, "Ne0")
i = i + 1: Ulostin = splitti(0) & "Ne0" & CStr(i) & ":"
Erase splitti: GoTo ret
ElseIf Err > 0 And i = 9 Then
MsgBox "Systeemissä on mätää!!!"
GoTo ExitProc
End If
On Error Resume Next
SendKeys PDFDocumentti
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{ENTER}"
'----------------------
'Excel
ActiveSheet.PrintOut
'======================
'Access
'DoCmd.PrintOut
'----------------------
ExitProc:
If Err <> 0 Then
Err.Clear: On Error GoTo 0
End If
Application.ActivePrinter = OletusUlostin
Set Ulostimet = Nothing
Set WshNetwork = Nothing
End SubMoikka taas!
[/k]pikku lisäys...[/k]
Saman Office Paketin Word vaatii näköjään " porttiin Ne00:" osuuden muodossa " on NE00:" ...jotenka jos automatisoit wordiä niin fixaa myös split-jutskat...
onkin aika kätevä jutska wordissä, kun laittaa makron nappulan taakse valikkoriville...
Moikka taas
neau33 kirjoitti:
täyttä ulostetta Excelistä puhuttaessa...
Sub EsiUlostus() UlostaPDF ActiveWorkbook.Name & "_" & _ ActiveSheet.Name & "_PDF" '(Excel) ChDir (Environ("HOMEPATH")) End Sub
tässä toimiva versio...
Public OletusPolku As String
Sub UlosteAlustus()
OletusPolku = Application.DefaultFilePath
Application.DefaultFilePath = _
Environ("userprofile") & "\Työpöytä" 'esim.
UlostaPDF Application.DefaultFilePath & "\" & _
Application.ActiveWorkbook.Name & "_" _
& Application.ActiveWorkbook.ActiveSheet.Name & "_PDF"
Application.DefaultFilePath = OletusPolku
End SubNyt jos haluat laittaa Exceliin Macronappulan, joka toimii joka ainoassa työkirjassa niin...avaa uusi työkirja, lisää VBE:ssa Mooduuli, iske koko koodi moduuliin ja tallenna työkirja .xla tiedostoksi (Tallenna nimellä & anna nimeksi vaikka PDF_Ulostus, valitse alimmasta valikosta Excel lisämakro ja tallenna). Sulje työkirja ja avaa uusi. Valitse Työkalut -> Apuohjelmat, ruksaa PDF_Ulostus -> OK. Napauta hiiren oikealla valikkorivillä -> Mukauta -> Komennot & valitse vasemmasta laatikosta Makrot. Raahaa hiirellä oikeasta laatikosta: Mukautettu valikkokomento valikkorivin johonkin työkalupalkkiin pudota ja nappaa päällä hiiren oikealla. (voit nyt kirjoitaa valikon kohdassa Nimi: haluamasi nimen nappulalle) Valitse valikosta Liitä makro ja kirjoita ylimpänä olevaan tekstiboxiin 'PDF_Ulostus.xla'!UlosteAlustus -> OK -> sulje Mukauttaminen.
Sama jutska wordissä: Avaa Wordissä VB-editori, laajenna Project valikossa Project Normal, laajenna Modules ja napauta NewMacros. Iske koodi sinne minne se kuuluu ja vaihda UlosteAlustus-aliohjelman kaikki rivit näihin:
ChDir (Environ("userprofile") & "\Työpöytä")
UlostaPDF ActiveDocument.Name & "_BDF"
ChDir (Environ("HOMEPATH"))ja UlostaPDF-aliohjeman rivi:
ActiveSheet.PrintOut
tähän:
ActiveDocument.PrintOut
Nappaa Wordissä valikkorivin jotain työkalupalkkia hiiren oikealla -> Mukauta - Komennot -> valitse vasemmasta boxista Makrot & raahaa oikeasta Normal.NewMacros.UlostusAlustus valikkorivin johonkin työkalupalkkiin -> nimeä nappula -> sulje Mukauttaminen...and that's it.
Hei,
kiitos Nea vastauksestasi. Näistä on hyötyä.
Olisi vielä lisäkysymys:
Miten accessissä saa raportin suoraan PDF:ksi?
Esim. raportti "lasku" tallentuisi kansioon "laskut" käyttäjän/koneen antamalla nimellä.
Viskers
Moikka taas Viskers!
koodi on testaamaton...
Sub UlostaPDF()
Dim errCount As Integer, PDFDocument As String
Dim perusPolku As String, rpt As Report, exists As Boolean
Dim rptNimi As String, rptPolku As String
perusPolku = Environ("userprofile") & "\Omat tiedostot"
For Each rpt In Apllication.Reports
If InStr(rpt.Name, "lasku") > 0 Then
rptNimi = rpt.Name
rptPolku = perusPolku & "\laskut"
exists = true: Exit For
End IF
Next
If Not exists Then
MsgBox "Raporttia ei ole!": Exit Sub
End If
On Error Resume Next
MkDir(rptPolku)
If Err > 0 Then GoTo ErrorHandler
On Error Resume Next
DoCmd.OpenReport rptNimi, acPreview
If Err > 0 Then GoTo ErrorHandler
PDFDocument = rptPolku & "\" & rptNimi
SendKeys PDFDocument
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{ENTER}"
DoCmd.PrintOut
DoCmd.Close acReport, rptNimi, acSaveYes
Exit Sub
ErrorHandler:
Err.Clear: On Error GoTo 0
If errCount = 0 Then
errCount = errCount + 1: Resume Next
Else
MsgBox "Systeemissä on mätää!"
End If
End If
End SubKiitos.
Kovasti vain tarjoaa "tallenna PDF-tiedosto nimellä" ikkunaa, eli pysähtyy tähän.
Tiedostonimi -kentässä on oikea tiedostonimi, mutta tallennuspolku väärin.
Raporttiin on määritelty "käytä tiettyä tulostinta" Adobe PDF:ksi.
Viskers
Moikka taas Viskers!
Sillä ei ole mitään väliä minkä kansion Tiedostopalvelin näyttää tallennettaessa...Jos Tiedostonimi-kenttään syötetään apsoluuttinen polku niin tiedosto tallennetaan sinne minne tiedostopolku osoittaa. Esimerkkikoodi luo ..\Omat tiedostot kansioon alikansion \laskut jos Report collection sisältää raportin, jonka nimeen sisältyy merkkijono "lasku" ja
..\Omat tiedostot kansiossa ei jo ennestään ole alikansiota \laskut. Jos haluta, että tiedostopalvelin avaa kansionäkymän \laskut kansiossa niin sinun tulee vaihtaa oletustiedostopolkua...
DoCmd.OpenReport rptNimi, acPreview
If Err > 0 Then GoTo ErrorHandler
'eli laita tähän väliin seuraavat 5 rivä '*
Do while InStr(Screen.ActiveReport.Name, rptNimi) = 0: Loop
Dim OletusPolku As String
OletusPolku = Application.DefaultFilePath
Application.DefaultFilePath = rptPolku
On Error Resume Next
'ja muuta tämä rivi
PDFDocument = rptPolku & "\" & rptNimi '*
'tähän
PDFDocument = rptNimi
'lisää tämä rivi
SendKeys "{DELETE}"
SendKeys PDFDocument
SendKeys "{TAB}" 'näillä siirrytään tallenna dialogin kontrolleissa
SendKeys "{TAB}" 'joten tsekkaa mihin fokus jää jos tökkii...
SendKeys "{ENTER}" 'tällä klikataan tallenna-nappia
DoCmd.PrintOut
'lisää nämä kaksi riviä
If Err > 0 Then GoTo ErrorHandler
Do While Dir(rptPolku & "\" & rptNimi) = "": Loop
DoCmd.Close acReport, rptNimi, acSaveYes
'lisää tämä rivi
Application.DefaultFilePath = OletusPolku
Exit Sub
'sit muuta vähän virheenkäsittelijää
ErrorHandler:
Err.Clear: On Error GoTo 0
If errCount = < 2 Then
errCount = errCount + 1: Resume Next
Else
If Application.DefaultFilePath <> OletusPolku Then _
Application.DefaultFilePath = OletusPolku
End IfMenee vähän sokkona...minulla ei ole ollut MS Accessia enää pitkään aikaan koneella, joten en voi testata sinulle valmista viritelmää...Mikäli ei ala toimimaan, niin todennäköisin syy on, että SendKeys lähettää aktiivisen raportin kontrolleille, eikä tiedostopalvelijalle. Mikäli asia on näin niin automaattinen tulostus ei onnistu näillä konsteilla. Tulostuksen saisi tässä tapauksessa onnistumaan API-hookeilla, mutta menee niin pitkälle systeemin syövereihin, ettei jaksa nähdä moista vaivaa...
Heippa taas!
Pikku bugi: Do While Dir(rptPolku & "\" & rptNimi) = "": Loop
pitää olla: Do While Dir(rptPolku & "\" & rptNimi & ".pdf") = "": Loop
Heippa taas!
tässä vielä Access viritelmä...
Sub TulostaPDF()
Dim errCount As Integer, rpt As Report
Dim rptNimi As String, rptPolku As String
Dim exists As Boolean, OletusPolku As String
Dim OletusTulostin As Printer
For Each rpt In Apllication.Reports
If InStr(rpt.Name, "lasku") > 0 Then
rptNimi = rpt.Name
exists = true: Exit For
End IF
Next
If Not exists Then
MsgBox "Raporttia ei ole!": Exit Sub
End If
OletusTulostin = Printer
Printer = Application.Printers("Adobe PDF") 'tai muu PDF-tulostin
DoCmd.OpenReport rptNimi, acPreview
Reports(rptNimi).Printer = Printer
Do while Screen.ActiveReport.Name <> rptNimi: DoEvents: Loop
rptPolku = CurrentProject.path & "\laskut"
On Error Resume Next
MkDir(rptPolku)
If Err > 0 Then GoTo ErrorHandler
OletusPolku = Application.DefaultFilePath
Application.DefaultFilePath = rptPolku
On Error Resume Next
SendKeys "{DELETE}"
SendKeys rptNimi
SendKeys "{TAB}"
SendKeys "{TAB}"
SendKeys "{ENTER}"
DoCmd.PrintOut
If Err > 0 Then GoTo ErrorHandler
Do While Dir(rptPolku & "\" & rptNimi & ".pdf") = "": DoEvents: Loop
DoCmd.Close acReport, rptNimi, acSaveYes
ExitProc:
Application.DefaultFilePath = OletusPolku
Printer = OletusTulostin
Exit Sub
ErrorHandler:
Err.Clear: On Error GoTo 0
If errCount = < 2 Then
errCount = errCount + 1: Resume Next
Else
MsgBox("Systeemissä on mätää!"): GoTo ExitProc
End If
End SubOffice 2007:ään löytyy lisäpalikka jolla saa suoraan tallennettua PDF tiedostoja.
Suosittelisin muutenkin välttämään näppäinsyötteidenlähetysviritykset, koska eivät ne vain toimi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.