Notifications
Clear all

Organizar Intervalo na Coluna SEM ser por ordem alfabética

13 Posts
3 Usuários
0 Reactions
1,432 Visualizações
(@mauronunes)
Posts: 0
New Member
Topic starter
 

Bom dia,

Tenho um dado intervalo numa planilha (ex: A2:A10) e utilizei o código abaixo para organizá-lo de modo a sempre deixar os VALORES VAZIOS (sem nada escrito) no final do intervalo:

Private Sub Worksheet_Change(ByVal Target As Range)
Range("A2:A10").Sort Key1:=Range("A1")
Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End Sub

Contudo, gostaria que as células preenchidas NÃO ficassem em Ordem Alfabética, conforme está ocorrendo e é possível visualizar no mesmo.
O objetivo é que elas fiquem organizadas na coluna de acordo a SOMENTE deixar os VALORES VAZIOS (sem nada escrito) no final do intervalo.

ex:
A2= com a célula escrita "Mario"
A3= celular com nada escrito.
Descido escrever na célula A4 a palavra "Adelmo", e na mesma hora a palavra "Adelmo" é transferida para a célula A3 que não tinha nada escrito.

Dessa forma desejo um ajuda para saber o código em que teríamos as células (SEM ORDEM ALFABÉTICA) conforme abaixo:

A2= com a célula escrita "Mario"
A3= com a célula escrita "Adelmo"
A4= celular com nada escrito.

Desde já,

Obrigado!

 
Postado : 15/06/2014 2:14 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Então porque você simplesmente não deleta as linhas vazias?

Att

 
Postado : 15/06/2014 5:57 am
(@mauronunes)
Posts: 0
New Member
Topic starter
 

O layout da planilha estará protegido com senha (com exceção do range da coluna) pois será uma ferramenta a ser utilizado por outros usuários bastante leigos no excel e em informática como um todo. Por isso a necessidade de automatização..

 
Postado : 15/06/2014 12:05 pm
(@edcronos)
Posts: 1006
Noble Member
 

para juntar "valores" de Coluna sem mexer em formatações e formulas...

Sub juntar()
Dim coluno() As Variant
Dim coli As Range

Set coli = Range("A2:A10")'<<<---é só trocar a Range aqui (Apenas 1 coluna)
l = coli.Rows.Count - 1
ReDim coluno(l, 0)

l = 0
For Each vi In coli
If vi.Value <> "" Then
coluno(l, 0) = vi.Value2
l = l + 1
End If
Next vi
coli = coluno
End Sub

só vai funcionar para uma coluna de cada vez, e apenas move os valores

Att.

 
Postado : 15/06/2014 12:59 pm
(@mauronunes)
Posts: 0
New Member
Topic starter
 

Edcronos,

Colei o código e por alguma razão não funcionou. Aparece na planilha como se não ocorresse nada.
Há a possibilidade de enviar em anexo o arquivo em que está funcionando aí para ver se fica OK aqui também?
Valeuu!

 
Postado : 15/06/2014 1:22 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Mauro

O código que o Edcronos postou, deve sr colocado num módulo comum e necessita de um botão de comando para funcionar.

[]s

 
Postado : 15/06/2014 1:38 pm
(@mauronunes)
Posts: 0
New Member
Topic starter
 

Perdoem a ignorância, valeu pelo toque Patropi agora pude ver que funcionou muito bem!

Mas para ficar EXATAMENTE como estou buscando precisaria só acrescentar a funcionalidade de quando alguma célula na range (ex: A2:A10) for alterada ( <>0 --> escrever algum valor ou apagá-la) de imediato acionar o código do Edcronos. Isto é, ativá-lo sem botão de comando. Será que é possível?

Obrigado!

 
Postado : 15/06/2014 1:52 pm
(@edcronos)
Posts: 1006
Noble Member
 

creio que usando um evento para chamar a macro

Private Sub Worksheet_Change(ByVal Target As Range)
rando = "A2:A10"
If Not Application.Intersect(Target, Range(rando)) Is Nothing Then
juntar
End If
End Sub

cole na plan que tem que ser verificada

 
Postado : 15/06/2014 2:13 pm
(@edcronos)
Posts: 1006
Noble Member
 

caso vc queira simplificar
pode deixar apenas uma celula de entrada de dados Ex. A2
e conforme for digitando ali e apertando Enter os valores vão descendo, sem o cursor sair de A2

Private Sub Worksheet_Change(ByVal Target As Range)
rando = "A2"
If Not Application.Intersect(Target, Range(rando)) Is Nothing Then
Application.EnableEvents = False
Range("A3:A100").Value2 = Range("A2:A99").Value2
Range("A2").ClearContents 'Select
Range("A2").Activate
Application.EnableEvents = True
End If
End Sub

esse tem que ser na pasta de trabalho e não em um modulo

 
Postado : 15/06/2014 3:12 pm
(@edcronos)
Posts: 1006
Noble Member
 

ve se assim te atende, acho que está do jeito que vc queria de inicio:

 
Postado : 15/06/2014 6:54 pm
(@mauronunes)
Posts: 0
New Member
Topic starter
 

Olá pessoal,
Primeiramente gostaria de agradecer a colaboração de todos!
A "união" dos dois códigos serviu direitinho! :)

Sub juntar()
Dim coluno() As Variant
Dim coli As Range

Set coli = Range("A2:A10")'<<<---é só trocar a Range aqui (Apenas 1 coluna)
l = coli.Rows.Count - 1
ReDim coluno(l, 0)

l = 0
For Each vi In coli
If vi.Value <> "" Then
coluno(l, 0) = vi.Value2
l = l + 1
End If
Next vi
coli = coluno
End Sub

'---> E o que chama a macro:
Private Sub Worksheet_Change(ByVal Target As Range)
rando = "A2:A10"
If Not Application.Intersect(Target, Range(rando)) Is Nothing Then
juntar
End If
End Sub

Contudo, gostaria de aplicá-los em mais de um range na mesma planilha, por exemplo: A2:A10 ; A12:A20 ; e/ou B4:B14 ...
Tentei colar junto o mesmo código mas com outro range e apareceu: Nome Repetido Encontrado: Worksheet_Change

Como faço para resolver isso, sem talvez precisar inserir um novo Módulo para cada novo intervalo? :|

De antemão,
Obrigado!

 
Postado : 22/06/2014 11:36 pm
(@edcronos)
Posts: 1006
Noble Member
 

!

 
Postado : 23/06/2014 6:32 am
(@mauronunes)
Posts: 0
New Member
Topic starter
 

Muito Obrigado Edcronos!!!
Exatamente isso e mais didático impossível!
:)

 
Postado : 27/06/2014 12:41 am