Meerdere sheets selecteren om zelfde pdf te krijgen&verzenden mail

Status
Niet open voor verdere reacties.

Penning1

Gebruiker
Lid geworden
22 sep 2011
Berichten
15
Beste allen,

Achtergrond: beginnend VBA gebruiker. Zelfstudie door internet en dit forum.
Ik zit met het volgende issue waar ik niet uitkom. Ik heb een VBA code aangemaakt (gekopieerd vanuit deze site) welke er netjes voor zorgt dat mijn actieve werksheet als een pdf wordt toegevoegd aan mijn mail. Met een juiste benaming.
Maar hoe kan ik nu meerdere tabbladen/sheets hierin benoemen dat deze deel uitmaken van mijn zelfde pdf? Dus als 1 pdf wordt gemaakt (geen apart pdf blad). Ik zit op het vermoeden met sheets.array maar ik heb geen benul hoe ik deze verwijzing erin verwerk en waar in de code. Laten voor de duidelijkheid de tabbladen de benaming "Dashboard" en "werkuren" benoemen die ik wil toevoegen. Vindt hieronder mijn huidige code die ik nu gebruik en dus enkel alleen goed gaat voor de actieve werksheet.

Optioneel:
- Hoe kan ik dit pdf bestand ook meteen laten opslaan met dezelfde benaming; Update - <datum>. En keuze voor welke directory? Mapnaam automatisch zoeken en vinden adhv benaming in excel sheet?

Hopelijk kan iemand me hierin verder helpen. Bij voorbaat dank!

Code:
Sub Knop511_Klikken()
Dim Bestand As String
    Dim OutApp As Object
    Dim OutMail As Object
    
    Bestand = Environ("TEMP") & "\" & ActiveSheet.Name & " - " & Range("V3") & ".pdf"
    ActiveSheet.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=Bestand
    
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    With OutMail
        .to = Range("Q12").Value
        .CC = Range("W12").Value
        .BCC = ""
        .Subject = Range("b3").Value
        .Body = Range("Q22").Value
        .Attachments.Add Bestand
        .Display
    End With
    Kill Bestand
End Sub
 
Beste Ahulpje,

Update:
Ik kom erachter dat wanneer eenmaal de map is aangemaakt bij Folderpath, dat de code daarna een foutcode geeft, omdat deze map dan al bestaat en de code niet nogmaals kan worden uitgevoerd. Hoe voorkom ik dit?
================================
Update:
Ik ben zo ver dat de code vanuit de link werkt. Het werkt nu zo dat er pdf's uit meerdere excel tabs in een pdf terecht komen en deze in een bepaalde directory terecht komen. (ik was blijkbaar vergeten aan te geven dat ik een nieuwe bestandsmap moest aanmaken).
Maar dan blijf ik vastzitten bij het volgende; hoe EN waar in bovenstaande code krijg ik deze nu verwerkt, dat deze in een mail terecht komen?
=============================
Dank u voor je reactie en link. Deze heb ik nu meerdere keren doorgelezen en zelfs 1 op 1 ingekopieerd in een nieuwe VBA code (natuurlijk wel de directories and tabblad benamingen aangepast), maar ik krijg telkens een foutcode 75 (zie ook bijgevoegde afbeelding. Dus ik vraag me af wat hier nu precies verkeerd gaat.
Tevens ben ik ook benieuwd hoe ik de VBA code waarin ik verschillende tabbladen in 1 pdf kan krijgen, waar ergens in mijn eerdere VBA code hierboven (in mijn 1e bericht) moet inpassen. Helaas houdt mijn VBA kennis daar ergens op. Dus hoor het graag hoe ik dit krijg opgelost.
Capture.JPG
 
Laatst bewerkt:
Je hoeft maar één regeltje toe te voegen in je oorspronkelijke code:
Code:
    Bestand = Environ("TEMP") & "\" & ActiveSheet.Name & " - " & Range("V3") & ".pdf"
[COLOR=#ff0000]    Sheets(Array("Overview", "Data")).Select[/COLOR]
    ActiveSheet.ExportAsFixedFormat _
 
Beste Ahulpje;

As simple as that! Het werkt! dank u hiervoor. Nogmaals, mijn kennis in VBA moet nog groeien.

Nog dan nog het optionele gedeelte van de code: hoe bouw ik er nu in dat dit pdf-bestand dan ook meteen wordt opgeslagen in directory "C:\PROJECTS\<<zoek naam project>>\Updates\<<naam pdf>>. En wordt deze dan overschreven mocht men deze vaker op een dag versturen en/of de code laten werken?
 
Een kleine wens kan tot vele vragen leiden:

"C:\PROJECTS\<<zoek naam project>>\Updates\

  • Is bovenstaande de map waarin het PDF document moet worden opgeslagen?
  • Bestaat die map of moet die worden aangemaakt?
  • Of moet het PDF document worden opgeslagen in dezelfde map waarin het Exceldocument staat?
  • Welke naam heeft het Exceldocument?
  • Is de projectnaam hetzelfde als de naam van het Exceldocument?
  • Of staat de projectnaam ergens in het Exceldocument?
  • Mag het PDF document worden overschreven?
 
2 vliegen in 1 klap.
Vermijd overbodige (object) variabelen
vermijd overbodige interaktie (lezen/schrijven) met een werkblad
vermijd een overbodige ingewikkelde (sub)directorystruktuur.
De gegevens in het werkblad, die je in deze macro gebruikt kunnen veel eenvoudiger in een aaneengesloten gebied in het wrkbald gezet worden bijv. Z1:Z5 in plaats van V3, W22, Q12, Q22, B3, etc.

Code:
Sub Knop511_Klikken()
    sn = sheet1.usedrange
    c00= "C:\PROJECTS\" & sheet1.name & sn(3,22) & format(now,"hh_mm.p\df")[COLOR=#ff0000]
    
    [/COLOR]Sheets(Array("Overview", "Data")).ExportAsFixedFormat 0, c00[COLOR=#ff0000]
[/COLOR]
    with CreateObject("Outlook.Application").CreateItem(0)
       .to = sn(12,17)
       .CC = sn(12,23)
       .Subject = sn(3,2)
       .Body = sn(22,17)
       .Attachments.Add c00
       .Send
    End With
End Sub
 
Laatst bewerkt:
Als reactie op Ahulpje:

"C:\PROJECTS\<<zoek naam project>>\Updates\

Is bovenstaande de map waarin het PDF document moet worden opgeslagen? >> Ja
Bestaat die map of moet die worden aangemaakt? >> Map bestaat al. Moet alleen worden opgezocht tussen de 'projects'.
Of moet het PDF document worden opgeslagen in dezelfde map waarin het Exceldocument staat? >> JA
Welke naam heeft het Exceldocument? >> Andere naam; <<projectnaam - Productielijst & <<datum>>, als voorbeeld: 'GROLSCH VESTE - Productielijst (29-09-2023).xlsm'
Is de projectnaam hetzelfde als de naam van het Exceldocument? >> JA
Of staat de projectnaam ergens in het Exceldocument? >> Ja, ook. Dus kan worden gerefereerd.
Mag het PDF document worden overschreven? >> Ja, alleen op dezelfde dag wordt opgeslagen. Dus de dag erna moet dus een nieuwe 'Update' met nieuwe datum.

Hopende u hiermee enigszins duidelijkheid mee te hebben verschaft. Ik hoor graag van u.
 
Als reactie op snb:

Dank u voor uw hulp.
Voor de duidelijkheid: 2 vliegen 1 klap: u bedoelt hier dat het bestand/sheets in een pdf worden toegevoegd EN het bestand zodanig wordt opgeslagen in een betreffende (nader te noemen) map?
Ik heb uw code gekopieerd en ingevoerd. ik krijg echter al een foutcode/-melding bij 'sn = sheet1.usedrange'
En als lerende: wat geven de cijfers achter de 'sn' aan? Zoals sn(12,17)?
Nogmaals, ik tracht hier ook van te leren en te begrijpen wat ik aan het doen ben.
Dank u.
 
Verwijder 'option Explicit'.

controleer of de codename van het werkblad 'sheet1' is; eventueel vervangen door ' Blad1'.
Melden van een fout is zinloos, melden welke fout is zinvol.
 
Laatst bewerkt:
Met "vermijd overbodige interaktie (lezen/schrijven) met een werkblad" bedoelt snb dat je zo weinig mogelijk aan cellen of ranges refereert omdat dat trager is dan eerst een kopie van het werkblad in het geheugen halen en daarmee verder werken en later eventueel terugplaatsen.
In jouw specifiek geval is dat niet nodig en zelfs verwarrend.
sn(12,17) is de cel op rij 12, kolom 17, even tellen: oh ja, dat is cel Q17.
En waarom je geen Option Explicit zou moeten gebruiken is mij een raadsel, ik zie alleen maar voordelen, maar misschien kan snb uitleggen wat de nadelen zijn?

En voor de PDF export zoiets, als in V3 de datum staat:
Code:
Bestand = Thisworkbook.Path & "\Updates\" & ActiveSheet.Name & " - " & Range("V3") & ".pdf"
 
@Ahul

Als je mijn bericht goed leest, zie je meteen wat de oorzaak van de foutmelding bij de TS kan zijn.
 
Er is niks mis met Option Explicit. Het niet declareren van variabelen kan bovendien foutmeldingen veroorzaken.
Om maar een voorbeeld te geven; run onderstaande eens met declaratie en daarna zonder.

Code:
Sub jec()
 Dim r As Range, it
 For Each it In Range("A1:A4")
   If r Is Nothing Then
     Set r = it
   Else
     Set r = Union(r, it)
   End If
 Next
End Sub
 
Het overbodig declareren van variabelen kan fouten veroorzaken.

Code:
Sub M_overbodig()
   Dim y As Integer
   y = Rows.Count
End Sub

Code:
Sub M_voldoende()
   y = Rows.Count
End Sub
 
Tsja, dat is logisch als je hier kiest voor integer
 
Hoezo logisch ?

In cel A1:
PHP:
=INT(ROWS(A:A))
 
We hebben het over VBA toch?
 
Code:
Sub M_snb()
   MsgBox Int(Rows.Count)
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan