Forum » Programiranje » [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!
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!
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..
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 )
darkolord ::
OK, poskusi tole. Zadevo uporabiš tako, da označiš prvi stolpec podatkov (ID1, ID2,..) in poženeš funkcijo
tole je v glavnem modulu:
Potem pa dodaj še en Class Module, ga poimenuj "License", in notri dodaj tole:
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!
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?
č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.
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.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Excel VBA sortiranje vrsticOddelek: Programiranje | 556 (435) | ejresnevem |
» | [C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene straniOddelek: Programiranje | 2752 (2362) | David1994 |
» | [excel]duplikatiOddelek: Programiranje | 1483 (1410) | baksuz |
» | [Visual studio .NET] Rabim pomočOddelek: Programiranje | 1602 (1444) | darkolord |
» | vkljucevanje txt datoteke v ...Oddelek: Programiranje | 1586 (1362) | webblod |