Notifications
Clear all

copiar/colar

10 Posts
3 Usuários
0 Reactions
1,573 Visualizações
(@joanas)
Posts: 0
New Member
Topic starter
 

Bom dia,

estou a tentar criar uma macro para, sempre que encontrar um 1 numa linha, copiar essa coluna para outra sheet.

For i = 0 To 40
If Cells(5, 1 + i).Value = 2 Then
Cells(8, 1 + i).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("BookAN_C").Select
Cells(8, 1).Select
ActiveSheet.Paste
Application.CutCopyMode = False

End If

Next i

mas agora quero que a macro também faça o mesmo mas os valores podem ir de 1 até 11.

alguém pode ajudar?

Obrigada

 
Postado : 27/01/2015 5:33 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Não entendi,

nessa linha, vc copia se o valor for 2, não se for 1

If Cells(5, 1 + i).Value = 2 Then

Mas, pode trocar por:

If Cells(5, 1 + i).Value <= 11 Then

Lembre de clicar na mãozinha - no outro tópico vc não agradeceu :(

 
Postado : 27/01/2015 5:38 am
(@joanas)
Posts: 0
New Member
Topic starter
 

o problema é que eu quero copiar e colar por uma determinada ordem. primeiro a coluna com 1, depois a que tiver o 2. etc. e assim cola o valor que encontrar primeiro. não é?

ups sorry :D vou clicar na maozinha agora :)

 
Postado : 27/01/2015 5:41 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Nesse caso, vc pode enviar um exemplo da planilha?

E se acontecer de ter o valor 1 e o valor 2 (por exemplo), na mesma coluna?

 
Postado : 27/01/2015 5:42 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Poste o modelo, mas lembre das regra do forum:

Upload
Devido a ultrapassagem da marca de 1,5Gb de armazenamento de arquivos na hospedagem do Planilhando, limitaremos o tamanho de cada arquivo para 2Mb sendo obrigatório o uso dos formatos .zip - .rar - .ice visto a gratuidade e não geração de recursos para bancar o site.

Por favor leia as regras (link na minha assinatura), e compacte todos os seus anexos.

Obrigado,

Fernando

 
Postado : 27/01/2015 5:46 am
(@joanas)
Posts: 0
New Member
Topic starter
 

esta aqui um exemplo, menos pesado
(o ficheiro original tem muito mais linhas)
se fores ver a sheet "AN_C" esta la a ordem que deve ser copiada para a "BookAN_C"

eu acrescentei isto no codigo.. mas da erro..

Sheets("AN_C").Select

k = 1
Do While k = 1 < 20

For i = 1 To 40
If Cells(5, 1 + i).Value = k Then
Cells(8, 1 + i).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("BookAN_C").Select
Cells(8, k).Select
ActiveSheet.Paste
Application.CutCopyMode = False

End If

Next i

k = k + 1
Sheets("AN_C").Select

Loop

obrigada

 
Postado : 27/01/2015 6:06 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Não testei, mas experimente:

Sub copiar_em_ordem()

Dim i As Long, j As Long, n As Long

Application.ScreenUpdating = False

j = 1
For k = 1 To 11
    For i = 1 To 40
        Sheets("AN_C").Select
        If Cells(5, i).Value2 = k Then
            Cells(8, i).Select
            Range(Selection, Selection.End(xlDown)).Select
            Selection.Copy
            Sheets("BookAN_C").Select
            Cells(8, j).Select
            ActiveSheet.Paste
            j = j + 1
            Application.CutCopyMode = False
        End If
    Next i
Next k

Application.ScreenUpdating = True

End Sub

PS: dava pra melhorar o teu código, ams como vc está começando, achei melhor não "complicar".

 
Postado : 27/01/2015 6:13 am
(@joanas)
Posts: 0
New Member
Topic starter
 

thaaanks :D
mas aconteceu uma coisa estranha. eu testei no excel que enviei e resultou.
mas no excel final, o codigo só funciona se correr passo a passo. se clicar na macro, aparece debug :shock: porque acontece isto?

 
Postado : 27/01/2015 6:22 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Como vc tem muitas linhas e colunas, provavelmente o código vai inflando a memória até que dá erro (foi um estouro, não foi?).

Se foi mesmo um estouro, ao rodar passo a passo, por outro lado, vc dá tempo para esvaziar a memória, por isso não dá erro.

Para evitar isso, vamos simplificar, sem ficar selecionando e copiando coisas (o que no VBA é dispensável, e aliás, não se deve fazer nunca):

Sub copiar_em_ordem()

Dim i As Long, j As Long, n As Long

Application.ScreenUpdating = False

j = 1
For k = 1 To 11
  For i = 1 To 40
    With Sheets("AN_C")
      If .Cells(5, i).Value2 = k Then
        .Range(.Cells(8, i), .Cells(8, i).End(xlDown)).Copy _
            Sheets("BookAN_C").Cells(8, j)
        j = j + 1
      End If
    End With
  Next i
Next k

Application.ScreenUpdating = True

End Sub

Creio que deve funcionar.

Abs

 
Postado : 27/01/2015 6:37 am
(@joanas)
Posts: 0
New Member
Topic starter
 

Resultouuuuu :D muito obrigada :D

 
Postado : 27/01/2015 6:41 am