Notifications
Clear all

Copiar e Colar Imagem dentro de Range

6 Posts
2 Usuários
0 Reactions
3,220 Visualizações
(@zgoda)
Posts: 0
New Member
Topic starter
 

Boa tarde Amigos.

Estou com o código abaixo para copiar o range de uma planilha, criar uma outra, e colar o conteúdo, porém existe uma imagem dentro desse range que não está sendo colada, ela não copia nem com " .Cells(1).PasteSpecial Paste:=xlPasteAll", por favor, podem me ajudar?

b Send_Row_Or_Rows_Attachment_2()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim rng As Range
    Dim Ash As Worksheet
    Dim Cws As Worksheet
    Dim Rcount As Long
    Dim Rnum As Long
    Dim FilterRange As Range
    Dim FieldNum As Integer
    Dim NewWB As Workbook
    Dim TempFilePath As String
    Dim TempFileName As String
    Dim FileExtStr As String
    Dim FileFormatNum As Long

    Assinatura = ""
    
    On Error GoTo cleanup
    Set OutApp = CreateObject("Outlook.Application")

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

    'Set filter sheet, you can also use Sheets("MySheet")
    Set Ash = ActiveSheet

    'Set filter range and filter column (column with e-mail addresses)
    Set FilterRange = Ash.Range("A2:P" & Ash.Rows.Count)
    FieldNum = 2    'Filter column = B because the filter range start in column A

    'Add a worksheet for the unique list and copy the unique list in A1
    Set Cws = Worksheets.Add
    FilterRange.Columns(FieldNum).AdvancedFilter _
            Action:=xlFilterCopy, _
            CopyToRange:=Cws.Range("A1"), _
            CriteriaRange:="", Unique:=True

    'Count of the unique values + the header cell
    Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))

    'If there are unique values start the loop
    If Rcount >= 2 Then
        For Rnum = 2 To Rcount

            'If the unique value is a mail addres create a mail
            If Cws.Cells(Rnum, 1).Value Like "?*@?*.?*" Then

                'Filter the FilterRange on the FieldNum column
                FilterRange.AutoFilter Field:=FieldNum, _
                                       Criteria1:=Cws.Cells(Rnum, 1).Value

                'Copy the visible data in a new workbook
                With Ash.AutoFilter.Range
                    On Error Resume Next
                    Set rng = .SpecialCells(xlCellTypeVisible)
                    On Error GoTo 0
                End With

                Set NewWB = Workbooks.Add(xlWBATWorksheet)

                rng.Copy
                With NewWB.Sheets(1)
                    .Cells(1).PasteSpecial Paste:=8
                    .Cells(1).PasteSpecial Paste:=xlPasteColumnWidths
                    .Cells(1).PasteSpecial Paste:=xlPasteValues
                    .Cells(1).PasteSpecial Paste:=xlPasteFormats
                    .Cells(1).PasteSpecial Paste:=xlPasteComments
                    .Cells(1).Select
                    Application.CutCopyMode = False
                End With

Muito obrigado e abraços.

 
Postado : 26/06/2017 1:55 pm
(@zgoda)
Posts: 0
New Member
Topic starter
 

Vou colar o código completo aqui abaixo, e gostaria também de saber por que o "Cells(Rnum, 1)" para de trazer após a 17ª variável, ou seja, o 17º email enviado ele para de puxar o campo que devia que está nesse range. PS: Desculpa não editar o primeiro post, mas o botão de "Editar" some depois de um tempo que o tópico foi aberto.

