Notifications
Clear all

Povoamento de planilha para emissão de etiquetas - VBA

6 Posts
1 Usuários
0 Reactions
1,781 Visualizações
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Bom dia!!

Amigos tenho uma planilha que alimenta a impressão de etiquetas. E tem um detalhe, é lançado na planilha da seguinte forma:

Pedido Cliente Nome_Impresso Produto Espaços
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 2
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 3
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 5

Observe que na coluna Espaços, temos a quantidade de vezes que aquele mesmo pedido é repetido, o cliente pede o Produto V.T. 1000 4X1 com 2 espaços, ele vai receber 2000 cartões de visita.

Outra particularidade é que também temos V.T. 2000 4X1 com apenas 1 espaço, a cada 1000 cartões vem uma caixa, logo há necessidade de imprimir duas etiquetas para pedidos de 2000. No caso de serem 2 espaços deste arquivo serão 4 etiquetas.

O que preciso é criar uma macro que varra a planilha checando se existe 2000 no nome do arquivo e caso seja verdadeiro que duplique o dado na planilha e que se a quantidade de for 2 ou superior que seja repetido esta quantidade na planilha, copiando as linhas na mesma planilha.

Já dei inicio a macro, mas está muito longe do que preciso. Um detalhe importante que pensei e que primeiro tem que varrer o nome do produto procurando texto 2000 e duplicando e depois a quantidade multiplicando as linhas.

Private Sub AjustedeEtiquetas()
Dim UltimaLinha, i, z As Integer
Dim Soma, Soma2, Soma3 As Double
Dim retorno As Boolean

busca = "*" & 2000 & "*" 'Application.InputBox("Informe o nome do impresso", "Nome do Impresso")

UltimaLinha = Cells(Cells.Rows.Count, 1).End(xlUp).Row
If UltimaLinha < 2 Then UltimaLinha = 2

    For i = 2 To UltimaLinha
        If Range("e" & i).Value > 1 Then
                MsgBox "Maior que 1 " & Range("e" & i).Value
                Range(i & ":" & i).Select
                ActiveCell.EntireRow.Select
                Selection.Copy
                Range("2:2").Select
                Selection.Insert Shift:=xlDown
                Application.CutCopyMode = False
        End If
    Next

    For i = 2 To UltimaLinha
        If Range("D" & i).Value Like busca Then
            MsgBox "Encontrado com 2000 " & Range("D" & i).Value
        End If
    Next
End Sub
 
Postado : 16/04/2012 6:41 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Código alterado, mais próximo do que estou procurando.

O problema e que quando ele copia o iten, ele pega a primeira ocorrência e replica, não respeita a linha correta. Ai joga para cima a mesma linha. Exemplo, a primeira vez ele copia as linhas que tiverem com 2000 no nome do produto:

Pedido Cliente Nome_Impresso Produto Espaços
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 2
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 1

Depois de rodar a macro fica assim, observe que está sendo copiada a mesma linha com 2 espaços e não uma com 2 e outra com 1, isso está refletindo em muitas cópias erradas na segunda etapa da replicação, onde é duplicado pelo numero de espaços:

Pedido Cliente Nome_Impresso Produto Espaços
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 2
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 2
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 2
01659 STUDIO ONE SERVI TAXI V.T. 2000 4X1 1
01659 STUDIO ONE SERVI TAXI V.T. 1000 4X1 1

Segue o código alterado:

Dim UltimaLinha, i, z As Integer
Dim Soma, Soma2, Soma3 As Double
Dim retorno As Boolean

busca = "*" & 2000 & "*"

UltimaLinha = Cells(Cells.Rows.Count, 1).End(xlUp).Row
If UltimaLinha < 2 Then UltimaLinha = 2

    For i = 2 To UltimaLinha
        If Range("D" & i).Value Like busca Then
            MsgBox "Encontrado com 2000 " & Range("D" & i).Value
            Range(i & ":" & i).Select
            ActiveCell.EntireRow.Select
            Selection.Copy
            Range("2:2").Select
            Selection.Insert Shift:=xlDown
            Application.CutCopyMode = False
        End If
    Next
    
UltimaLinha = Cells(Cells.Rows.Count, 1).End(xlUp).Row
If UltimaLinha < 2 Then UltimaLinha = 2
    
    For z = 2 To UltimaLinha
        If Range("e" & z).Value > 1 Then
                MsgBox "Maior que 1 " & Range("e" & z).Value
                Range(z & ":" & z).Select
                ActiveCell.EntireRow.Select
                Selection.Copy
                Range("2:2").Select
                Selection.Insert Shift:=xlDown
                Application.CutCopyMode = False
        End If
    Next

End Sub
 
Postado : 16/04/2012 7:38 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Up

 
Postado : 18/04/2012 6:58 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Nenhuma ideia?
Abraços a todos!!

 
Postado : 19/04/2012 12:37 pm
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Help!

 
Postado : 23/04/2012 5:26 am
(@chook)
Posts: 197
Reputable Member
Topic starter
 

Ninguém tem nem ideia?

 
Postado : 15/05/2012 12:24 pm