Desetice, enice

Pomoč pri delu z MS Excelom
Odgovori
bate
Prispevkov: 127
Pridružen: Če Mar 19, 2009 10:11 am

Desetice, enice

Odgovor Napisal/-a bate »

Zdravo,
Spet ne znam… Take oz. podobne teme na forumu nisem videl zato grem kar na vprašanje.

Prosim kakšna bi bila funkcija v VB , ki za dvomestna števila iz kolone 'C' v ustrezne celice 'D' in 'E' izpiše desetice in enice? Kako deklariram pred klicem te funkcije?

Za boljše razumevanje dajem približno del programa v Pascalu, ki to dela:

Koda: Izberi vse

…
Var  Desetice, Enice, kolona: integer;
     Stevilka        : array[10..100] of integer;
…  
For Kolona=10 to 100 do
Desetice := ((Stevilka[Kolona] DIV 10) MOD 10);
Enice    := (Stevilka]Kolona] MOD 10);
Writeln(Desetice,'  ',Enice);
End;
…
Upam, da nisem preveč zakompliciral...
Za odgovor se vnaprej zahvaljujem.

Lp, Brane
kljuka13
Prispevkov: 257
Pridružen: Po Sep 10, 2007 4:29 pm
Kraj: Maribor

Odgovor Napisal/-a kljuka13 »

Koda: Izberi vse

Dim i as Integer

For i  = 0 To 100
    Cells(i, 3).Value = (Cells(i, 2).Value - (Cells(i, 2).Value Mod 10)) / 10
    Cells(i, 4).Value = Cells(i, 2).Value Mod 10
Next i

Ni preizkušeno
[img]http://shrani.si/f/3t/YL/4W2P37B9/office.gif[/img]
[img]http://shrani.si/f/12/aa/1rt1wj6i/1/userbardionaea.gif[/img]
[img]http://shrani.si/f/3D/nN/3RQySBCl/vista-copy.gif[/img]
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Zakaj želite vse reševati v VBA-ju? To ni smisel Excela... Če uporabljate Excel uporabljate formule; VBA pa naj služi kot zadnja rešitev.

Koda: Izberi vse

[B1] =INT(A1/10) 
[C1] =MOD(A1;10)
lp,
Matjaž Prtenjak
Administrator
bate
Prispevkov: 127
Pridružen: Če Mar 19, 2009 10:11 am

Odgovor Napisal/-a bate »

Zdravo,
spoštovani g. Adm. in 'Kljuka' zahvaljujem se za vajina odgovora. Predloga rešitve sta načelno OK vendar želim funkcijo. Že zato, da se kaj naučim. Se bom malo mučil...
Knjiga od M.P. v knjižnici je izposojena že preko roka in ni šans, da jo dobim.

lp Brane
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

bate napisal/-a:Predloga rešitve sta načelno OK vendar želim funkcijo.
?? Pa saj vam je Kljuka napisal funkcijo!
lp,
Matjaž Prtenjak
Administrator
kljuka13
Prispevkov: 257
Pridružen: Po Sep 10, 2007 4:29 pm
Kraj: Maribor

Odgovor Napisal/-a kljuka13 »

Meni se zdi, da gospodu Bate-ju niso točno razjasnjeni vsi osnovni pojmi (funkcija, procedura, makro ...)

Funkcija je nek "makro", ki vrne določen podatek. Funkciji podate parametre in ona vrne nek podatek. Funkcije lahko uporabljate tudi na listu npr. =SUM(A1:A5) Funkciji z imenom SUM ste podali parameter - območje od A1 do A5 in ona bi vrnila seštevek.

Procedura oz. nek makro pa je podobno kot funkcija, le da nič ne vrne. Ko poženete neko proceduro, makro, le-ta izvede neko dejanje in se konča.

Torej prva možnost, ki jo lahko uporabite so funkcije na samem listu:

Koda: Izberi vse

[B1] =INT(A1/10)
[C1] =MOD(A1;10) 
Druga možnost je makro (procedura), ki jo vpišete v VBA okno in poženete. Le-ta bo v celice vpisala nek podatek:

Koda: Izberi vse

Sub razbij()
Dim i as Integer

For i  = 0 To 100
    Cells(i, 3).Value = (Cells(i, 2).Value - (Cells(i, 2).Value Mod 10)) / 10
    Cells(i, 4).Value = Cells(i, 2).Value Mod 10
Next i
End Sub 
Še bi se našla kakšna rešitev ampak to sedaj ni pomembno.

P.S. Mogoče sem vas malo zmedel, ker sem vam v mojem prvem odgovoru napisal le "kodo", brez začetka in konca procedure.
[img]http://shrani.si/f/3t/YL/4W2P37B9/office.gif[/img]
[img]http://shrani.si/f/12/aa/1rt1wj6i/1/userbardionaea.gif[/img]
[img]http://shrani.si/f/3D/nN/3RQySBCl/vista-copy.gif[/img]
bate
Prispevkov: 127
Pridružen: Če Mar 19, 2009 10:11 am

Odgovor Napisal/-a bate »

Zdravo,
Me veseli, da se komu da ukvarjati z nekom, ki ne 'razume'. Razliko med funkcijo in formulo poznam. Prva vrne nek rezultat in jo kličemo, druga je neposredno v celici in ima predznak '='. Funkcijo želim uporabljati z različnimi podatki in v različnih obsegih! Predlagane funkcije pa vsebujejo konkretne podatke 'A1', 'B1', zanko '0 to 100' itd, torej je uporabna le za te podatke!? Ali je treba za drugačne podatke vsakič popravljati funkcijo?

V mojem prvem vprašanju nisem hotel dolgoveziti in sem ga skrajšal, da bi bilo bolj razumljivo. Zdaj ga moram dopolniti.
Naj povem, da 'Enice' in 'Desetice' seštevam – numerološko - in to v kar obsežni tabeli, ki se stalno povečuje. Torej 'For Each ' zanka za neznan obseg. Če je rezultat >=10, vajo ponovim, dokler ne dobim enomestnega števila. Formula bi bila maratonska, bil bi potreben kakšen vgnezden krožni sklic, 'If' stavek… – skratka štala.
Se opravičujem za teženje, ampak ne morem pomagati.
Upam , da je zdaj bolj razumljivo.

Lp Brane
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:( Tole kar govorite ne drži ravno saj razlike med funkcijo in formulo ni - no zelo zelo strogo strokovno gledano je, vendar za uporabnika nobene.

Predvsem pa se motite glede obsegov in podobnega... Tako opažam, da vas to zelo moti že skozi vsa vaša vprašanja. Stvar je skrajno preprosta. Če vnaprej veste, da se nekaj ne bo spreminjalo (da je torej konstanta), potem to pač "zapečete" v funkcijo. Če pa je podatek variabilen, pa ga ne zapečete v funkcijo temveč ga podate kot parameter.

Tudi glede povečevanja tabele je v Excelu vse lepo rešeno. Ko vi vnesete novo vrstico podatkov, pač lepo iz prejšnje vrstice skopirajte tudi formule in vse je OK. Večina uporabnikov pa delala ravno obratno (efekt je seveda isti). Formule vnaprej skopirajo npr. v prvih 5000 vrstic in ko vnašajo podatke, se jim formule avtomatično pravilno računajo. Svetujem vam, da si izposodite kakšno knjigo o Excelu, ker se vseskozi trudite, da bi ga uporabljali drugače, kot je namen njegove uporabe in tako skačete iz problema v problem, namesto, da bi vam Excel te probleme reševal.

In tudi numerološko seštevanje je povsem trivialen problem in formula nikakor ni maratonska ... Spodaj vam bom napisal VBA funkcijo, ki sprejme poljubno celo število in sešteva njegove cifre dokler ne dobi enomestnega števila.

Koda: Izberi vse

Function SestejCifre(Vhod As Long) As Long
  If (Vhod < 0) Then
    SestejCifre = 0
    Exit Function
  End If
  
  If (Vhod < 10) Then
    SestejCifre = Vhod
    Exit Function
  End If
    
  Dim sestevek As Long
  sestevek = 0
  While (Vhod > 0)
    sestevek = sestevek + Vhod Mod 10
    Vhod = Vhod / 10
  Wend
  
  SestejCifre = SestejCifre(sestevek)
End Function
Torej ta funkcija vam sešteje cifre poljubnega celega števila (manjšega od 4 miliarde) in ne samo dvomestnega.

Da pa vam v tem sporočilu še enkrat dokažem, da so funkcije in formule enakovredne, naredite sledeče:
  1. Skopirajte funkcijo v VBA urejevalnik
  2. Pojdite nazaj v Excel in v celico A1 vpišite 44121
  3. V celico B1 vpišite formulo =sestejCifre(A1) in excel bo izpisal rezultat 3!
Res vam svetujem, da si najprej izposodite knjigo o Excelu (99% uporabnikov Excela nikoli ne potrebuje VBA-ja!) :?
lp,
Matjaž Prtenjak
Administrator
bate
Prispevkov: 127
Pridružen: Če Mar 19, 2009 10:11 am

Odgovor Napisal/-a bate »

Zdravo,
g. Adm. najlepše se zahvaljujem za funkcijo. Bilo je res expresno. Klobuk dol...
Morda se je ravno zaradi hitrosti prikradel kakšen škrat.
Funkcijo sem preiskusil tako, da sem preko strani sem 'potegnil' številke od 1 do 45 in pod njih skopiral formulo '=SestejCifre(ta in ta)'. Rezultati so bili v glavnem pravilni razen od 15-19, 26-29, 36-39. Poskušal sem najti hrošča, a brez uspeha. Moram vas prositi za 'popravilo'. Prepričan sem, da boste 'odšuba' našli catch.

lp Brane
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Jap, :oops:; napaka je čisto tipkarska. namesto:

Koda: Izberi vse

    Vhod = Vhod / 10
Mora pisati:

Koda: Izberi vse

    Vhod = Vhod \ 10
lp,
Matjaž Prtenjak
Administrator
bate
Prispevkov: 127
Pridružen: Če Mar 19, 2009 10:11 am

Odgovor Napisal/-a bate »

Zdravo,
jes! Zdaj deluje točno po mojih željah. Pojavil pa se je drug problem-ček. Ko sem formulo skopiral preko tabele kjer še ni podatkov, so v celicah same ničle. Kako se teh ničel znebim, s tem, da formule ostanejo?
Upam, da bom dal potem nekaj časa mir...
Se vnaprej in za nazaj lepo zahvaljujem.

lp Brane
cedra
Prispevkov: 264
Pridružen: Po Jul 25, 2005 11:11 pm
Kraj: Kamnik

Odgovor Napisal/-a cedra »

Takole:

Koda: Izberi vse

=IF(ISBLANK(A1);"";SestejCifre(A1))
lp,

cedra
bate
Prispevkov: 127
Pridružen: Če Mar 19, 2009 10:11 am

Odgovor Napisal/-a bate »

Zdravo,
thank's 'Cedra'.
Pantha Rhei! (gr. 'in vendar se premika, deluje...').

lp Brane
Odgovori