Notifications
Clear all

Copiar celulas a partir de planilhas intercaladas

10 Posts
2 Usuários
0 Reactions
1,852 Visualizações
(@bossan)
Posts: 21
Eminent Member
Topic starter
 

Amigos,
Boa tarde.
Tenho uma planilha com a macro abaixo que copia células para uma nova planilha.

Sub AtualizarPainel()

Sheets("> LOJA1").Range("j11:j83").Copy
Sheets("Painel").Range("B4").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True

End Sub

Preciso automatizar esta macro para que ela busque os dados de origem ("j11:j83") em todas as planilhas com nome iniciado com o caractere >, ou seja "> LOJA1" , "> LOJA2" etc.
Estes dados devem ser colados na planilha "Painel" a partir da linha 4 (célula "B4"), ou seja "> LOJA1" na "B4", "> LOJA2" na "B5" etc.

Existe algo como: Sheets (">*) ? e como colar em linhas seguidas?

Desde já agradeço o apoio de sempre.
Abraço.

 
Postado : 08/01/2014 3:20 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

tente:

Sub AtualizarPainel()
Application.ScreenUpdating = False
Dim Ultimalinha As Long
For Each Sheet In Worksheets
    If Left(Sheet.Name, 6) = "> LOJA" Then
        Sheets(Sheet.Name).Range("j11:j83").Copy
        With Sheets("Painel")
            Ultimalinha = .Range("A" & Rows.Count).End(xlUp).Row
            Ultimalinha = Ultimalinha + 1
            .Range("B" & Ultimalinha).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True
        End With
    End If
Next
Application.ScreenUpdating = True
End Sub
 
Postado : 08/01/2014 3:58 pm
(@bossan)
Posts: 21
Eminent Member
Topic starter
 

gtsalikis,
Obrigado pelo apoio, mas acho que não vai dar certo.
As planilhas têm nomes diferentes. Cada loja tem um nome distinto a única coisa comum é o sinal ">"no início: "> cinco estrelas" , "> nota 10", etc. Por isso pensei em algo como ">*" que buscasse todas planilhas que iniciassem com o caractere >.

Algo parecido com o codigo abaixo:

Sub AtualizarPainel()

Sheets(">*").Range("j11:j83").Copy
Sheets("Painel").Range("B4 e linhas seguintes").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True

End Sub

 
Postado : 08/01/2014 5:19 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

é só ajustar esse linha:

If Left(Sheet.Name, 6) = "> LOJA" Then

para

If Left(Sheet.Name, 2) = "> " Then

 
Postado : 08/01/2014 5:54 pm
(@bossan)
Posts: 21
Eminent Member
Topic starter
 

gtsalikis,
valeu!! Alterei e funcionou muito bem. Só esqueci de informar que a macro é uma atualização, ou seja, ela deve substituir o conteúdo que já foi colado anteriormente, ou apagar tudo e colar novamente com os novos dados, sempre a partir da linha4.
Do jeito que está a cada execução ela insere novas linhas às já existentes.
Como fazer?
Abraço.

Sub AtualizarPainel()

Application.ScreenUpdating = False
Dim Ultimalinha As Long
For Each Sheet In Worksheets
If Left(Sheet.Name, 2) = "> " Then
Sheets(Sheet.Name).Range("j7:j83").Copy
With Sheets("Painel")
Ultimalinha = .Range("A" & Rows.Count).End(xlUp).Row
Ultimalinha = Ultimalinha + 1
.Range("A" & Ultimalinha).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True
End With
End If
Next
Application.ScreenUpdating = True
End Sub

 
Postado : 09/01/2014 8:38 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Mude para

Sub AtualizarPainel()

Application.ScreenUpdating = False
Dim Ultimalinha As Long
For Each Sheet In Worksheets
If Left(Sheet.Name, 2) = "> " Then
Sheets(Sheet.Name).Range("j7:j83").Copy
With Sheets("Painel")
.Range("A4").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True
End With
End If
Next
Application.ScreenUpdating = True
End Sub
 
Postado : 09/01/2014 8:45 am
(@bossan)
Posts: 21
Eminent Member
Topic starter
 

Quase lá, irmão!
Agora ela está atualizando na "A4", mas está trazendo apenas uma linha com as informações de uma planilha "> ".
Ou seja, criei 3 planilhas começadas com "> " e ela só está trazendo informações de uma delas.
Abraço.

Sub AtualizarPainel()
Application.ScreenUpdating = False
Dim Ultimalinha As Long
For Each Sheet In Worksheets
If Left(Sheet.Name, 2) = "> " Then
Sheets(Sheet.Name).Range("j7:j83").Copy
With Sheets("Painel")
.Range("A4").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True
End With
End If
Next
Application.ScreenUpdating = True
End Sub

 
Postado : 09/01/2014 8:59 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Hm, acho que agora entendi o que vc quer. Tente:

Sub AtualizarPainel()

Application.ScreenUpdating = False
Dim Ultimalinha As Long
Ultimalinha = 4
For Each Sheet In Worksheets
If Left(Sheet.Name, 2) = "> " Then
Sheets(Sheet.Name).Range("j7:j83").Copy
With Sheets("Painel")
.Range("A" & Ultimalinha).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True
Ultimalinha = .Range("A" & Rows.Count).End(xlUp).Row
Ultimalinha = Ultimalinha + 1
End With
End If
Next
Application.ScreenUpdating = True
End Sub
 
Postado : 09/01/2014 10:02 am
(@bossan)
Posts: 21
Eminent Member
Topic starter
 

Cara,
Valeu! Só precisei excluir uma linha do código e aí funcionou perfeitamente. Ele ainda estava acrescentando linhas e não substituindo.
linha excluída: Ultimalinha = .Range("A" & Rows.Count).End(xlUp).Row
Se não for pedir demais, se tiver um tempo depois explica um pouco o código que você desenvolveu, principalmento as linhas abaixo. Preciso aprender esta mágica.
Obrigado mais uma vez. Abraço.

Application.ScreenUpdating = False
Dim Ultimalinha As Long
Ultimalinha = 4

Ultimalinha = .Range("A" & Rows.Count).End(xlUp).Row

Next
Application.ScreenUpdating = True

 
Postado : 09/01/2014 1:46 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Tentado explicar

Application.ScreenUpdating controla a tela. colocando como false, não vai mostrar na tela o que está sendo feito, e depois, como true volta a mostrar. Com isso vc ganha tempo na execução da macro.

Dim é para declarar variáveis, usei para UltimaLinha (as Long define o tipo da variável)

UltimaLinha = 4 significa que o valor da variável é 4 (usei depois para definir que a macro começaria a gravar as informações no range A4 (A & UltimaLinha)

Essa linha:
Ultimalinha = .Range("A" & Rows.Count).End(xlUp).Row
é para vc encontrar a última linha preenchida de uma planilha. Note que tem um ponto antes do range, por que o correto seria assim:
Ultimalinha = Sheets("Nome da planilha).Range("A" & Rows.Count).End(xlUp).Row
Porém, eu coloquei ele dentro de um With, o que seria assim:

With Sheets("Nome da planilha")
Ultimalinha = .Range("A" & Rows.Count).End(xlUp).Row
End with

Tudo o que vc colocar dentro desse with vai executar dentro dessa planilha

Next é o fechamento de um loop: For - Next
No caso, usei: For Each Sheet In Worksheets
o que significa que ele vai fazer um loop em todas as planilhas da tua pasta de trabalho. Logo a seguir, foi onde eu coloquei o with, pra que ele, acessando a planilha, trabalhe com ela. Assim, ele vai pegar a planilha "1", e vai fazer todo o procedimento , ao terminar, o Next vai mandar ele passar para a próxima planilha, e executa os mesmos comandos.

 
Postado : 09/01/2014 2:27 pm