Tema: Re: Q. excel
Autorius: Raimis
Data: 2011-01-28 14:06:35
Niekaip neprisiversciau parasyti tiek kometaru :)

pagarba



"Juozas V." <vjuozas@istrinti.gmail.com> wrote in message 
news:1n55k6l5tesmes9c8fqusu78eug3qvdicp@4ax.com...
> On Fri, 28 Jan 2011 09:08:54 +0200, "Mindaugas" <nera@mailo.com> wrote:
>
>>Va cia tai ko reikia, didelis ACIU, bet ....  su mavo kukliom ziniom 
>>nepavyko perprasti kas, kur kaip ir kodel :((( o perprasti noretusu, kad 
>>galeciau ir kitokio tipo lentelej pritaikyti, ar elementariai iterpti 
>>stulpeli ar eilute...
>>
> Bandau pridėti komentarus ;)
>
> Type rws ' aprašo būsimos lentelės tipą
>  a As String
>  b As String
>  c As Variant
> End Type
>
> Sub SumUnique()
>  Dim LastRow As Long, MyRow As Long ' Last Row - paskutinė duomenų eilutė, 
> MyRow - skaičiuojama
>  Dim duom1 As String, duom2 As String, duom3 ' - nuskaitomi duomenys
>  Dim Result() As rws ' Lentelė, kurią procedūros pabaigoje išvedame į 
> ekraną
>  Dim n, i, Prideti As Boolean 'pagalbiniai kintamiejai
>  Application.ScreenUpdating = False ' išjungia ekrano perpiešimą ( 
> teoriškai turėtų būti greičiau atliekama procedūra)
>  n = 2
>  Prideti = True
>  LastRow = Range("A" & Rows.Count).End(xlUp).Row suranda paskutinę 
> lentelės eilutę. Atitinka, jei pasižymėtai paskutinę Sheeto celę
> (A65536), po to paspaustai "End" ir rodyklę į viršų
>  For MyRow = 2 To LastRow ' nuo antros iki paskutinės eilutės
>    duom1 = Cells(MyRow, 1).Value ' Nuskaito reikšmes A, B ir C 
> stulpeliuose
>    duom2 = Cells(MyRow, 2).Value
>    duom3 = Val(Cells(MyRow, 3).Value) ' Val funkcija paverčia skaičiumi 
> tekstinį įrašą. Jei bus "123A" gausi 123, jei "A123" ar "AA" tai 0
>    If MyRow = 2 Then 'jei eilutės nr. 2
>      ReDim Result(2 To 2) 'aktyvuoja lentelę Result
>      Result(2).a = duom1 ' ir surašo antros eilutės duomenis
>      Result(2).b = duom2
>      Result(2).c = duom3
>    Else ' jei eilutės numeris ne 2
>      For i = 2 To n ' tikrina A ir B stulpelio reikšmes su lentelės 
> reikšmėm
>        If (duom1 = Result(i).a) And (duom2 = Result(i).b) Then' jei randa 
> sutampančius
>          Result(i).c = Result(i).c + duom3 ' tai priplisuoja C stulpelio 
> reikšmę prie esamos
>          Prideti = False ' pakeičia kintamojo Prideti reikšmę (nebus 
> naujos eilutės lentelėje )
>          Exit For ' nutraukia procedūrą For (nebūtina eilutė, truputį 
> pagreitina darbą)
>        End If
>      Next i
>        If Prideti = True Then 'jei nebuvo rasta sutapimų
>          n = n + 1
>          ReDim Preserve Result(2 To n) 'prideda eilutę Result lentelėje
>          Result(n).a = duom1 ' ir surašo nuskaitytas reikšmes
>          Result(n).b = duom2
>          Result(n).c = duom3
>        End If
>        Prideti = True ' pakeičia Prideti reikšmę į pradinę
>    End If
>  Next MyRow
>  Range("A2:C" & LastRow).Delete ' ištrina duomenų lentelę
>  For MyRow = 2 To n ' ir surašo į tą vietą naujus duomenis iš Result()
>    Cells(MyRow, 1).Value = Result(MyRow).a
>    Cells(MyRow, 2).Value = Result(MyRow).b
>    Cells(MyRow, 3).Value = Result(MyRow).c
>  Next MyRow
>  Application.ScreenUpdating = True ' Įjungia ekrano perpiešimą
> End Sub ' Ir viskas