meerdere on error go to ... statements gebruiken

Status
Niet open voor verdere reacties.

miso1995

Gebruiker
Lid geworden
25 mei 2018
Berichten
87
Goedemiddag,

Ik heb er weer eentje.
Wij maken gebruik van Nitro pdf en helaas heeft nitro wat moeite met folder level javascripts, dus vandaar dat we nu een excel oplossing gebruiken.
Als een gebruiker het formulier heeft afgerond, klikt ie op de pdf knop en dan schrijft ie een pdf naar C:/Temp

Om te voorkomen dat daar honderden pdfjes komen te staan, waarvan de gebruiker niks weet, wil ik de mogelijkheid creeeren om maximaal 5 tot 10 pdfjes te kunnen genereren, zonder dat je de pdfs die open zijn, hoeft te sluiten.

Vanuit Nitro hoeft het formulier namelijk alleen maar samengevoegd te worden met het document wat open staat. Het formulier is dus na samenvoegen niet meer nodig.

Maar ja als het formulier al geopend is in nitro en de gebruiker drukt nog een keer op die knop. Dan geeft ie een foutmelding. Dus gebruik ik een on error statement. 1 maal werkt dat prima, maar 2 maal lukt niet. Ik gebruik de volgende code:
Code:
Public Sub SavePDF()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("TM Legal")
    ws.PageSetup.PrintArea = ws.Range("PrintAreaA").Address
    Bestandsnaam = "TempLegalTM"
    Bestandsnaam2 = "TempLegalTM2"
    Bestandsnaam3 = "TempLegalTM3"
    Bestandsnaam4 = "TempLegalTM4"
    Bestandsnaam5 = "TempLegalTM5"
    PathOnly = "C:\Temp\"
    Path = PathOnly & Bestandsnaam
    Path2 = PathOnly & Bestandsnaam2
    Path3 = PathOnly & Bestandsnaam3
    Path4 = PathOnly & Bestandsnaam4
    Path5 = PathOnly & Bestandsnaam5
    On Error GoTo Error_Handler:
    ActiveWorkbook.Sheets("TM Legal").ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=Path, _
        ignoreprintareas:=False, openafterpublish:=True
    Exit Sub
Error_Handler:
On Error GoTo Error_Handlerr:
    ActiveWorkbook.Sheets("TM Legal").ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=Path2, _
        ignoreprintareas:=False, openafterpublish:=True
    Exit Sub
Error_Handlerr:
    ActiveWorkbook.Sheets("TM Legal").ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=Path3, _
        ignoreprintareas:=False, openafterpublish:=True
    Exit Sub
End Sub

Na het uitvoeren van de code als de eerste 2 pdfs open staan, krijg ik de volgende foutmelding:
runtime error document not saved.PNG

En hij piept hier als ik hem debug:
enhierpieptie.PNG

Hartelijk dank voor degene met de oplossing.

Groetjes,

Michel
 
Vertel eens:

wat is het verschil tussen:

Code:
   Set ws = ThisWorkbook.Sheets("TM Legal")
en
Code:
   ActiveWorkbook.Sheets("TM Legal")
 
Daar is geen verschil in.
Maar dat zal toch niet het probleem oplossen?
 
Okee. De nieuwe code:
Code:
Public Sub SavePDF()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("TM Legal")
    ws.PageSetup.PrintArea = ws.Range("PrintAreaA").Address
    Bestandsnaam = "TempLegalTM"
    Bestandsnaam2 = "TempLegalTM2"
    Bestandsnaam3 = "TempLegalTM3"
    Bestandsnaam4 = "TempLegalTM4"
    Bestandsnaam5 = "TempLegalTM5"
    PathOnly = "C:\Temp\"
    Path = PathOnly & Bestandsnaam
    Path2 = PathOnly & Bestandsnaam2
    Path3 = PathOnly & Bestandsnaam3
    Path4 = PathOnly & Bestandsnaam4
    Path5 = PathOnly & Bestandsnaam5
    On Error GoTo Error_Handler
    ws.ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=Path, _
        ignoreprintareas:=False, openafterpublish:=True
    Exit Sub
Error_Handler:
On Error GoTo Error_Handlerr
    ws.ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=Path2, _
        ignoreprintareas:=False, openafterpublish:=True
    Exit Sub
Error_Handlerr:
    ws.ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=Path3, _
        ignoreprintareas:=False, openafterpublish:=True
    Exit Sub
End Sub
 
Ben je bekend met lussen ?

Code:
for j=1 to 5
   msgbox "C:\Temp\TempLegal" & j
next
 
Ik ben bekend met lussen, maar ik wil geen 5 bestanden hebben.
Ik wil het enkel dummyproof maken.

Als je de macro draait wanneer het bestand openstaat, krijg je een foutmelding. Je kan geen bestand creeren wat al open is. Als ie niet geopend is, wordt het bestand gewoon overschreven.
Maar ik wil het mogelijk maken om bij een foutmelding het volgende bestand te creeren en daarna de code weer af te breken.

Als dat met een slimme lus kan, ben ik daar uiteraard voorstander van.
Maar is het dan mogelijk om bij een succesvolle aanmaak, de procedure te stoppen en anders naar de volgende te gaan?

Heb nu dit geprobeerd, maar dat werkt niet. Mooie is wel dat er in ieder geval geen foutmelding komt.

Code:
Public Sub SavePDF()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("TM Legal")
    ws.PageSetup.PrintArea = ws.Range("PrintAreaA").Address
    Bestandsnaam = "TempLegalTM"
    PathOnly = "C:\Temp\"
    For j = 1 To 5
    On Error Resume Next
    Path = PathOnly & Bestandsnaam & j
    ws.ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=Path, _
        ignoreprintareas:=False, openafterpublish:=True
    Exit Sub
    Next
End Sub


Volgorde van de On Error Resume Next maakt geen fluit uit.

Any suggestions?
 
Ben je bekend met het gebruik van With ... End With ?
 
Ja, maar dat is toch enkel om wat eigenschappen mee te geven aan een object?
Ik zie even niet hoe ik daar het probleem mee kan oplossen.

Vind het overigens wel goed hoor dat je met hints komt, zodat ik zelf getriggerd wordt om na te denken over een oplossing.
Zo leer ik er het meeste van.

Maar hoe zou het dan wel kunnen werken?
Bijgevoegd een voorbeeld bestand.

Alvast bedankt
 

Bijlagen

Laatst bewerkt:
Het gaat mij om de leesbaarheid en het vermijden van overbodigheden (zoals zinloze variabelen):

Code:
Sub M_snb()
  with ThisWorkbook.Sheets("TM Legal")
    .PageSetup.PrintArea = .Range("PrintAreaA").Address
  
    For j = 1 To 5
      .ExportAsFixedFormat 0, "C:\Temp\TempLegalTM" & j,0
    Next
  end with
End Sub
 
Code werkt wel, dank. Dit is idd leesbaarder.

Echter de code leidt tot het aanmaken van 5 pdf's
uitkomst.PNG

Het idee is dat als je hem print dat er 1 exemplaar opent, maar als ik het bestand open heb en ik wil nog een keer klikken, dan geeft ie een foutmelding.
Voor mij is dat geen probleem. Ik weet dat het zo werkt, maar de mensen die hem gebruiken zijn dan geneigd te klagen, dat ie na 1 keer stuk is.

Als het mogelijk zou zijn om hem naar pdf te printen zonder dat ie opgeslagen wordt, zou het geen probleem zijn.
Dan zou je een tijdstempel kunnen toevoegen in de naam.

Maar dat is het hem juist, hij moet ergens opgeslagen worden. Een unieke naam leidt tot een volle schijf.

Ik ben dus op zoek naar een code die hem eerst probeert op te slaan als "naam 1", als dat niet lukt "naam 2" als dat niet lukt "naam 3". Enzovoort. En dan maximaal 5 tot 10 bestanden. Elk bestand is namelijk ongeveer 120kb. En 1 gebruiker moet misschien wel 1000 keer per jaar dit formulier aanmaken, als het er niet meer dan dat zijn.

Dat de macro gaat piepen nadat men 10 documenten heeft open staan in Nitro, dat maakt natuurlijk niets uit. Kans dat een gebruiker zoveel tabbladen tegelijk open heeft staan, is beperkt. Want voor elk formulier, geldt dat het aangehecht moet worden aan een ander document. Dat betekent dat het andere document ook open moet staan. Na samenvoegen, blijven de bronbestanden ook geopend, maar opent het nieuwe samengevoegde document ook weer op een nieuw tabblad. Kortom 10 formulieren leidt tot 30 tabjes.
5 formulieren zou ook genoeg zijn, want dat leidt tot 15 tabjes, wat ook al onoverzichtelijk is. Maar ja 5 of 10 maakt niet zoveel uit. Het blijft hetzelfde trucje herhalen.
 
Erg helder vind ik je probleembeschrijving niet.
Maar mij lijkt dit sowieso voldoende:

Code:
Sub M_snb()
  c00="C:\Temp\TempLegalTM_001.pdf"

  with ThisWorkbook.Sheets("TM Legal")
    .PageSetup.PrintArea = .Range("PrintAreaA").Address
    if dir(c00)="" then .ExportAsFixedFormat 0, c00,0
  end with
End Sub
 
Ik begrijp nu waarom je het probleem niet begrijpt.
In jouw formule mist de statement
Code:
openafterpublish:=True
Overschrijven van het bestand is geen probleem. Graag zelfs.
Maar als het bestand open is en ik activeer de macro nogmaals, dan krijg je toch een foutmelding?
Die foutmelding is logisch. Want de macro probeert het bestand wat open is, te overschrijven.
Met behulp van
Code:
On Error GoTo Error_Handler
te gebruiken is het mogelijk om nogmaals een pdf te printen, maar dan niet als "TempLegalTM.pdf", maar als "TempLegalTM2.pdf".
Tot zover werkt het prima. Maar als ik dan een tweede
Code:
On Error GoTo Error_Handler
gebruik, werkt het niet. In mijn code van mijn eerste bericht is te zien dat ik direct na
Code:
Error_Handler
, de code
Code:
On Error GoTo Error_Handlerr
gebruik (ja de naam is nu anders, want ik gebruik nu 2 keer een r, ipv 1 x).
Ik zou verwachten dat ik hiermee "TempLegalTM3.pdf" zou genereren terwijl "TempLegalTM.pdf" en "TempLegalTM2.pdf" geopend zijn in Nitro PDF Editor, maar in de plaats daarvan krijg ik een foutmelding zoals te zien in de screenshot zoals aangehecht in bericht 1.

Is het probleem dan helder? Vandaar ook de titel: "meerdere on error go to ... statements gebruiken"

Alvast bedankt, en uiteraard een fijn weekend!
 
Werk je nog met floppy disks ofzo? 1000*120kb is niet zo heel veel voor 1 medewerker op jaarbasis. Waarom moet het bestand geopend worden?

Code:
if dir(c00)="" then .ExportAsFixedFormat 0, c00,0
Toetst toch of het bestand al bestaat?
 
1000*120kb is niet zo heel veel nee, maar er zijn meer van dit soort bestanden. De SSD's zijn bewust van een zeer beperkte omvang.
Het idee is als volgt.

Op het ene scherm een pdf, welke beoordeeld moet worden. Op het andere scherm het formulier in excel. Na het invullen, klik je op de pdf knop. Dan wordt ie in pdf geopend.
De bedoeling is dat die pdf vervolgens samengevoegd wordt met het pdfje dat is beoordeeld. Doordat ze beiden open staan, is nitro ideaal. Die heeft een combine knop voor open bestanden.
Na het samenvoegen zijn de bronbestanden niet meer relevant.

Bij meerdere pdf's om te beoordelen, ga je meerdere formulieren maken. En je hebt mensen die niet direct de tabbladen sluiten. Om die reden zoek ik naar deze mogelijkheid.

Betreffende code toetst of het bestand bestaat, maar niet of het open is.

En soms kan het antwoord nog veel meer voor de hand liggen.
In dit geval realiseer ik me net dat het al op te lossen zou zijn door een simpele if statement
Code:
Sub test()
If Range("test").Value = 10 Then
Range("test").Value = 0
Else
Range("test").Value = Range("test").Value + 1
End If

End Sub

Deze variabele opnemen in de bestandsnaam en dan zou het moeten werken.

Toch bedankt iedereen voor het meedenken en heb toch weer een paar extra codes geleerd.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan