Vba-silmukkafunktio

Kertokaapa viisaammat, miten vba:lla tehdään sellainen "do untill"-silmukka, joka tallennetaan yleispäteväksi funktioksi, jonka voi sitten tarvittaessa valita Excelin "käyttäjän määrittämistä" funktioista. Ehdot ovat seuraavat: jos aiemmista laskutoimituksista saatu luku on pienempi kuin 0, siihen on lisättävä 24 niin monta kertaa että se saadaan välille 0-24, ja vastaavasti, jos kyseinen luku on suurempi kuin 24, siitä on vähennettävä 24 niin monta kertaa että se saadaan välille 0-24.

Olen aloittelija vba-ohjelmoinnissa, ja netistä löytämieni esimerkkien avulla sain muokatuksi seuraavan yritelmän, joka kyllä toimii nimetyssä solussa, jos vba-ikkunasta käsin painaa F5

Function Supistus()
Dim x As Variant
Do Until x > 0
x = Range("A1").Value
x = x 24
Range("A1").Value = x
Loop

Do Until x < 24
x = Range("P56").Value
x = x - 24
Range("A1").Value = x
Loop

End Function

Sellaista yleispätevää "käyttäjän määrittämää funktiota", jonka tarvitsen, en tästä saanut millään aikaiseksi.

Avusta kiitollinen
Masa
11598
Äänestä

Muut lukivat myös

Vastaukset 11

Vanhimmat

Tuossa omassa yritelmässäni luonnollisesti solu on aina sama, kaikissa siis pitää olla "A1" vaikka yhteen jäi vahingossa "P56", kun muutin kaavaa tänne lähetettäväksi.

Äänestä
  • soluun mihin haluat tuloksen kaava =Supistus(F1) ja muuttaa sitten soluun laskutuloksen tuloksen solu(F1) haluamallasi tavalla???
    Ja funktio löytyy normaalisti kaavavelhosta...

    moduuliin...

    Function Supistus(Arvo As Double) As Double
    Application.Volatile True
    If Arvo < 0 Then
    Do Until Arvo > 0
    Arvo = Arvo 24
    Loop
    ElseIf Arvo > 24 Then
    Do Until Arvo < 24
    Arvo = Arvo - 24
    Loop
    End If
    Supistus = Arvo
    End Functio

    Äänestä

  • kunde kirjoitti:

    soluun mihin haluat tuloksen kaava =Supistus(F1) ja muuttaa sitten soluun laskutuloksen tuloksen solu(F1) haluamallasi tavalla???
    Ja funktio löytyy normaalisti kaavavelhosta...

    moduuliin...

    Function Supistus(Arvo As Double) As Double
    Application.Volatile True
    If Arvo < 0 Then
    Do Until Arvo > 0
    Arvo = Arvo 24
    Loop
    ElseIf Arvo > 24 Then
    Do Until Arvo < 24
    Arvo = Arvo - 24
    Loop
    End If
    Supistus = Arvo
    End Functio

    Suurkiitos, tämä toimii! On vähän erilainen kuin odotin -- en arvannut, että "if -- then" pitää kuitenkin olla mukana, vaikka siinä on jo "do until".

    En voi muuta kuin ihastella Sinun ja muiden osaamista. Luin pari aloittelijan vba-opaskirjaa läpi ihan vain tätä varten ja yhden paksun formulakirjan, mutta en silti käsittänyt, mitä pitää tehdä. Mutta ehkäpä minäkin joskus.

    Masa

    Äänestä

  • mansenmasa kirjoitti:

    Suurkiitos, tämä toimii! On vähän erilainen kuin odotin -- en arvannut, että "if -- then" pitää kuitenkin olla mukana, vaikka siinä on jo "do until".

    En voi muuta kuin ihastella Sinun ja muiden osaamista. Luin pari aloittelijan vba-opaskirjaa läpi ihan vain tätä varten ja yhden paksun formulakirjan, mutta en silti käsittänyt, mitä pitää tehdä. Mutta ehkäpä minäkin joskus.

    Masa

    whilettämällä voi vällttää iffin

    Do while Arvo < 0
    Arvo = Arvo 24
    Loop
    print arvo

    Äänestä

  • ... kirjoitti:

    whilettämällä voi vällttää iffin

    Do while Arvo < 0
    Arvo = Arvo 24
    Loop
    print arvo

    ei voi toimi millään toi sun ehdotus... ;-)

    Äänestä

  • kunde kirjoitti:

    ei voi toimi millään toi sun ehdotus... ;-)

    Function Supistus(Arvo As Double) As Double
    Application.Volatile True
    Do While Arvo < 0
    Arvo = Arvo 24
    Loop
    Do While Arvo > 24
    Arvo = Arvo - 24
    Loop
    Supistus = Arvo
    End Functio

    Äänestä

  • ... kirjoitti:

    Function Supistus(Arvo As Double) As Double
    Application.Volatile True
    Do While Arvo < 0
    Arvo = Arvo 24
    Loop
    Do While Arvo > 24
    Arvo = Arvo - 24
    Loop
    Supistus = Arvo
    End Functio

    Kiitos myös ...:lle. Tämäkin funktio toimii. Testasin molempia vierekkäin, ja molemmilla saa aivan samat arvot.

    Masa

    Äänestä

Eikös tuon saa laskettua ilman makroakin?

Äänestä
  • mutta kysyjähän halusi käyttäjän oman funktion, joka löytyy kaavavelhosta...

    Äänestä

  • Kokeilin vielä uteliaisuuttani jakojäännöskaavaa. Onkohan itseisarvo siinä tarpeen? Kun en ensin saanut Exceliä hyväksymään kaavaa, jossa oli mukana itseisarvo, kokeilin pelkkää jakojäännöstä taas kahden edellisen kanssa rinnakkain, ja hienosti toimi. Onkohan jakojäännös aina luonnostaan positiivinen luku vai voiko se joskus olla negatiivinen? (Sitten onnistuin kyllä lisäämään jakojäännöksenkin.)

    Jakojäännösratkaisu onkin kätevin. Ähelsin kyllä aluksi pitkään funktioiden ja kaavojen kanssa, mutta kun en ole koskaan tarvinnut jakojäännösfunktiota, en tullut sitä ajatelleeksi, vaan yritin ratkaista ongelman turhan monimutkaisella tavalla rakentamalla oman funktion.

    Kiitos kaikille teille kolmelle avuliaalle. Paljon opin taas uutta teidän ansiostanne.

    Masa

    Äänestä

  • Calcilla vain pikaisesti kokeilin ja vaihdoin nuo funktioiden nimet suomalaisen excelin käyttämiksi. Niin näkyykin olevan, että jos jakaja on positiivinen, niin ei tuo jakojäännös mene Calcissakaan pakkaselle. Eli se ulkopuolinen itseisarvofunktio onkin tarpeeton antamallasi ehdolla. Pahoittelen aiheuttamaani ylimääräistä vaivaa ja "hyvittelen", että saatoin vähän auttaa.

    Äänestä

Kommentoi aloitusta


mansenmasa kirjoitti:

Kertokaapa viisaammat, miten vba:lla tehdään sellainen "do untill"-silmukka, joka tallennetaan yleispäteväksi funktioksi, jonka voi sitten tarvittaessa valita Excelin "käyttäjän määrittämistä" funktioista. Ehdot ovat seuraavat: jos aiemmista laskutoimituksista saatu luku on pienempi kuin 0, siihen on lisättävä 24 niin monta kertaa että se saadaan välille 0-24, ja vastaavasti, jos kyseinen luku on suurempi kuin 24, siitä on vähennettävä 24 niin monta kertaa että se saadaan välille 0-24.

Olen aloittelija vba-ohjelmoinnissa, ja netistä löytämieni esimerkkien avulla sain muokatuksi seuraavan yritelmän, joka kyllä toimii nimetyssä solussa, jos vba-ikkunasta käsin painaa F5

Function Supistus()
Dim x As Variant
Do Until x > 0
x = Range("A1").Value
x = x 24
Range("A1").Value = x
Loop

Do Until x < 24
x = Range("P56").Value
x = x - 24
Range("A1").Value = x
Loop

End Function

Sellaista yleispätevää "käyttäjän määrittämää funktiota", jonka tarvitsen, en tästä saanut millään aikaiseksi.

Avusta kiitollinen
Masa

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu