Ir ao conteúdo
  • Cadastre-se

Excel vba - copiando varias colunas


Ir à solução Resolvido por Midori,

Posts recomendados

Boa Tarde! Precisava copiar 3 colunas do  "Sheets1" e colar no "sheets2", porém a parte do codigo que não estou sabendo fazer é, que quando colar as colunas no outro sheets eles precisam ir com outro nome..

 

Ex. no exemplo encaminhado a coluna "nomes" por exemplo, no "sheet2" fica como "Nom Pessoa", a ideia seria achar as 3 colunas no sheet1, fazer elas se localizarem no sheet2 onde devem ficar cada uma e depois colar cada uma das colunas de informações no seu respectivo local.

 

em outro codigo eu usei  um codigo mais ou menos assim 

'-------------------------------------------------------------------------------
Sub CopiaColaColunas()

  Dim rTbl As Range, rTot As Range, rTmp As Range, nomes As Variant, nome As Variant
  nomes = Array("level", "item number", "item name", "revision", "unit of measure", "quantity")
  
  Set rTbl = Workbooks("20.0470.xlsx").Worksheets("20.0470").[A12].CurrentRegion
  For Each nome In nomes
    Set rTmp = Intersect(rTbl, rTbl.Rows(1).Find(What:=nome, LookAt:=xlWhole).EntireColumn)
    If rTot Is Nothing Then Set rTot = rTmp Else Set rTot = Union(rTot, rTmp)
  
  Next nome
  rTot.Copy Destination:=Workbooks("MACRO.xlsm").Worksheets("Sheet2").[A1]
  Application.CutCopyMode = False

End Sub

EXEMPLO_CLUB.xlsx

Link para o comentário
Compartilhar em outros sites

@isabela queiroz Você pode mais arranjos para armazenar os nomes das colunas de origem , destino e as linhas onde tem os nomes das colunas.

 

A função CopiaColunas recebe esses argumentos, junto com a quantidade de linhas que devem ser copiadas, nesse caso são 5. O nome de algumas colunas na sua planilha tem espaço no final, então remova antes de testar,

 

Sub Macro()
    Call CopiaColunas( _
        Array("nomes", "numero", "digito"), _
        Array("Nom Pessoas", "Num. Cod", "Customer"), _
        Array(Sheets("Sheet1").[1:1], Sheets("Sheet2").[2:2]), 5)
End Sub

Sub CopiaColunas(OrigNomes As Variant, DestNomes As Variant, Linhas As Variant, Conta As Long)
    Dim ProcOrig    As Range
    Dim ProcDest    As Range
    Dim Indice      As Integer
    
    For Indice = 0 To UBound(OrigNomes)
        Set ProcOrig = Linhas(0).Find( _
            What:=OrigNomes(Indice), LookIn:=xlValues, LookAt:=xlWhole)
        
        If Not ProcOrig Is Nothing Then
            Set ProcDest = Linhas(1).Find( _
                What:=DestNomes(Indice), LookIn:=xlValues, LookAt:=xlWhole)
            
            If Not ProcDest Is Nothing Then
                Call ProcOrig.Offset(1).Resize(Conta).Copy(ProcDest.Offset(1))
            End If
        End If
    Next Indice
End Sub

 

Link para o comentário
Compartilhar em outros sites

@Midori Obrigada! Funcionou perfeitamente. Mas só pra saber, tem como fazer sem limite de linhas? fazer a macro ir ate a ultima linha preenchida (essas celulas que estavam em branco no exemplo foi erro meu, na planilha original todas vão estar preenchidas)

 

E eu precisava que copiasse apenas o que esta visivel das colunas (no caso com filtro)

 

pensei em fazer assim mas obviamente o codigo não funcionou, eu sei a função mas não sei onde colocar ela 

 

Sub Macro()

Dim ul As String
ul = Cells(Rows.Count, 1).End(x1Up).Row 

    Call CopiaColunas( _
        Array("nomes", "numero", "digito"), _
        Array("Nom Pessoas", "Num. Cod", "Customer"), _
        Array(Sheets("Sheet1").[1:1], Sheets("Sheet2").[2:2]), "ul")
End Sub

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@isabela queiroz Para copiar todas o parâmetro Conta pode ser removido para a atribuição ficar no próprio procedimento,

 

Sub CopiaColunas(OrigNomes As Variant, DestNomes As Variant, Linhas As Variant)
    Dim ProcOrig    As Range
    Dim ProcDest    As Range
    Dim Indice      As Integer
    Dim Conta       As Long
    
    If Linhas(0).Cells(1, 1).Offset(1) <> "" Then
        Conta = Linhas(0).End(xlDown).Row - 1
        
        For Indice = 0 To UBound(OrigNomes)
            Set ProcOrig = Linhas(0).Find( _
                What:=OrigNomes(Indice), LookIn:=xlValues, LookAt:=xlWhole)
        
            If Not ProcOrig Is Nothing Then
                Set ProcDest = Linhas(1).Find( _
                    What:=DestNomes(Indice), LookIn:=xlValues, LookAt:=xlWhole)
                    
                If Not ProcDest Is Nothing Then
                    Call ProcOrig.Offset(1).Resize(Conta).Copy(ProcDest.Offset(1))
                End If
            End If
        Next Indice
    End If
End Sub

 

1 hora atrás, isabela queiroz disse:

pensei em fazer assim mas obviamente o codigo não funcionou, eu sei a função mas não sei onde colocar ela 

 

Também dá para fazer assim, mas o tipo de ul deve ser Long assim como o argumento passado para a sub.

 

Em xlUp você acabou trocando l pelo número 1.

Link para o comentário
Compartilhar em outros sites

@Midori quando dou start isso acontece image.png.8938ff6c1c6498e9c8fb045db860900a.png  o codigo fica assim?

Sub Macro()
    Call CopiaColunas( _
        Array("nomes", "numero", "digito"), _
        Array("Nom Pessoas", "Num. Cod", "Customer"), _
        Array(Sheets("Sheet1").[1:1], Sheets("Sheet2").[2:2]), 5)
End Sub

Sub CopiaColunas(OrigNomes As Variant, DestNomes As Variant, Linhas As Variant)
    Dim ProcOrig    As Range
    Dim ProcDest    As Range
    Dim Indice      As Integer
    Dim Conta       As Long
    
    If Linhas(0).Cells(1, 1).Offset(1) <> "" Then
        Conta = Linhas(0).End(xlDown).Row - 1
        
        For Indice = 0 To UBound(OrigNomes)
            Set ProcOrig = Linhas(0).Find( _
                What:=OrigNomes(Indice), LookIn:=xlValues, LookAt:=xlWhole)
        
            If Not ProcOrig Is Nothing Then
                Set ProcDest = Linhas(1).Find( _
                    What:=DestNomes(Indice), LookIn:=xlValues, LookAt:=xlWhole)
                    
                If Not ProcDest Is Nothing Then
                    Call ProcOrig.Offset(1).Resize(Conta).Copy(ProcDest.Offset(1))
                End If
            End If
        Next Indice
    End If
End Sub

 

23 minutos atrás, isabela queiroz disse:
Sub CopiaColunas(OrigNomes As Variant, DestNomes As Variant, Linhas As Variant)
    Dim ProcOrig    As Range
    Dim ProcDest    As Range
    Dim Indice      As Integer
    Dim Conta       As Long

achei o erro, precisava ficar assim

Sub CopiaColunas(OrigNomes As Variant, DestNomes As Variant, Linhas As Variant, Conta As Long)
	Dim ProcOrig    As Range
    Dim ProcDest    As Range
    Dim Indice      As Integer

 

Mas ainda assim o Codigo roda mas não esta copiando apenas as filtradas, ta vindo tudo junto

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!