Diverse files printen met access macro?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Rupie
  • Registratie: Augustus 2006
  • Laatst online: 08-09 15:19
Beste tweakers,

mijn broer kwam bij mij met het volgende vraagstuk: "ik heb een database met linkjes naar documenten en ik wil per regel die documenten af kunnen drukken." Na wat doorvragen kom ik tot de volgende situatie:

Voor zijn werk is hij bezig met een access database (access 2007). Deze ziet er bijvoorbeeld als volgt uit:

onderwerp1link1link2link3link4link5link6
onderwerp2link1link2link3link4link5link6

et cetera

Uitleg:
Elke regel in de tabel staat voor een onderwerp. Per onderwerp zijn er een aantal links naar documenten (link1 t/m link6, maximaal een stuk of 15 per onderwerp). Dit zijn verschillende soorten documenten (xls, doc, pdf). Per onderwerp zijn echter niet altijd alle 15 bestanden aanwezig. Soms wordt er ook niet gelinkt naar een bestand maar naar naar een map met verschillende excel bestanden.
De documenten staan trouwens ook niet per onderwerp opgeslagen in submappen, maar per rij (dus alle 'link1' documenten staan in de submap \link1\).

De uitdaging:
Per onderwerp/regel moeten de bijbehorende documenten afgedrukt worden.

Ik probeer nu voor mijzelf helder te krijgen hoe ik dit zou kunnen doen. Zou het mogelijk zijn om een macro te schrijven die je per regel aan kan roepen en per regel de documenten stuk voor stuk opent (en die fijne melding die access 2007 geeft op het moment dat je een link aanklikt wegklikt) en het bestand afdrukt? Ik twijfel daarover omdat ik mij afvraag hoe ik een pdf af zou kunnen drukken via een macro. En omdat ik mij afvraag of de moeite die dat wellicht kost het wel waard is. Anders gaat hij maar mooi voor elke onderwerp handmatig de documenten afdrukken ;)

Is er toevallig iemand die een suggestie heeft? Ik hoor het graag!

Desktop | Server | Laptop


Acties:
  • 0 Henk 'm!

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 23:29
Je kan in VBScript iets laten printen, met een commando als
code:
1
2
3
set objShell = CreateObject("Shell.Application")
str = "C:\PDFFile.pdf"
objShell.ShellExecute str, "", "", "print", 1

Ik meen dat je gewoon vbScript in de Access VBA kan persen, maar dat schiet me zo niet te binnen.

Acties:
  • 0 Henk 'm!

  • Rupie
  • Registratie: Augustus 2006
  • Laatst online: 08-09 15:19
Het werkt niet zo eenvoudig, ik krijg het niet voor elkaar om een macro te maken die een bestand kan openen... vanuti access lukt het eigenlijk niet eens op een fatsoenlijke macro te schrijven zoals dat bij Word of Excel wel lukt. Iemand ervaring met VB in Access?

Desktop | Server | Laptop


Acties:
  • 0 Henk 'm!

Verwijderd

Als je te maken hebt met allerlei verschillende bestandstypen, is het automatisch openen, printen en weer afsluiten van die bestanden volgens mij niet zo eenvoudig als het klinkt. Ten eerste moet je weten met welke applicatie je een bepaald bestand moet openen, en daarna moet je nog zien uit te vinden hoe die applicatie een printopdracht geeft.
Ik kan me natuurlijk vergissen - maar volgens mij is je broer sneller af wanneer hij alles handmatig print..

Acties:
  • 0 Henk 'm!

  • Rupie
  • Registratie: Augustus 2006
  • Laatst online: 08-09 15:19
Dat had ik hem direct al verteld, maar ben nu zelf emer geinteresseerd of het mogelijk is. En dan te beginnen of het uberhaupt mogelijk is om via een macro vanuit access bijvoorbeeld een word document te openen, maar dat lijkt dus ook nog niet echt eenvoudig realisseerbaar ;)

Desktop | Server | Laptop


Acties:
  • 0 Henk 'm!

Verwijderd

het is zeker mogelijk. de code van onkl kan bijna ongewijzigd in access geplaatst worden, bv. in de klikprocedure van een opdrachtknop die zich op een form bevindt waarin de gewenste gegevens zichtbaar zijn.

Acties:
  • 0 Henk 'm!

  • bazs2000
  • Registratie: November 2000
  • Laatst online: 05-08 11:09

bazs2000

Pixels zo groot als een atoom

Inderdaad, die code is bruikbaar. Ik zou wel voor flexibiliteit gaan en proberen zoveel mogelijk bestandstypen te kunnen openen en afdrukken. Laat een script de inhoud van een directory 'testen' op zoveel mogelijke bestandstypen waarmee je zeker weet dat alles netjes op papier zal belanden.

Je noemde ook Excelbestanden, doe ook iets met documenten die meerdere werkbladen bevatten. Het standaard 'alles' afdrukken kan onhandig zijn en zorg voor een procedure die kijkt of een Excelbestand meerdere werkbladen heeft. Dit lijkt overbodig maar ik heb veel Exceldocumenten gezien en vele bevatten werkbladen met alleen rommel en nutteloze zaken.

Je kan er wat papier mee besparen. :)
Trouwens, dergelijke scripts komen wel vaker van pas dus 1x maken en in de toekomst heb je er nog iets aan.

Krankzinnige muziek vind je hier.


Acties:
  • 0 Henk 'm!

  • Rupie
  • Registratie: Augustus 2006
  • Laatst online: 08-09 15:19
Blijkbaar is er toch nog hoop ;-)

ik zal straks eens kijken of ik uberhaupt een macro in access werkend kan krijgen. In word en excel lukt het allemaal wel om macro's te schrijven en uit te voeren, maar in access werkt het allemaal net ff anders volgens mij. macro's die geconverteerd worden naar modules en dergelijke... zal me eerst eens moeten verdiepen in het gebruik van VB in access.

Edit:
tot op heden geeft de code van onkl niet meer dan 'Compileerfout: Het argument is niet optioneel' bij regel 2...

[ Voor 13% gewijzigd door Rupie op 19-06-2009 08:08 ]

Desktop | Server | Laptop


Acties:
  • 0 Henk 'm!

Verwijderd

Met toevoeging van de regel:

Visual Basic .NET:
1
Dim str As String


(voorafgaand aan alle andere regels) zou je meer succes moeten hebben.

Ik heb nog wat vragen over de db van je broer:

1) heeft iedere kolom rechts van de kolom "onderwerp" betrekking op een bepaald type bestand, en ligt daarmee het aantal kolommen vast? Of moet je broer een complete kolom toevoegen zodra er meer dan zes bestanden per onderwerp beschikbaar zijn? In dat geval zou het nl. handiger zijn de tabel te verbouwen, met in de linkerkolom het onderwerp en in de rechterkolom de link naar het bijbehorende bestand/de bijbehorende bestanden. Dat betekent dus ook dat links een onderwerp meerdere keren kan voorkomen.

2) moeten alle bestanden in de tabel geprint worden, of wil je broer één onderwerp kunnen selecteren en daarna de bijbehorende bestanden printen?

[ Voor 71% gewijzigd door Verwijderd op 19-06-2009 09:42 ]


Acties:
  • 0 Henk 'm!

  • Rupie
  • Registratie: Augustus 2006
  • Laatst online: 08-09 15:19
dat zal ik eens gaan proberen. dat lijkt te werken inderdaad, krijg nu alleen dattie C:\pfdfile.pfd niet kan vinden, maar das logisch ;)

Om antwoord te geven op jou vragen:

1) iedere kollom heeft in principe betrekking op een belaald soort bestand (alle bestanden in kolom 1 zijn bijvoorbeeld word docs), maar het aantal kolomen ligt niet vast. Het kan best zijn dat er bij 1 onderwerp 5 excel bestanden horen, 6 pdf's en 4 word docs die allemaal in een andere map staan en die dus ook allemaal een eigen cel + link krijgen.

(enige addertje is dat het kan zijn dat er bij 1 link meerdere excel bestanden horen, in dat geval wordt er een map geopend in plaats van een bestand, maar dat is eventueel wel op te lossen door een paar extra kolommen.)

eventueel zou jou suggestie wel mogelijk zijn denk ik (al gaat dat wel heel veel werk worden, de db is al aardig gegroeid), dan is het natuurlijk een kwestie van een query draaien om de goede onderwerpen te selecteren ofzo)

2) per onderwerp moeten de bijbehorende bestanden geprint worden.

maar goed, op het moment krijg ik access nog altidj niet zover dat ik een macro uit kan voeren, als je een macro toevoegd krijg je maar een beperkt aantal opties die je uit kan voeren. Iets serieus draaien lukt echter nog altijd niet...

edit:
ik boek vooruitgang. Ik heb inmiddels een formulier waar ik voor een regel kan selecteren dat er geprint moet worden. Nu nog iets verzinnen om er voor te zorgen dat hij, als er een regel geselcteerd is, de kolommen af gaat lopen om de macro uit te voeren. Maar goed, het begin is er!

[ Voor 25% gewijzigd door Rupie op 19-06-2009 12:32 ]

Desktop | Server | Laptop


Acties:
  • 0 Henk 'm!

  • Rupie
  • Registratie: Augustus 2006
  • Laatst online: 08-09 15:19
Ik weet het, ik mag eigenlijk niet onder mezelf reageren, maar doe het stiekem toch een keer voor de oplossing van mijn probleempje

inmiddels een werkende oplossing! Het is een formuliertje geworden die de gegevens uit 1 bepaalde rij toont met daarbij een knopje 'alles afdrukken'. De knop roept de volgende 'Gebeurtenisprocedure' aan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Compare Database

