Notifications
Clear all

organizar varias colunas de datas em uma só

3 Posts
1 Usuários
0 Reactions
804 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

fiz uma macro que pega o valor de varias colunas
tira as duplicatas,
organiza em ordem crescente
e cola em uma coluna guia

até que funciona, mas acho que estou fazendo muita volta para pouca coisa

tipo

a Coleção eu não sei pegar a quantidade de itens que tem nela "mas tenho certeza que já fiz isso"
(poderia até fazer um loop para isso "Mas...")
com a quantidade poderia adicionar os valores direto na array já redimensionada

ou
talvez ordenar a própria coleção (não consegui)

então qualquer ideia para melhorar a macro é bem vinda

Sub OrganizaData()
    Dim Unicos As New Collection
    Inicio
    Gdd = 3: Li = 105
    ' apaga coluna Guia
    Range(Cells(Li, Gdd), Cells(Rows.Count, Gdd).End(xlUp)).ClearContents
    On Error Resume Next

    'adiciona todas as colunas de datas em ums coleção sem repetir valores
    For lot = 1 To Cells(10, "F").Value2
        Cdi = Cells(1, Cells(15, lot).Value2).Column  ' O endereço dessas colunas estão em uma tabela

        For L = Cells(Li - 1, Cdi).End(xlDown).row To Cells(Rows.Count, Cdi).End(xlUp).row
            valu = Cells(L, Cdi).Value2
            If valu <> "" Then Unicos.Add valu, CStr(valu)

        Next: Next
    lid = Li

'passa valores da coleção para a coluna Guia (NÃO SEI PEGAR O TOTAL DE VALORES DA COLEÇÃO)
    For Each Valor In Unicos
        Cells(lid, Gdd).Value2 = Valor
        lid = lid + 1
    Next Valor

'Adiciona coluna GUIA em um ARRAY "Coluno"
    ColunO = Range(Cells(Li, Gdd), Cells(Rows.Count, Gdd).End(xlUp)).Value2

    'organiza ARRAY ColunO em ordem crescente (Linha)
    Lfim = UBound(ColunO, 1)
    Lx = 1: i = Lx + 1
    Do
        A = ColunO(Lx, 1): b = ColunO(Lx + 1, 1)
        If A > b Then
            ColunO(Lx, 1) = b: C = A
            ColunO(Lx + 1, 1) = C
            If Lx > 1 Then Lx = Lx - 1
        Else
            Lx = i: i = i + 1
        End If
    Loop Until Lx = Lfim

    'cola Coluno na coluna de guia
    Range(Cells(Li, Gdd), Cells(Rows.Count, Gdd).End(xlUp)).Value2 = ColunO

    Final
End Sub
 
Postado : 29/12/2014 11:50 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

agora de manha consegui esse codigo que organiza coleções

mas ou eu fiz algo errado ou realmente não vale a pena usar isso e o melhor é ficar com copia cola do array

levou tempo demasiado, e eu tentei outras variações

Dim VTE As Date, I As Long, J As Long
For I = 1 To Unicos.Count
For J = I + 1 To Unicos.Count
If Unicos(I) > Unicos(J) Then
VTE = Unicos(J)
Unicos.Remove J
Unicos.Add VTE, CStr(VTE), I
End If
Next J

enquanto a primeira versão com sort pelo array é quase instantânea,
essa dá tempo até de tomar um cafezinho, bater um papo e atender o tel

 
Postado : 30/12/2014 7:05 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

não sei se o pessoal não conhece muito sobre coleções ou não entenderam minha duvida,

eu tinha lido que coleções eram mais rápidas que arrays, mas nesse caso foi muito lento
o bom de coleções é que dá para ir adicionando itens sem se preocupar com o tamanho,

mas fora isso array é muito melhor,
alem de poder pegar e colar direto na planilha sem loops, não creio que com coleções possa fazer isso

mas vou usar o array mesmo

 
Postado : 02/01/2015 4:22 pm