Ir ao conteúdo
  • Cadastre-se
telmobarros

Excel Como copiar e colar celulas específicas com vba

Recommended Posts

Prá inicio de conversa, sou totalmente leigo em VBA,O meu problema é o seguinte:

Tenho uma planilha de custos, onde tenho uma aba, Calculo do Produto, e outra Histórico de Vendas. Hoje preencho manualmente, copiando celulas da aba Calculo do Produto, e colando na aba Historico de vendas. São muitas celulas e isso se torna chato e cansativo.

O que eu preciso é copias celulas especificas em Calculo do Produto, e colar em celulas especificas de Histórico de Vendas.

Achei essa macro aqui no forum enviada por jeffsilveira e o que consegui entender está escrito ao lado

Sub copiar()     Executar a macro de nome copiar

Range("A1:A10").Select     Seleciona o intervalo de celuas de A1 até A10 na planilha de origem

Selection.Copy     seleciona a funcao copiar                   

Sheets("Plan2").Select     Seleciona a aba de destino 

Range("A1").Select     Seleciona a celula A1 na aba de destino

Do                                                    | Essa parte se refere à procura da primeira linha vazia.

If ActiveCell <> "" Then                    | Aqui tenho uma dúvida! Como a primeira celula de destino é A1, não sei se a procura é

ActiveCell.Offset(1, 0).Select          | pela primeira celula A vazia, ou se toda a linha vazia.

End If                                               | Exemplo: Se tiver um dado na celula A10 , vai colar a partir da celula A11. Mas se A10 estiver vazia e 

Loop Until ActiveCell = ""                | e houver dados na celula B10 ou C10, não se se cola na A11 ou cola na A10

ActiveCell.PasteSpecial Paste:=xlPasteAll,  Essas duas linhas abaixo só sei que é a colagem, mas onde, quando, porque, não faço a 

Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False       minima ideia

End Sub     Termina a execução da macro

 

Apos várias tentativas e erros, (demorou varios dias) consegui adaptar da seguinte maneira.

Sub copiar()

    Sheets("CALCULAR PRODUTO").Select
    Range("B6, B11, B7").Select
    Selection.Copy
    Sheets("HISTÓRICO VENDAS").Select
    Range("A1").Select
    Do
        If ActiveCell <> "" Then
        ActiveCell.Offset(1, 0).Select
        End If
    Loop Until ActiveCell = ""
    ActiveCell.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=TRUE
    Application.CutCopyMode = False

End Sub

Alterei o nome das abas, as celulas a serem copiadas e alterei o TRANSPOSE=TRUE

Esta macro procura a primeira linha em branco e cola as células selecionadas na primeira celula vazia. Até então está OK.

Agora vamos aos problemas:

1 - A ordem das celulas a serem copiadas é B6, B11, B7, mas me retorna B6, B7, B11. A ordem a ser colada deve ser mantida.

2 - A selecao das celulas a serem copiadas não estão necessariamente, na mesma linha ou coluna, por exemplo, B11, H10, I6 Então se colocar TRANSPOSE, acho que vai dar errado. 

3 - A colagem se dá a partir da celula A1 e cola nas colunas seguintes B1, C1, ou seja, colunas contiguas. Essa ordem precisa ser modificada, por exemplo, para A1, H1, C1

Então resumindo, o que eu preciso é pegar celulas especificas na origem, e colar em celulas especificas no destino. Aqui no forum e em outros que pesquisei, só achei exemplos como esse que peguei, referenciando a intervalos de celulas.

Se não for pedir muito, gostaria que explicassem a função de cada linha da macro, especialmente onde está apontando as celulas de origem e destino, pois tenho uma outra planilha e gostaria de fazer a mesma coisa e não queria ter que abrir um outro tópico com o mesmo assunto.

Muito grato

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi o porque a cópia e a cola devem seguir uma ordem específica, mas respeitei.

 

Teste isso:

Sub copiar()

   'Define numa variável string (texto) as células na ordem em que devem ser copiadas. A posição zero não é usada.
    Range1 = "dummy,B06,B11,B7,C9,H15,A1,G2,M19"
   'Define numa variável string (texto) as colunas onde vão ser coladas as células copiadas
   'Manter as informações alinhadas para ficar mais fácil de ver de onde copia para onde
    Range2 = "dummy,A,  H,  C, J, M,  D, B, K"
   'O endereço das células são passadas do texto para as posições de um vetor (matriz)
    Range1 = Split(Range1, ",")
    Range2 = Split(Range2, ",")
   'Procura na coluna A, de baixo para cima, a última linha preenchida (similar a teclar END e seta para cima na planilha)
    LinhaB = Sheets("HISTÓRICO VENDAS").Cells(Rows.Count, "A").End(xlUp).Row + 1
   'Percorre cada um dos elementos da matriz (o zero não é usado)
    For Idx = 1 To UBound(Range1)
       'Copia o endereço que consta naquela posição da matriz e cola na linha branca (LinhaB) a partir da coluna 1 ("A")
        Sheets("CALCULAR PRODUTO").Range(Range1(Idx)).Copy _
                Destination:=Sheets("HISTÓRICO VENDAS").Range(Cells(LinhaB, Trim(Range2(Idx))).Address)
   'Volta para a linha do FOR para processar a próxima posição da matriz. Se já foi a última, segue para baixo
    Next

End Sub

Jimmy San Juan

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jimmy, boa noite

Eu sou cabeça dura, quando pego uma coisa pra fazer, so largo o osso depois de resolvido. Depois que lhe enviei a msg ontem, fiquei aqui quebrando cabeça, e consegui, como se diz, achar o fio da meada. Mas tive que sair e cheguei tarde e meio chapado.

Copiei a planilha para um pendrive e levei para o serviço hoje. Quando o tempo dava, ficava ajeitando a planilha. Consegui resolver o meu problema e quando cheguei do serviço, so faltava alguns ajustes. A planilha esta funcionado perfeitamente, do jeito que eu queria, copiando celulas especificas e colando em celulas especificas, independente de qualquer ordem, e sem ordem. Mas não vou postar o que eu fiz. Se algum programador ou alguem com conhecimento de programacao ver, vai achar uma aberracao, um verdadeiro atentado aos principios de programacao. rsrsrs

Agradeço muito, muitissimo, a sua boa vontade e disponibilidade em querer me ajudar.

Foi a primeira vez que me envolvi com VBA, e achei bem interessante o leque de coisas que se pode fazer. Por isso tenho certeza que nos "encontraremos" aqui de novo.

Mais uma vez, obrigado

abraços

Telmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×