..|| Blog || Produkti/Storitve || MExcel || MDodatki || 300 nasvetov ||..

Desetice, enice

Pomoč pri delu z MS Excelom

Desetice, enice

OdgovorNapisal/-a bate » Po apr 27, 2009 10:10 am

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
bate
 
Prispevkov: 127
Pridružen: Če mar 19, 2009 10:11 am



Matjazev.NET
 

OdgovorNapisal/-a kljuka13 » Po apr 27, 2009 11:20 am

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
Slika
Slika
Slika
kljuka13
 
Prispevkov: 257
Pridružen: Po sep 10, 2007 4:29 pm
Kraj: Maribor

OdgovorNapisal/-a admin » Po apr 27, 2009 8:32 pm

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
admin
Site Admin
 
Prispevkov: 3415
Pridružen: Sr jul 20, 2005 10:06 pm

OdgovorNapisal/-a bate » Po apr 27, 2009 11:24 pm

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
bate
 
Prispevkov: 127
Pridružen: Če mar 19, 2009 10:11 am

OdgovorNapisal/-a admin » To apr 28, 2009 7:55 am

bate je napisal/-a:Predloga rešitve sta načelno OK vendar želim funkcijo.

?? Pa saj vam je Kljuka napisal funkcijo!
lp,
Matjaž Prtenjak
Administrator
admin
Site Admin
 
Prispevkov: 3415
Pridružen: Sr jul 20, 2005 10:06 pm

OdgovorNapisal/-a kljuka13 » To apr 28, 2009 9:49 am

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.
Slika
Slika
Slika
kljuka13
 
Prispevkov: 257
Pridružen: Po sep 10, 2007 4:29 pm
Kraj: Maribor

OdgovorNapisal/-a bate » To apr 28, 2009 1:55 pm

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
bate
 
Prispevkov: 127
Pridružen: Če mar 19, 2009 10:11 am

OdgovorNapisal/-a admin » To apr 28, 2009 2:34 pm

:( 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
admin
Site Admin
 
Prispevkov: 3415
Pridružen: Sr jul 20, 2005 10:06 pm

OdgovorNapisal/-a bate » To apr 28, 2009 7:38 pm

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
bate
 
Prispevkov: 127
Pridružen: Če mar 19, 2009 10:11 am

OdgovorNapisal/-a admin » To apr 28, 2009 8:00 pm

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
admin
Site Admin
 
Prispevkov: 3415
Pridružen: Sr jul 20, 2005 10:06 pm

OdgovorNapisal/-a bate » To apr 28, 2009 8:32 pm

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
bate
 
Prispevkov: 127
Pridružen: Če mar 19, 2009 10:11 am

OdgovorNapisal/-a cedra » To apr 28, 2009 10:06 pm

Takole:
Koda: Izberi vse
=IF(ISBLANK(A1);"";SestejCifre(A1))
lp,

cedra
cedra
 
Prispevkov: 263
Pridružen: Po jul 25, 2005 11:11 pm
Kraj: Kamnik

OdgovorNapisal/-a bate » To apr 28, 2009 10:56 pm

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

lp Brane
bate
 
Prispevkov: 127
Pridružen: Če mar 19, 2009 10:11 am


Vrni se na Excel

Kdo je prisoten

Po forumu brska: 0 registriranih uporabnikov in 0 gostov

cron