» »

[VBA Excel]

[VBA Excel]

Muzo ::

Živjo, upam da mi bo kdo lahko pomagal.

V excelu imam za en ID več podatkov o licenci in tudi datum veljavnosti licence.

ID Licenca dat_zač dat_konc
ID1 L1 1.1.1990 31.12.1995
ID1 L1 1.1.1996 31.12.2000
ID1 L1 1.1.2001 31.12.2006
ID1 L2 1.1.2003 31.12.2006
ID2 L1 .......

Upam da razumete. potrebujem pa makro, ki bo za vask ID pogledal znotraj licence L1 kateri je največji datum začetka in konca, enako naredil za L2 in vsako naslednjo licenco, potem pa isto nadaljeval z ID2. Naj pa bi pobrisal vse vrstice, kjer datum začetka oz. konca ni največji, tako da bi v tem primeru ostali vrstica 3 in 4 za ID1.

Načeloma bi verjetno mogu označit range, zapisat vsebino celice v string in potem primerjat ane... sam jst tega ne znam. Neuspešno se matram z tutoriali, pa bi zadevo nujno rabil.

Hvala vsem dobrim dušam!

darkolord ::

Hoj,

imaš te IDje oziroma Lje po vrsti ali so lahko tudi zmešani?

Muzo ::

IDji so po vrsti, mislim lahko so štirje enaki potem pa en drug, ampak ta prvi se potem ne pojavi več nikjer drugje. Za L1 oz L2 so pa nazivi licenc in so pojavljajo prav tako po vrsti, naprimer če se pojavi L1 dvakrat potem se znotraj tega IDja ta L1 ne pojavi več.

Hvala.. zgubljam živce, nikoli programiral :(

Če pomislim bi moral primerjat znotraj posameznega IDja vsako vrednost s spodnjo vrednostjo in ohraniti tisto vrstico, kjer je večji datum začetka oz. konca, eden od njiju pač... rajši konca.. ampak kako pa to napisati pa nimam pojma..

Zgodovina sprememb…

  • spremenil: Muzo ()

darkolord ::

Hoj, lahko dobim še malo več vrstic, da stestiram, če deluje kot je treba (še najbolj zamudno je na roko pisat te datume :D)

darkolord ::

OK, poskusi tole. Zadevo uporabiš tako, da označiš prvi stolpec podatkov (ID1, ID2,..) in poženeš funkcijo

tole je v glavnem modulu:

Option Explicit

Private CurrentLics As Collection
Private RowsToDelete As Collection

Sub BrisiStare()
    Dim tmpLic As License
    Dim IDs As Range
    Dim ID As Range
    Dim Lic As Range
    Dim CurrentID As String
    Dim CurrentL As String
    
    Set CurrentLics = New Collection
    Set RowsToDelete = New Collection
    Set IDs = Selection
    
    ' Vse oznacene vrstice
    For Each ID In IDs
        ' Prva vrstica
        If LenB(CurrentID) = 0 Then CurrentID = ID.Value
        
        Set Lic = ID.Offset(0, 1)
        If LenB(CurrentL) = 0 Then CurrentL = Lic.Value
        
        ' Ce je ID ali Licenca drugacna od prejsnje
        If CurrentL <> Lic.Value Or CurrentID <> ID.Value Then
            ' Oznaci vse razen najnovejse za brisanje
            DeleteOlderLicenses
            CurrentL = Lic.Value
            CurrentID = ID.Value
        End If
        
        ' Dodaj trenutno vrstico v zbirko
        Set tmpLic = New License
        tmpLic.EndDate = CDate(Lic.Offset(0, 2).Value)
        tmpLic.RowOffset = ID.Row
        
        CurrentLics.Add tmpLic
    Next ID
    
    ' Oznaci za brisanje
    DeleteOlderLicenses
    ' Brise vse vrstice, oznacene za brisanje
    DeleteAll
End Sub

Private Sub DeleteOlderLicenses()
    Dim tmpLic As License
    Dim latestDate As Date
    Dim i As Long
    
    If Not CurrentLics Is Nothing Then
        ' Poisce zadnji datum
        For Each tmpLic In CurrentLics
            If latestDate = 0 Then latestDate = tmpLic.EndDate
            If tmpLic.EndDate > latestDate Then
                latestDate = tmpLic.EndDate
            End If
        Next tmpLic
        
        ' Za brisanje oznaci vse vrsice, kjer je datum manjsi od zadnjega
        For Each tmpLic In CurrentLics
            If tmpLic.EndDate <> latestDate Then
                RowsToDelete.Add tmpLic.RowOffset
            End If
        Next tmpLic
        
        Set CurrentLics = New Collection
    End If
End Sub

Private Sub DeleteAll()
    Dim i As Long
    
    ' Brise vse oznacene vrstice v obratnem vrstnem redu
    If Not RowsToDelete Is Nothing Then
        For i = RowsToDelete.Count To 1 Step -1
            Rows(RowsToDelete(i)).Delete
        Next i
    End If
    Set RowsToDelete = Nothing
End Sub


Potem pa dodaj še en Class Module, ga poimenuj "License", in notri dodaj tole:

Option Explicit

Public RowOffset As Long
Public EndDate As Date

Zgodovina sprememb…

  • spremenilo: darkolord ()

Muzo ::

CAR si, tok da veš. Zadeva dela točno to, kar sem želel. Sedaj se bom pa spustil v razumevanje kode, ker bi nekoč tudi sam rad to znal. Si mi pa prihranil ogromno živcev!

Hvala res!

Muzo ::

Koda mi ni niti mal jasna :) Vem kaj delaš, ampak ne razumem kako zapisuješ vrednosti za primerjavo in se premikaš dol po vrsticah pa te zadeve..

če prav razumem mora biti zadeva znotraj L1, L2 sortirana naraščujoče po datumu ane?

darkolord ::

Ne, zadeva ni nujno da je sortirana po datumih... Nujno je samo, da grejo IDji in Lji znotraj IDja po vrsti...

Torej, ti označiš prvi stolpec. On se sprehodi navzdol po tem stolpcu in vsakič pogleda sosednjo celico (Lxx). Dokler je trenutni L in trenutni ID enak kot prejšnji, potem se številka vrstice skupaj z datumom doda v eno zbirko (CurrentLics). Ko pa pride do novega L ali ID, potem se požene funkcija DeleteOlderLicenses, ki se sprehodi skozi licence znotraj zbirke CurrentLics in vse, razen tiste z zadnjim datumom (ali več teh, če jih ima več enak (zadnji) datum), označi za brisanje tako, da številke vrstic doda v zbirko RowsToDelete.
Ko se sprehodi čez vse vrstice označenega stolpca, požene DeleteAll, ki v obratnem vrstnem redu izbriše vrstice - v nasprotnem primeru bi se namreč številke nalsednjih vrstic sproti spreminjale.

Muzo ::

Super ja :) Hvala, mi bo prišlo zelo prav.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Excel VBA sortiranje vrstic

Oddelek: Programiranje
5496 (375) ejresnevem
»

[C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene strani

Oddelek: Programiranje
212526 (2136) David1994
»

[excel]duplikati

Oddelek: Programiranje
81406 (1333) baksuz
»

[Visual studio .NET] Rabim pomoč

Oddelek: Programiranje
91520 (1362) darkolord
»

vkljucevanje txt datoteke v ...

Oddelek: Programiranje
131485 (1261) webblod

Več podobnih tem