Private Sub Knop1_Click()
    If [Voorkant] <> "" Then
        Dim mdl As Module
        Dim subveld1 As String
        subveld1 = [Voorkant]
        Set mdl = Modules![Module1]: DisplayHyperlinkParts "Draaiboek", subveld1
    End If
    If [Distributielijst] <> "" Then
        Dim mdl2 As Module
        Dim subveld2 As String
        subveld2 = [Distributielijst]
        Set mdl2 = Modules![Module1]: DisplayHyperlinkParts "Draaiboek", subveld2
    End If
    If [Inhoudsopgave] <> "" Then
        Dim mdl3 As Module
        Dim subveld3 As String
        subveld3 = [Inhoudsopgave]
        Set mdl3 = Modules![Module1]: DisplayHyperlinkParts "Draaiboek", subveld3
    End If
End Sub


per veld vraag ik af of er een waarde aanwezig is. Als dit het geval is roep ik in de module 'Module1' de Sub 'DisplayHyperlinkParts' aan met de naam van de tabel en de veldnaam waar het om gaat.
Deze module is nodig vanwege de manier waarop access een url opslaat. Access slaat de waarde die hij toont en de daadwerkelijk link op als 1 string ('displaytekst#daadwerkelijkelink#').
Voorbeeld: als je een hyperlink maakt naar 'map1\1.doc' slaat access deze op als 'map1\1.doc#map1\1.doc#'.
Om deze waarde om te bouwen naar een waarde waar ik wat mee kan is dus een Module nodig. Deze module heb ik gecombineerd met de code die al voorgesteld was door onkl, maar dusdanig aangepast dat hij de waarde in het veld gebruikt om te bepalen wat er geprint moet worden. Het blijkt zo te zijn dat access aan de hand van de gevonden extensie zelf bepaald met welk programma dit geopend dient te worden. Zosnel als de extensie bij windows bekend is zal Access het bestand dus af kunnen drukken. Het is dus niet nodig om ingewikkelde constructies te bouwen om via de extensie het juiste programma te achterhalen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Option Compare Database

Public Sub DisplayHyperlinkParts(ByVal strTable As String, _
                                 ByVal strField As String)
    
    Dim rst As New ADODB.Recordset
    Dim Str1 As String
    Dim Str As String
    Dim objShell As Object
        
        Set objShell = CreateObject("Shell.Application")
        Str1 = "D:\Rupie\Desktop\Inventarisatie\"
        Str = Str1 & "" _
            & HyperlinkPart((strField), acDisplayedValue)
        objShell.ShellExecute Str, "", "", "print", 1
  
End Sub


enige probleem wat ik nu nog heb is dat ik hard verwijs naar de locatie van de database (Str1 = "D:\Rupie\Desktop\Inventarisatie\"). De database staat echter op een USB stick dus de stationletter zal wel weer gaan veranderen en een backup op een andere locatie moet ook zonder aanpassingen werken. ook opgelost. Ik heb de volgende functie toegevoegd aan de procedure:

code:
1
2
3
Public Function GetDBPath() As String
    GetDBPath = CurrentProject.Path & "\"
End Function


resultaat hiervan is het path van de database. Deze geeft ik als 3e variabele mee als ik de Module aanroep en plaats ik vervolgens voor de waarde uit het veld zelf. Voor de volledigheid de gehele code. Als eerste de procedure zelf:

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
Option Compare Database

Public Function GetDBPath() As String
    GetDBPath = CurrentProject.Path & "\"
End Function

Private Sub Knop1_Click()
    If [Voorkant] <> "" Then
        Dim mdl As Module
        Dim subveld1 As String
        subveld1 = [Voorkant]
        Set mdl = Modules![Module1]: DisplayHyperlinkParts "Draaiboek", subveld1, GetDBPath
    End If
    If [Distributielijst] <> "" Then
        Dim mdl2 As Module
        Dim subveld2 As String
        subveld2 = [Distributielijst]
        Set mdl2 = Modules![Module1]: DisplayHyperlinkParts "Draaiboek", subveld2, GetDBPath
    End If
    If [Inhoudsopgave] <> "" Then
        Dim mdl3 As Module
        Dim subveld3 As String
        subveld3 = [Inhoudsopgave]
        Set mdl3 = Modules![Module1]: DisplayHyperlinkParts "Draaiboek", subveld3, GetDBPath
    End If
End Sub


en de Module:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Compare Database

Public Sub DisplayHyperlinkParts(ByVal strTable As String, _
                                 ByVal strField As String, _
                                 ByVal strDBLoc As String)
    
    Dim rst As New ADODB.Recordset
    Dim Str As String
    Dim objShell As Object
        
        Set objShell = CreateObject("Shell.Application")
        Str = strDBLoc & "" _
            & HyperlinkPart((strField), acDisplayedValue)
        objShell.ShellExecute Str, "", "", "print", 1
  
End Sub


Er is dus nog wel wat fine tune werk te doen, maar het belangrijkste is er! Dank voor jullie hulp!

[ Voor 22% gewijzigd door Rupie op 20-06-2009 20:41 ]

Desktop | Server | Laptop

Pagina: 1