Rapporten opslaan in ZIP bestand en versturen via e-mail

Status
Niet open voor verdere reacties.

pirlo22

Gebruiker
Lid geworden
28 okt 2009
Berichten
6
Hoi allen,

Ik ben bezig met het schrijven van een programma waarbij het volgende wordt uitgevoerd: Op basis van een Excel lijst wordt een template geopend en wordt er een artikelnummer in die template geplakt. Vervolgens worden de templates opgeslagen in een map (op basis van bestelnummer) en moeten de templates aan een zip bestand worden toegevoegd. Als laatste moet het zip bestand naar een e-mailadres worden verstuurd.

Er zijn twee problemen bij het programma dat ik geschreven heb:

1. Niet alle templates worden toegevoegd aan het zip bestand. Ik zie in de map bijvoorbeeld 10 templates staan en in het zip bestand zitten er vervolgens maar 9. Op de een of andere manier wordt het laatste artikelnummer uit de loop overgeslagen bij het toevoegen aan het zip bestand.

2. Als ik het zip bestand wil toevoegen aan de e-mail dan lijkt het alsof dit goed gaat (in de bijlage zie ik een zip bestand met de goede naam), alleen is het bestand leeg. Hij voegt dus geen inhoud aan het zip bestand toe. Hieronder mijn code:

Code:
Sub Rapporten()

Dim Artikelnummer As String
Dim Artikelnummer_def As String
Dim Artikelnummer2 As String
Dim Bestelnummer As String
Dim Bestelnummer_def As String
Dim Crediteurnr As String
Dim Crediteurnaam As String
Dim Mapnaam As String
Dim Mapnaam_def As String
Dim Bestandsnaam As String
Dim Aantal As Integer
Dim Aantal_def As String
Dim Template_Elektra As Workbook
Dim Database_Elektra As Workbook
Dim objOL As Object
Dim Sender As String
Dim StrDate As String
Dim Emailadres As String
Dim Emailadres_def As String
Dim EmStart As String
Dim strDestFileName As String
Dim strSourceFileName As String
Dim str7ZipPath As String
Dim strPassword As String
Dim strCommand As String
Dim Bijlage As String
Dim Counter As Integer

Sender = "bmvnk@hotmail.com"

Set fs = CreateObject("scripting.filesystemobject")

cnt = 0
nr = 0

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Set currentWb = ThisWorkbook
Set Template_Elektra = Workbooks.Open("G:\Quality_Report_Electra.xls", True, True)
Set Database_Elektra = Workbooks.Open("G:\Kwaliteitsdatabase Electra Verre Oosten.xls", True, True)

With currentWb.Worksheets(1)

Counter = 0

  Do While currentWb.Worksheets(1).Cells(2 + cnt, 3).Value <> "Einde"
  
        Artikelnummer = currentWb.Worksheets(1).Cells(2 + cnt, 3).Value
        
        If Artikelnummer <> "" Then
  
        'Hier worden de e-mailadressen opgehaald uit de database
        
        Do While Database_Elektra.Worksheets(1).Cells(3 + nr, 2).Value <> ""

            Artikelnummer2 = Database_Elektra.Worksheets(1).Cells(3 + nr, 2).Value
            Emailadres = Database_Elektra.Worksheets(1).Cells(3 + nr, 8).Value

                If Artikelnummer2 = Artikelnummer Then

                    'Hier wordt het e-mailadres uit de text gefilterd zodat de string alleen het e-mailadres bevat

                    Emailadres_def = InStr(1, Emailadres, "@")
                    EmStart = InStrRev(Emailadres, " ", Emailadres_def)

                    If EmStart = 0 Then EmStart = 1
                    EmEnd = InStr(Emailadres_def, Emailadres, " ")
                    If EmEnd = 0 Then EmEnd = Len(Emailadres) + 1

                    mailid = Trim(Mid(Emailadres, EmStart, EmEnd - EmStart))

                    If Right(mailid, 1) = "." Then
                    Getmailid = Left(mailid, Len(mailid) - 1)
                    Else
                    Getmailid = mailid
                    End If

                    If currentWb.Worksheets(1).Cells(1 + cnt, 1).Value <> "" Then

                        currentWb.Worksheets(1).Cells(2 + cnt, 7).Value = mailid

                    End If

                    nr = 0

                    Exit Do

                Else

                End If


            nr = nr + 1

        Loop
        
        'Hier wordt gecontroleerd of er een artikelnummer in het veld staat of een crediteurnaam. Als er geen punt wordt gevonden is het een crediteurnaam, anders een artikelnummer.
        
        If currentWb.Worksheets(1).Cells(2 + cnt, 3).Value <> "" Then
        
            If InStr(Artikelnummer, ".") = 0 Then
            
                Crediteurnaam = Artikelnummer
            
            Else
            
                Artikelnummer_def = Artikelnummer
            
            End If
            
        Else
        
            Exit Do
        
        End If
        
        'Hier wordt het Crediteur en Bestelnummer opgehaald zodat deze straks kunnen worden gebruikt bij het opslaan van het rapport.
        
        If currentWb.Worksheets(1).Cells(2 + cnt, 1).Value <> "" Then
        
            Crediteurnr = currentWb.Worksheets(1).Cells(2 + cnt, 1).Value
        
        End If
        
        If currentWb.Worksheets(1).Cells(2 + cnt, 2).Value <> "" Then
        
            Bestelnummer = currentWb.Worksheets(1).Cells(2 + cnt, 2).Value
        
        End If
        
        'Daarna worden de controle aantallen in kolom C gezet
        
        Aantal = currentWb.Worksheets(1).Cells(2 + cnt, 4).Value
        Aantal = Replace(Aantal, ".", "")
        
        If Aantal >= 2 And Aantal < 16 Then
        
            Cells(2 + cnt, 5).Value = "2"
            
        ElseIf Aantal >= 16 And Aantal < 51 Then
        
            Cells(2 + cnt, 5).Value = "3"
        
        ElseIf Aantal >= 51 And Aantal < 151 Then
        
            Cells(2 + cnt, 5).Value = "5"
        
        ElseIf Aantal >= 151 And Aantal < 501 Then
        
            Cells(2 + cnt, 5).Value = "8"
        
        ElseIf Aantal >= 501 And Aantal < 3201 Then
        
            Cells(2 + cnt, 5).Value = "13"
        
        ElseIf Aantal >= 3201 And Aantal < 35001 Then
        
            Cells(2 + cnt, 5).Value = "20"
        
        ElseIf Aantal >= 35001 And Aantal < 500001 Then
        
            Cells(2 + cnt, 5).Value = "32"
        
        ElseIf Aantal > 500001 Then
        
            Cells(2 + cnt, 5).Value = "50"
        
        End If
        
        'De crediteurnaam en nummer worden aan elkaar geplakt zodat dit de totale naam van de map vormt.
        
        Mapnaam = Crediteurnaam + " " + Crediteurnr
        
        Aantal_def = currentWb.Worksheets(1).Cells(2 + cnt, 5).Value
        
        StrDate = Format(Now, "dd-mm-yyyy")
        
        'Plak de waarden artikelnummer en controle aantal in de rapport template
        
        Template_Elektra.Worksheets(1).Cells(6, 10).Value = Artikelnummer_def
        Template_Elektra.Worksheets(1).Cells(8, 10).Value = Aantal_def
        Template_Elektra.Worksheets(1).Cells(2, 10).Value = StrDate
        
        'Hier wordt gecontroleerd of de crediteurmap al bestaat. Zo niet, dan wordt de map aangemaakt
        
        Mapnaam_def = "G:\" + Mapnaam + "\"

        If Len(Dir("G:\" + Mapnaam, vbDirectory)) = 0 Then
        
           MkDir "G:\" + Mapnaam
           
        End If
        
        'Hier wordt het rapport opgeslagen in de juiste map
        
        If Artikelnummer_def <> "" Then
        
            Bestandsnaam = Mapnaam_def + " " + Bestelnummer + " " + Artikelnummer_def + " " + "Quality Report Electra D.v.D" & ".xls"
            
            Template_Elektra.SaveAs fileName:=Bestandsnaam, FileFormat:=xlNormal
        
        End If
        
        'De onderstaande code zorgt ervoor dat de naam van het zip bestand en het pad alvast in een veld worden gezet
        
        Do While Counter < 1
        
            currentWb.Worksheets(1).Cells(3 + cnt, 8).Value = Mapnaam_def + Bestelnummer + ".zip"
            
            Bijlage = currentWb.Worksheets(1).Cells(3 + cnt, 8).Value
            
            Counter = Counter + 1
        
        Loop
        
        Else
        
        'Hier worden de verschillende rapporten opgeslagen in één zip bestand per bestelnummer
            
            strDestFileName = Mapnaam_def + Bestelnummer + ".zip"
            strSourceFileName = Mapnaam_def
            str7ZipPath = "C:\Program Files\7-Zip\7z.exe"
            strPassword = "test123"
            
            strCommand = str7ZipPath & " a -tzip """ & strDestFileName & """ """ & strSourceFileName & """"
            
            Shell strCommand
            
            'De onderstaande regel gebruikt een wachtwoord voordat iemand het zip bestand kan uitpakken
            'strCommand = str7ZipPath & " -p" & strPassword & " a -tzip """ & strDestFileName & """ """ & strSourceFileName & """"
            
            
            'Artikelnummer wordt hier op leeg gezet, omdat het laatste artikelnummer anders bij het volgende bestelnummer wordt meegenomen
            Artikelnummer_def = ""

            'Hier wordt het rapport als bijlage toegevoegd aan de mail en verstuurd naar het bijbehorende e-mailadres
            
            Set olApp = CreateObject("Outlook.Application")
            Set olMail = olApp.CreateItem(olMailItem)

            With olMail
                        .SentOnBehalfOfName = "Peter Stultiens"
                        .To = "" + mailid + ""
                        .Subject = "Reports for ordernumber " + Bestelnummer
                        .Body = "In the attachment you fill find the quality reports for ordernumber " + Bestelnummer + " ."
                        .Attachments.Add Bijlage
                        .Send
            End With

            Set olApp = Nothing
            
            Counter = 0
            
        End If
        
        cnt = cnt + 1
        
        nr = 0
        
  Loop
  
End With

Template_Elektra.Close False
Set Template_Elektra = Nothing

Database_Elektra.Close False
Set Database_Elektra = Nothing

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
  
End Sub

Hopelijk kunnen jullie me helpen, alvast bedankt!
 
Lijkt mij handiger als je er wat voorbeeldjes bij doet, dan hoeven we niet zoveel over te tikken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan