vba outlook salvar anexos no formato csv

0

Estou tentando salvar um anexo de planilha no formato CSV.

Eu posso acionar o processo quando um anexo de planilha é encontrado, mas estou tendo dificuldade em combiná-lo com um script de conversão que aceita dois argumentos.

saving an attachement

Public Sub saveAttachToDiskcvs(itm As Outlook.MailItem) 

 ' --> Settings. change to suit
Const MASK = "Olus" ' Value to be found
Const SHEET = "sheet2" ' Sheet name or its index where to find
 ' <--

 ' Excel constants
Const xlValues = -4163, xlWhole = 1, xlPart = 2 

 ' Variables
Dim objExcel As Object, IsNew As Boolean, x As Object 
Dim objAtt As Outlook.Attachment 
Dim saveFolder As String, sFileName As String, sPathName As String 
saveFolder = "C:\form" 

If Not TypeName(itm) = "MailItem" Then Exit Sub 
If Dir(saveFolder, vbDirectory) = "" Then MkDir saveFolder 

 ' Get/Create Excel object
On Error Resume Next 
Set objExcel = GetObject(, "Excel.Application") 
If Err Then 
    Err.Clear 
    IsNew = True 
    Set objExcel = CreateObject("Excel.Application") 
End If 
objExcel.FindFormat.Clear 

 ' Main
For Each objAtt In itm.Attachments 
    sFileName = LCase(objAtt.FileName) 
    If sFileName Like "*.xls" Or sFileName Like "*.xls?" Then 
        sPathName = saveFolder & "\" & sFileName 
        objAtt.SaveAsFile sPathName 
        With objExcel.workbooks.Open(sPathName, ReadOnly:=True) 
            Set x = .sheets(SHEET).UsedRange.Find(MASK, LookIn:=xlValues, LookAt:=xlPart) 
            If x Is Nothing Then Kill sPathName Else Set x = Nothing 
            .Close False 
        End With 
    End If 
Next 

If IsNew Then objExcel.Quit 

End Sub 

CSV format

if WScript.Arguments.Count < 2 Then
WScript.Echo "Error! Please specify the source path and the     
destination. Usage: XlsToCsv SourcePath.xls Destination.csv"
Wscript.Quit
End If
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))
oBook.SaveAs WScript.Arguments.Item(1), 6
oBook.Close False
oExcel.Quit
WScript.Echo "Done"

a ideia é If InStr(objAtt.DisplayName, ".xls") se .xls for encontrado Então

converta o arquivo .xls em .csv e

salve o arquivo na pasta objAtt.SaveAsFile saveFolder & "" & objAtt.DisplayName

Eu tentei tantas vezes que nunca funcionou, o script de conversão usa dois argumentos Uso: XlsToCsv SourcePath.xls Destination.csv "

    
por Driven 18.03.2017 / 15:17

2 respostas

0

Se você quiser salvá-lo apenas como Formato CSV, use FileFormat: = xlCSV

Exemplo

For Each objAtt In itm.Attachments
    sFileName = LCase(objAtt.FileName)
    If sFileName Like "*.xls" Or sFileName Like "*.xls?" Then
        sPathName = saveFolder & "\" & sFileName
        objAtt.SaveAsFile sPathName

        CVSName = Split(objAtt.FileName, ".")(0)

        Debug.Print CVSName

        CVSName = saveFolder & "\" & CVSName

        Debug.Print CVSName

        With objExcel.Workbooks.Open(sPathName)
            .SaveAs FileName:=CVSName, _
                    FileFormat:=xlCSV, _
                    CreateBackup:=False
            .Close SaveChanges:=True
        End With

        Kill sPathName
        objExcel.Quit
    End If
Next
    
por 19.03.2017 / 08:02
0

Ugh !!! Quanto eu odeio quando as pessoas postam trechos de código, mas não fornecem toda a coisa toda limpa ...:)

De qualquer forma, graças ao seu trabalho combinado, eu consegui concluir minha tarefa em menos de um dia, então aqui você acessa a Internet. CÓDIGO LIVRE.

Adicionado:

  1. Eu limpei e até adicionei lógica para excluir as dez primeiras linhas da planilha do Excel, porque nosso extrato de dados vem com o HEADERS, então agora é um arquivo CLEAN CSV.
  2. Eu adicionei argumento para usar as configurações LOCAIS na máquina, para que você possa definir LIST DELIMITER como desejar no PAINEL DE CONTROLE em CONFIGURAÇÕES REGIONAIS. Ele continuou salvando o delimitado pelo COMMA, independentemente das configurações do meu sistema, então agora isso deve respeitar as configurações do meu sistema e usar o PIPE.
  3. Finalmente, estou trabalhando com o Office 2016 e tive que garantir que a EXCEL 16 LIBRARY fosse adicionada às referências.

Referências do VBA no Outlook

SIMPLESMENTE PERFEITA !!!

Public Sub Convert_CSV(itm As Outlook.MailItem)

' Variables
Dim objExcel As Object, IsNew As Boolean
Dim objAtt As Outlook.Attachment
Dim saveFolder As String, sFileName As String, sPathName As String

' CONFGURE FOR YOUR DEPLOYMENT
saveFolder = "C:\inetpub\wwwroot\xls"

If Not TypeName(itm) = "MailItem" Then Exit Sub
If Dir(saveFolder, vbDirectory) = "" Then MkDir saveFolder

' Get/Create Excel object
On Error Resume Next
Set objExcel = GetObject(, "Excel.Application")
If Err Then
    Err.Clear
    IsNew = True
    Set objExcel = CreateObject("Excel.Application")
End If
objExcel.FindFormat.Clear

' Main
For Each objAtt In itm.Attachments
  sFileName = LCase(objAtt.FileName)
  If sFileName Like "*.xls" Or sFileName Like "*.xls?" Then
    sPathName = saveFolder & "\" & sFileName
    objAtt.SaveAsFile sPathName
    CVSName = Split(objAtt.FileName, ".")(0)
    CVSName = saveFolder & "\" & CVSName
    With objExcel.Workbooks.Open(sPathName)
      ' Delete first ten rows.
      For i = 1 To 10
        Rows(1).EntireRow.Delete
      Next

      .SaveAs FileName:=CVSName, _
        FileFormat:=xlCSV, _
        Local:=True, _
        CreateBackup:=False
      .Close SaveChanges:=True
    End With

    Kill sPathName
    objExcel.Quit
  End If
Next

If IsNew Then objExcel.Quit


Set objExcel = Nothing
Set objAtt = Nothing


End Sub
    
por 02.12.2017 / 05:06