• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Foutmelding in bestand dat met VBA wordt gesplitst

Status
Niet open voor verdere reacties.

Majelles

Gebruiker
Lid geworden
23 jan 2012
Berichten
41
Hallo,

Zou iemand willen meekijken naar mijn bestand?
Het is van mijn werk en gemaakt door iemand in Excel 2003 maar helaas krijgen we nu (overgang naar Office 2010) steeds foutmeldingen.
Het bestand splitst het hoofdbestand en zet daarna de bestanden in de mail in Outlook.
Ik heb divers pogingen gedaan om het te verkleinen naar 100 kb (wat wel heel erg klein is) maar met zip en rar kom ik niet kleiner dan 180 kb.
Ik kan daarom geen voorbeeld meesturen helaas.

Het splitsen gaat goed maar het mailen geeft foutmeldingen, geheel wisselend mailt hij maar 4 bestanden, als je het daarna nog een keer doet misschien wel 16 (van de 32). Maar nooit allemaal.

Foutmeldingen tijdens het overzetten van de bestanden naar outlook:

Run-time error 9

Subscrips out of range

en toen ik het nog een keer deed kreeg ik deze:

Error 1004

Application defined of object defined error

In VBA kreeg ik deze error (geel gemaakt in de gehele vba sheet omdat ik het niet kan meesturen).
Ik heb het hele stukje gevonden op het internet en vervangen en toch blijft de foutmelding.

Wie kan/wil mij helpen?
(ik het bestand ook naar je mailen als dat mag op dit forum)

Groetjes, Marielle

Code:
Sub MailSets()
   Dim oCell As Range
   'Make sure you change "Sheet1" below,
   'so it matches the name of the worksheet with email settings
   For Each oCell In Sheets("Email").UsedRange.Columns(1).Cells
       If oCell.Row > 1 Then
           'Skip first row; contains header
           If Not IsEmpty(oCell.Value) Then
              Mail_Selection Sheets(oCell.Value).Range(oCell.Offset(, 2).Value), oCell.Offset(, 1).Value
           End If
       End If
   Next
End Sub

Code:
Sub Mail_Selection(Source As Range, sTo As String)
'Working in 2000-2010
   Dim Dest As Workbook
   Dim wb As Workbook
   Dim TempFilePath As String
   Dim TempFileName As String
   Dim FileExtStr As String
   Dim FileFormatNum As Long
   Dim OutApp As Object
   Dim OutMail As Object

   If Source Is Nothing Then
       MsgBox "The source is not a range or the sheet is protected, " & _
              "please correct and try again.", vbOKOnly
       Exit Sub
   End If

   If ActiveWindow.SelectedSheets.Count > 1 Or _
      Source.Cells.Count = 1 Or _
      Source.Areas.Count > 1 Then
       MsgBox "An Error occurred :" & vbNewLine & vbNewLine & _
              "You have more than one sheet selected" & vbNewLine & _
              "or you only selected one cell" & vbNewLine & _
              "or you selected more than one area." & vbNewLine & vbNewLine & _
              "Please correct and try again.", vbOKOnly
       Exit Sub
   End If

   With Application
       .ScreenUpdating = False
       .EnableEvents = False
   End With

   Set wb = ActiveWorkbook
   Set Dest = Workbooks.Add(xlWBATWorksheet)
   Source.Copy
   With Dest.Sheets(1)
       .Cells(1).PasteSpecial Paste:=8
       .Cells(1).PasteSpecial Paste:=xlPasteAll
       .Cells(1).PasteSpecial Paste:=xlPasteFormats
       .Cells(1).Select
       Application.CutCopyMode = False
   End With

   TempFilePath = Environ$("temp") & "\"
   TempFileName = " ziekenlijst "

   If Val(Application.Version) < 12 Then
       'You use Excel 2000-2003
       FileExtStr = ".xls": FileFormatNum = -4143
   Else
       'You use Excel 2007-2010
       FileExtStr = ".xls": FileFormatNum = 51
   End If

   Set OutApp = CreateObject("Outlook.Application")
   Set OutMail = OutApp.CreateItem(0)

   With Dest
       .SaveAs TempFilePath & TempFileName & FileExtStr, _
               FileFormat:=FileFormatNum
       On Error Resume Next
       With OutMail
           .To = sTo
           .CC = ""
           .BCC = ""
           .Subject = "ziekenlijst"
           .BodyFormat = olFormatHTML
           .HTMLBody = "<p></p><br>" & _
           "<p><font size='2' face='Arial'>Beste collega's,</font></p><br>" & _
           "<hr />" & _
"<p><font size='2' face='Arial'>In de bijlage vind je de ziekenlijst van afgelopen week.</font></p><br>" & _
"<p><font size='2' face='Arial'>In deze lijst zijn alle ziek- en betermeldingen verwerkt ***.</font></p><br>" & _
"<p><font size='2' face='Arial'>Wanneer er sprake is van ***.</font></B></p><br>" & _
"<hr />" & _
"<p><font size='2' face='Arial'>Met vriendelijke groet,</font></p><br>" & _
"<font size='2' face='Arial'>***</font></p><br>" & _
"<p></p>" & _
"<p></p>" & _
"<p></p>" & _
"<font color='grey' size='1' face='Arial'>Deze e-mail is automatisch gegenereerd. Reacties kunt u sturen naar ***.</font><br>" & _
"<font color='grey' size='1' face='Arial'>Mail to: [email]***[/email] "



           .Attachments.Add Dest.FullName
           'You can add other files also like this
           '.Attachments.Add ("C:\test.txt")
           .Send   'or use .Display
       End With
       On Error GoTo 0
       .Close SaveChanges:=False
   End With

   Kill TempFilePath & TempFileName & FileExtStr

   Set OutMail = Nothing
   Set OutApp = Nothing

   With Application
       .ScreenUpdating = True
       .EnableEvents = True
   End With
End Sub
 
Laatst bewerkt door een moderator:
Staat de verwijzing in je VB editor aangevinkt , bij een overschakeling van Excel 2003 naar 2010 loopt het daar soms al eens fout .

open de editor klik daar op Extra dan op Verwijzing en kijk of Microsoft Outlook 14.0 object library is aangevinkt
 
link naar het bestand

Fijn dat jullie willen meekijken!

Ik heb het bestand opgeslagen bij mijnbestand (dank voor de tip Cobbe!), hier de link:

Trucker10, als hier (thuis) op klik dan slaat mijn laptop op hol en stopt met Excel er mee.
Ik ga hier morgen (op mijn werk) naar kijken.
Dank voor de tip.
 
Laatst bewerkt:
Een gewone foutafvanger schijnt voldoende te zijn, daarmee is wel de oorzaak niet weggenomen.
De code bleef hangen op Sameday wat dat ook mag betekenen.

Code:
Sub MailSets()
   Dim oCell As Range
   [B][/B][COLOR="#FF0000"]On Error Resume Next[/COLOR]
   'Make sure you change "Sheet1" below,
   'so it matches the name of the worksheet with email settings
   For Each oCell In Sheets("Email").UsedRange.Columns(1).Cells
       If oCell.Row > 1 Then
           'Skip first row; contains header
           If Not IsEmpty(oCell.Value) Then
               Mail_Selection Sheets(oCell.Value).Range(oCell.Offset(, 2).Value), oCell.Offset(, 1).Value
           End If
       End If
   Next
End Sub
 
Opties getest

Hallo Cobbe,

Ik heb het net getest maar ik krijg helaas maar 22 e-mails van de 37, heb je misschien nog een andere oplossing?

Trucker10; het vinkje staat aan dus dat is het helaas ook niet.

Iemand nog een idee om dit bestand werkend te krijgen?
 
Ik heb even gekeken, de On error Resume next is nooit een goede oplossing, je ziet dan geen enkele fout. Beter om alleen bepaalde fouten door te laten gaan.
Majelles, heb je 'm als een zonder attachments geprobeerd, om te zien of er dan weel 37 mails worden gemaakt? Het zou bijvoorbeeld kunnen dat de Kill al plaatsvindt voordat Outlook attachment gekoppeld heeft.
 
Vul in blad Email eens kolom C aan met de ontbrekende waardes A1:S150.
 
analoog aan renedirks, wacht 5 sec alvorens te killen
Code:
[COLOR="#FF0000"]Wait Now + TimeSerial(0, 0, 5)[/COLOR]
  Kill TempFilePath & TempFileName & FileExtStr
 
Waarom niet eenvoudig met alleen deze code:

Code:
Sub MailSets()
   c00= "<p></p><br><p><font size='2' face='Arial'>Beste collega's,</font></p><br><hr />" & _
 "<p><font size='2' face='Arial'>In de bijlage vind je de ziekenlijst van afgelopen week (wanneer in SAP afgelopen week de payrolrun is geweest ontvang je de lijst over de afgelopen twee weken).</font></p><br>" & _
"<p><font size='2' face='Arial'>In deze lijst zijn alle ziek- en betermeldingen verwerkt tot ongeveer een uur voor verzending van deze email.</font></p><br>" & _
"<p><font size='2' face='Arial'>Wanneer er sprake is van een lopend ziektegeval wordt einddatum 31-12-9999 vermeld.</font></B></p><br>" & _
"<hr /><p><font size='2' face='Arial'>Met vriendelijke groet,</font></p><br>" & _
"<font size='2' face='Arial'>HR Support</font></p><br><p></p><p></p><p></p>" & _
"<font color='grey' size='1' face='Arial'>Deze e-mail is automatisch gegenereerd. Reacties kunt u sturen naar het HRSO team.</font><br>" & _
"<font color='grey' size='1' face='Arial'>Mail to:[email]hrso.express@dhl.com[/email] "

  For Each cl In Sheets("Email").Columns(1).SpecialCells(2)
    If cl.Row > 1 Then
      Sheets(cl.Value).Copy
      ActiveWorkbook.SaveAs ThisWorkbook.Path & "\nieuw.xlsx", 51
      ActiveWorkbook.Close 0
         
      With CreateObject("Outlook.Application").CreateItem(0)
        .To = cl.Offset(, 1).Value
        .Subject = "ziekenlijst"
        .HTMLBody = c00
        .Attachments.Add ThisWorkbook.Path & "\nieuw.xlsx"
        .Send
      End With
    End If
  Next
End Sub

Maar het lijkt me nog simpeler om een kopie van het totale werkboek te maken en daaruit de werkbladen te verwijderen die niet verstuurd hoeven te worden.
Dan hoeft er maar 1 email met 1 bijlage verstuurd te worden.
 
Laatst bewerkt:
Bedankt voor jullie reacties!

ReneDikrs; ik heb gekeken maar heb geen idee hoe ik ze verzend zonder bestanden.

Cobbe; dat is scherp gezien! En ik heb er nu 33 van de 36 dus het gaat de goede kant op ;-)
Heel erg bedankt!!!!

Cow18; ik krijg een foutmelding als ik dat erbij zet; Compile error, sub or function not defined

SNB; ik heb alles weggehaald en dat van jou eringeplakt maar na 4 bestanden stopt hij er mee.
 
Majelles: uitschakelen attachments: even een apostrofje voor deze regel zetten:
Code:
' .Attachments.Add Dest.FullName
 
Nog een subvraagje over dit bestand, mag dat onder dit topic?

De mail heet nu "ziekenlijst" is het ook mogelijk om hem "ziekenlijst met naam van het bestand" te noemen?
 
Je bedoelt het onderwerp? Ja, da's niet zo'n probleem. In deze regel staat het subject
Code:
.Subject = "ziekenlijst"
 
ReneDirks, bedankt voor de tip van de ', het versturen met of zonder bestanden maakt niet uit (alleen de snelheid van maken van de mailtjes ;-)

Subvraag; die code staat er zo al in; het zou voor ons heel handig zijn als ook de naam van de sheet die verzonden wordt in het subject kan komen.
Maar misschien is dat niet mogelijk.
 
Ik bedoelde dus dat je die regel moest aanpassen. Maar ik begrijp nu dat je niet zoveel van VBA af weet, sorry.

Ik neem aan dat je met de naam dan 'ziekenlijst week 32' (uiteraard variabel) bedoelt? De naam van het tijdelijke bestand is volgens mij altijd 'ziekenlijst' als ik het zo 1-2-3 bekijk.
 
Mijn eenvoudigste suggestie vertaald in VBA:
NB. zet deze macro in een macromodule

Code:
Sub M_snb()
  Application.displayalerts=false
c00 = "<p></p><br><p><font size='2' face='Arial'>Beste collega's,</font></p><br><hr />" & _
 "<p><font size='2' face='Arial'>In de bijlage vind je de ziekenlijst van afgelopen week (wanneer in SAP afgelopen week de payrolrun is geweest ontvang je de lijst over de afgelopen twee weken).</font></p><br>" & _
"<p><font size='2' face='Arial'>In deze lijst zijn alle ziek- en betermeldingen verwerkt tot ongeveer een uur voor verzending van deze email.</font></p><br>" & _
"<p><font size='2' face='Arial'>Wanneer er sprake is van een lopend ziektegeval wordt einddatum 31-12-9999 vermeld.</font></B></p><br>" & _
"<hr /><p><font size='2' face='Arial'>Met vriendelijke groet,</font></p><br>" & _
"<font size='2' face='Arial'>HR Support</font></p><br><p></p><p></p><p></p>" & _
"<font color='grey' size='1' face='Arial'>Deze e-mail is automatisch gegenereerd. Reacties kunt u sturen naar het HRSO team.</font><br>" & _
"<font color='grey' size='1' face='Arial'>Mail to: hrso.express@dhl.com "

   sn = ThisWorkbook.Sheets("Email").UsedRange.Columns(1)
   ThisWorkbook.SaveAs ThisWorkbook.Path & "\nieuw.xlsm", 52
   For Each sh In Sheets
       If IsError(Application.Match(sh.Name, sn, 0)) Then sh.Delete
   Next
   
    With CreateObject("Outlook.Application").CreateItem(0)
        .To = cl.Offset(, 1).Value
        .Subject = "ziekenlijst"
        .HTMLBody = c00
        .Attachments.Add ThisWorkbook.FullName
        .Send
    End With
End Sub
 
ReneDirks; geen probleem, ik heb inderdaad geen kennis van VBA, ik doe mijn best jullie aanwijzingen op te volgen ;-)

Het zou geweldig zijn als ze ziekenlijst én de naam van hun bestand kunnen krijgen zoals "ziekenlijst DD Roosendaal"
 
Ok. Naam van het bestand is dus naam van de Worksheet?
 
Wellicht makkelijker om even 'fris' te beginnen. Wat wil je precies bereiken met het bestand? Dat wil zeggen: ik zie nu een workbook met een partij tabbladen.
Ik neem aan dat op pagina 'Email' de email adressen staan voor de diverse afdelingen die hun eigen tabblad hebben. Is et nu uiteindelijk de bedoeling dat ieder adres wat daar staat het 'eigen' tabblad krijgt?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan