Usando VBA para procurar transferir e organizar dados


#1

Desenvolvi uma planilha que tem duas macros rodando dentro dela, estou tentando associar outra para fazer a organização dos dados contidos nela, usando VBA para procurar transferir e organizar dados.
Observem que a coluna “A” foi inserido o código, “D” descrição etc…
Gostaria de criar uma macro que identifique apenas as células que tenha conteúdo na coluna “E”, e após a identificação cópie o código do produto na coluna “A” e cole na coluna “F” após esta verificação ela Classifique estes códigos do menor para o maior.
Obs: que tem colunas ocultas na planilha.
Segue exemplo do que a macro deve fazer:

Observem que ela verificou linha por linha na coluna “E” copiou os códigos
de cada produto na coluna “A” e colou na coluna “F” de forma organizada.
Se alguém poder me ajudar agradeço muito.
Grato.


#2

Fala, @Carlyle_net. Tudo bem?

Não entendi a lógica da coluna F. Pode tentar explicar um pouco melhor?


#3

E ai Xavier, blz!
Este foi só um exemplo, na minha planilha este código e colocado na coluna “F” (fictícia), pois as células seguintes tem formulas que vão me dá outras informações do produto, após a conclusão de preenchimento e a ação desta função que estou querendo colocar, estas informações são transferidas para um formulário em outra aba da mesma planilha, por isso tem que organizar os dados para que o formulário não fique desorganizado (saltando as linhas).
Obrigado por me responder.


#4

@Carlyle_net, o problema é que você quer classificar os dados como se fossem números, mas, neste momento, eles são textos. Numericamente falando, o zero à esquerda não tem sentido, por isto o Excel suprime quando tratando números. Você consegue classificar como texto, só que o 0 virá depois do 9, ou seja, a ordem, no seu exemplo, ficará: 11, 12, 13, 02, 03, 06, 07.


#5

Estes códigos são apenas exemplos, coloquei a formatação como texto só para exemplificar, más, meus códigos estão todos formatados como números e não iniciam com “0” (Zero).
Olhe ai a minha planilha


O que eu quero é que ao colocar algum valor na coluna “AH” a coluna “AL” seja preenchida automaticamente, e de forma organizada.
Obs: O botão “ORGANIZAR” não está funcionando, ainda não consegui desenvolver a macro para ele funcionar, e na coluna “AL” deve ser colado apenas os valores (códigos) sem formatação.


#6

Fala, @Carlyle_net. Escrevi uma rotina que acredito atender o seu caso.

Dim Lin As Integer
Dim i As Integer

Lin = Range(“A6”).End(xlDown).Row

For i = 6 To Lin

If Range("AH" & i).Value2 <> "" Then

    Range("BZ" & i).Value2 = Range("A" & i).Value2

End If

Next i

Columns(“BZ:BZ”).Select
ActiveSheet.Range(“BZ:BZ”).RemoveDuplicates Columns:=1, Header:=xlNo

Range(“BZ2”).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range(“AL6”).Select
Selection.PasteSpecial xlPasteValues
Columns(“BZ:BZ”).ClearContents
Target.Select


#7

Boa tarde @xavier,
Venho agradecer pelo seu apoio e empenho aplicado na minha dificuldade, utilizei a rotina que vc descreveu acima, más, ela apresentou erro, verifiquei algumas informações e alterei alguns comandos, más, ao chegar no comando “Target. Select” aparece a caixa de depurador com a seguinte mensagem:
Erro de execução ‘424’:
O Objeto é Obrigatório.

Vou postar abaixo o que foi feito.

Private Sub ORGANIZAR_Click()

Dim Lin As Integer
Dim i As Integer

Lin = Range(“AA6”).End(xlDown).Row

For i = 6 To Lin

If Range(“AH” & i).Value2 <> “” Then

Range("BH" & i).Value2 = Range("AA" & i).Value2

End If
Next i

Columns(“BH:BH”).Select
ActiveSheet.Range(“BH:BH”).RemoveDuplicates Columns:=1, Header:=xlNo

Range(“BH2”).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range(“AL6”).Select
Selection.PasteSpecial xlPasteValues
Columns(“BH:BH”).ClearContents

'Classificação de códigos do menor para o Maior
Range(“AL6:AL20”).Select
ActiveWorkbook.Worksheets(“PREENCHIMENTO DE DEVOLUÇÕES”).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(“PREENCHIMENTO DE DEVOLUÇÕES”).Sort.SortFields.Add _
Key:=Range(“AL6”), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(“PREENCHIMENTO DE DEVOLUÇÕES”).Sort
.SetRange Range(“AL6:AL20”)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range(“AH4:AH5”).Select
Target.Select
End Sub


#8

Consegui,
Segue o que foi feito:

Sub Organizar()
Application.EnableEvents = False

Dim Lin As Integer
Dim i As Integer

Lin = Range(“AA6”).End(xlDown).Row

For i = 6 To Lin

If Range(“AH” & i).Value2 <> “” Then

Range("BH" & i).Value2 = Range("AA" & i).Value2

End If
Next i

Columns(“BH:BH”).Select
ActiveSheet.Range(“BH:BH”).RemoveDuplicates Columns:=1, Header:=xlNo

Range(“BH2”).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Range(“AL6”).Select
Selection.PasteSpecial xlPasteValues
Columns(“BH:BH”).ClearContents

'Classificação de códigos do menor para o Maior
Range(“AL6:AL20”).Select
ActiveWorkbook.Worksheets(“PREENCHIMENTO DE DEVOLUÇÕES”).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(“PREENCHIMENTO DE DEVOLUÇÕES”).Sort.SortFields.Add _
Key:=Range(“AL6”), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(“PREENCHIMENTO DE DEVOLUÇÕES”).Sort
.SetRange Range(“AL6:AL20”)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range(“AH4:AH5”).Select

Application.EnableEvents = True
End Sub

Muito obrigado.


#9

Opa, @Carlyle_net. Falha minha. Eu usei o atributo “Change” da Worksheet, o que, automaticamente, gera uma variável “Target” que é a célula que foi alterada ativando a execução do código. Esqueci de apagar ela quando descrevi aqui.

O importante é que deu tudo certo e você conseguiu.

Abraços.