Sub Send_Row_Or_Rows_Attachment_2()

    Dim OutApp As Object
    Dim OutMail As Object
    Dim rng As Range
    Dim Ash As Worksheet
    Dim Cws As Worksheet
    Dim Rcount As Long
    Dim Rnum As Long
    Dim FilterRange As Range
    Dim FieldNum As Integer
    Dim NewWB As Workbook
    Dim TempFilePath As String
    Dim TempFileName As String
    Dim FileExtStr As String
    Dim FileFormatNum As Long

    Assinatura = "/Assinatura.JPG"
        
    On Error GoTo cleanup
    Set OutApp = CreateObject("Outlook.Application")

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

    'Set filter sheet, you can also use Sheets("MySheet")
    Set Ash = ActiveSheet

    'Set filter range and filter column (column with e-mail addresses)
    Set FilterRange = Ash.Range("A2:P" & Ash.Rows.Count)
    FieldNum = 2    'Filter column = B because the filter range start in column A

    'Add a worksheet for the unique list and copy the unique list in A1
    Set Cws = Worksheets.Add
    FilterRange.Columns(FieldNum).AdvancedFilter _
            Action:=xlFilterCopy, _
            CopyToRange:=Cws.Range("A1"), _
            CriteriaRange:="", Unique:=True

    'Count of the unique values + the header cell
    Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))

    'If there are unique values start the loop
    If Rcount >= 2 Then
        For Rnum = 2 To Rcount

            'If the unique value is a mail addres create a mail
            If Cws.Cells(Rnum, 1).Value Like "?*@?*.?*" Then

                'Filter the FilterRange on the FieldNum column
                FilterRange.AutoFilter Field:=FieldNum, _
                                       Criteria1:=Cws.Cells(Rnum, 1).Value

                'Copy the visible data in a new workbook
                With Ash.AutoFilter.Range
                    On Error Resume Next
                    Set rng = .SpecialCells(xlCellTypeVisible)
                    On Error GoTo 0
                End With

                Set NewWB = Workbooks.Add(xlWBATWorksheet)

                rng.Copy
                With NewWB.Sheets(1)
                    .Cells(1).PasteSpecial Paste:=8
                    .Cells(1).PasteSpecial Paste:=xlPasteColumnWidths
                    .Cells(1).PasteSpecial Paste:=xlPasteValues
                    .Cells(1).PasteSpecial Paste:=xlPasteFormats
                    .Cells(1).PasteSpecial Paste:=xlPasteComments
                    .Cells(1).Select
                    Application.CutCopyMode = False
                End With

                'Create a file name
                TempFilePath = Environ$("temp") & ""
                TempFileName = "" & Ash.Parent.Name _
                             & " " & Cells(Rnum, 1)

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

                'Save, Mail, Close and Delete the file
                Set OutMail = OutApp.CreateItem(0)

                With NewWB
                    .SaveAs TempFilePath & TempFileName _
                          & FileExtStr, FileFormat:=FileFormatNum
                    On Error Resume Next
                    With OutMail
                        .to = Cws.Cells(Rnum, 1).Value
                        .Subject = " 2017 - Retificação " & " " & Format(Now, "dd-mmm") & " " & Cells(Rnum, 1)
                        .Attachments.Add NewWB.FullName
                        .HTMLBody = "<HTML><BODY><FONT FACE=Calibri COLOR=0000000> <h3 style = color:#CE8F00>Prezado & " " & Cells(Rnum, 1) & ".</h3>" & _
                        "Segue
                        "Atenciosamente,<BR><BR> <hr> <img src=""" & Assinatura & ">" & "</FONT>" & OutMail.HTMLBody & "</FONT FACE></BODY></HTML>"
                       End With
                    On Error GoTo 0
                    .Close savechanges:=False
                End With

                Set OutMail = Nothing
                Kill TempFilePath & TempFileName & FileExtStr
            End If

            'Close AutoFilter
            Ash.AutoFilterMode = False

        Next Rnum
    End If

cleanup:
    Set OutApp = Nothing
    Application.DisplayAlerts = False
    Cws.Delete
    Application.DisplayAlerts = True

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

 
Postado : 28/06/2017 5:57 am
(@skulden)
Posts: 0
New Member
 

Zgoda,

Você precisa se referenciar ao objeto em questão pra copiar ele.

Por exemplo, se eu quiser me referenciar à um retângulo: ActiveSheet.Shapes.Range(Array("Picture 3")).Select

Sobre o Rnum, eu não sei dizer porquê não sei como é a tua planilha, mas ele tá em um loop de 2 até Rcount e o Rcount conta só as células não vazias da coluna, talvez o problema esteja ai (?)

Qualquer coisa, anexa a planilha, ai fica mais fácil.

Abraços.

 
Postado : 28/06/2017 6:43 am
(@zgoda)
Posts: 0
New Member
Topic starter
 

Beleza, acho que selecionando ele "ActiveSheet.Shapes.Range(Array("Picture 3")).Select" junto ele vai colar em todos os loops, Como que eu insiro esse comando no código? digo em que parte, tenho que inserir algum DIM?

Daí qual comando Paste que eu uso para colar essa imagem em uma célula específica?

Infelizmente eu não posso colar a planilha, são dados confidenciais da empresa. :/

 
Postado : 29/06/2017 7:31 am
(@skulden)
Posts: 0
New Member
 

Você não pode acrescentar a figura antes do Loop?

Lembrando que este código: "ActiveSheet.Shapes.Range(Array("Picture 3")).Select" foi apenas um exemplo de como selecionar um objeto pelo VBA. No seu caso vai ter que ver qual é o nome do objeto e usar os métodos apropriados para copiar e colar ele.

Abraços.

 
Postado : 29/06/2017 7:37 am
(@zgoda)
Posts: 0
New Member
Topic starter
 

A futuros colegas que tenham um problema similar ao meu, aqui descobri uma solução bem simples, obrigado ao skulden por me esclarecer a questão de como identificar a imagem.

 With NewWB.Sheets(1)
                    .Cells(1).PasteSpecial Paste:=8
                    .Cells(1).PasteSpecial Paste:=xlPasteColumnWidths
                    .Cells(1).PasteSpecial Paste:=xlPasteValues
                    .Cells(1).PasteSpecial Paste:=xlPasteFormats
                    .Cells(1).PasteSpecial Paste:=xlPasteComments
                    .Cells(1).Select
                    Application.CutCopyMode = False
                    Range("L4").Select 'Onde a figura será colada
                    ActiveSheet.Pictures.Insert("C:Usersja31193PicturesCapturar.jpg").Select 'Onde a figura está salva
                    With Selection
                    .Left = Range("L4").Left
                    .Top = Range("L4").Top
                    .ShapeRange.LockAspectRatio = msoFalse
                    .ShapeRange.Height = 100
                    .ShapeRange.Width = 100
                    .ShapeRange.Rotation = 0#
                    End With
                    Application.ScreenUpdating = True
                End With
 
Postado : 03/07/2017 6:29 am