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 Sub
Moikka 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 Sub
Moikka 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 Sub
Nyt 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 Sub
Kiitos.
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 If
Menee 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 Sub
Office 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.