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 | 648 (527) | ejresnevem |
| » | [C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene straniOddelek: Programiranje | 2888 (2498) | David1994 |
| » | [excel]duplikatiOddelek: Programiranje | 1621 (1548) | baksuz |
| » | [Visual studio .NET] Rabim pomočOddelek: Programiranje | 1719 (1561) | darkolord |
| » | vkljucevanje txt datoteke v ...Oddelek: Programiranje | 1712 (1488) | webblod |