Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: PDF-tiedosto automaattisesti

Sivun loppuun

Viskers [09.05.2008 10:05:36]

#

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.

neau33 [09.05.2008 16:25:00]

#

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

lisäinfoa

neau33 [09.05.2008 20:05:00]

#

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
  '...

neau33 [09.05.2008 23:12:03]

#

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

neau33 [10.05.2008 01:30:27]

#

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...

neau33 [10.05.2008 05:20:33]

#

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.

Viskers [11.05.2008 11:36:43]

#

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

neau33 [11.05.2008 18:05:42]

#

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

Viskers [12.05.2008 10:07:19]

#

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

neau33 [13.05.2008 08:07:11]

#

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...

neau33 [13.05.2008 10:44:42]

#

Heippa taas!

Pikku bugi: Do While Dir(rptPolku & "\" & rptNimi) = "": Loop
pitää olla: Do While Dir(rptPolku & "\" & rptNimi & ".pdf") = "": Loop

neau33 [14.05.2008 19:59:02]

#

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

Meitzi [15.05.2008 21:50:12]

#

Office 2007:ään löytyy lisäpalikka jolla saa suoraan tallennettua PDF tiedostoja.

http://www.microsoft.com/downloads/details.aspx?FamilyId=F1FC413C-6D89-4F15-991B-63B07BA5F2E5&displaylang=fi

Suosittelisin muutenkin välttämään näppäinsyötteidenlähetysviritykset, koska eivät ne vain toimi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta