Vba-silmukkafunktio

mansenmasa

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

11

559

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • mansenmasa

      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.

      • 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


      • mansenmasa
        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


      • ...
        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


      • ... 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... ;-)


      • ...
        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


      • mansenmasa
        ... 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


    • Eikös tuon saa laskettua ilman makroakin?

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


      • mansenmasa

        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


      • 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.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Yritystuet 10 mrd. vuodessa, eli yrittäjäriski valtiolla kuten kommunismissa

      Pelkästään Viking Linen viinanhakuristeilyitä sponsoroidaan 20 miljoonalla eurolla vuosittain. Dieselin verotukikin on
      Yrittäjyys
      63
      6783
    2. Pystyisitkö pitämään

      Näppejä erossa jos tulisi siihen tilaisuus
      Ikävä
      68
      6772
    3. Sture Fjäder haluaa tuensaajien nimet julki

      Kokoomuspoliitikko haluaa yli 800 euroa kuukaudessa tukia saavien nimet julki. Ehkä olisi syytä julkaista myös kuvat? h
      Maailman menoa
      146
      5434
    4. Luotathan siihen tunteeseen, joka välillämme on?

      Uskothan myös, että se kestää tämän? Kaipaan sinua valtavasti. Vielä tehdään yhdessä tästä jotain ihmeellistä ja kaunist
      Ikävä
      50
      4473
    5. En saa sua mielestäni vaikka tekisin mitä

      Mikä tähän auttaa.. ei mikään. Edes aika. Kaivan sut kohta vaikka kivenkolosta että saan kysyä haluatko sinäkin💛
      Ikävä
      20
      4089
    6. Onnettomuus

      Hukkajärventiellä kolaroi lavetti ja henkilöauto. Uutista ei missään! Hys hys ollaanko hiljaa tästäkin?
      Kuhmo
      5
      3640
    7. Milloin viimeksi näit kaivattusi?

      Toimisitko nyt toisin kuin siinä tilanteessa teit?
      Ikävä
      37
      3218
    8. Tuntuuko ettet tiedä

      Enää miten toimia mun suhteen. Kun en taida tietää itsekään
      Ikävä
      28
      3143
    9. Maahanmuuttajat torjuvat marjanpoiminnan - "emme ole rottia"

      Ruotsalaisen journalistin selvitys paljasti, miksi maahanmuuttajat kieltäytyvät työstä. Taustalla vaikuttavat kulttuuris
      Maailman menoa
      71
      2758
    10. Köysi alkaa kiristyä putinin kaulalla....

      Putin pelkää eniten juuri omaa porukkaansa, ja siihen on varmasti syytä kun sota ei ole mennyt hyvin, tappiot ovat valta
      Maailman menoa
      40
      2259
    Aihe