Jos solun arvo kasvaa tietyllä aikavälillä?

Anonyymi

Miten teen kaavan, jos esim. solun D10 arvo kasvaa kahden eri päivämäärän välillä. Siis tarkennusta; jos solun D10 arvo kasvaa tietyllä aikavälillä, solun arvo esim. G20 kasvaa 1:llä. Jos solun D10 arvo ei kasva tietyllä aikavälillä, solu G20 ei kasva? Päivämäärät esim. soluissa D11 ja D12.

15

146

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Kaavoilla ei voi tutkia muutoksia. On käytettävä makroa. Seuraava ko. sivun moduliin:

      Private Sub Worksheet_Change(ByVal Target As Range)
      on error goto virhe:
          alue = Range("D10")
          ' alue = Union(alue, Range("D8"), jne...)
          If Not Intersect(Target, alue) Is Nothing Then
              If Date >= Range("D11") And Date <= Range("D12") Then
                  talle = Target.Formula
                  Application.EnableEvents = False
                  Application.Undo
                  vanhaArvo = Range("D10").Value
                  Target.Formula = talle
                  If Range("D10") > vanhaArvo Then Range("G20") = Range("G20") + 1
              End If
          End If
      virhe:
          Application.EnableEvents = True
      End Sub

      Jos solussa D10 on kaava, sen arvoon vaikuttavat solut lisätään tarkkailtavaan alueeseen rivillä 3. Soluissa D11 ja D12 on aikarajat, esim. 3.6.2020 ja 4.6.2020. Jos solussa D10 oleva arvo kasvaa vaikka tänään 3.6., solun G20 arvoa kasvatetaan.

    • Anonyymi

      Siis lisätään rivillä 4

      • Anonyymi

        Kiitos, mutta en saanut toimimaan. Hiukan on tietämystä VBA:sta. Tuossahan tulee kehäviittaus. Salliiko VBA sen?


      • Anonyymi
        Anonyymi kirjoitti:

        Kiitos, mutta en saanut toimimaan. Hiukan on tietämystä VBA:sta. Tuossahan tulee kehäviittaus. Salliiko VBA sen?

        Ei toiminut ollenkaan, vai ei tovotusti?
        Laitoitko makron kenties sivun modulin sijaan tavalliseen?
        Oletko koettanut ajaa makroa askeltaen?
        Missä tulee kehäviittaus?


      • Anonyymi
        Anonyymi kirjoitti:

        Kiitos, mutta en saanut toimimaan. Hiukan on tietämystä VBA:sta. Tuossahan tulee kehäviittaus. Salliiko VBA sen?

        Set jäi puuttumaan riviltä 3 (ja 4):
        Set alue = Range("D10")


      • Anonyymi
        Anonyymi kirjoitti:

        Set jäi puuttumaan riviltä 3 (ja 4):
        Set alue = Range("D10")

        Nyt sain toimimaan korjatulla koodilla (Set puuttui, kiitos paljon).

        Private Sub Worksheet_Change(ByVal Target As Range)

        On Error GoTo virhe:
        Set alue = Range("D10")
        ' Set alue = Union(alue, Range("D8"), jne...)
        If Not Intersect(Target, alue) Is Nothing Then
        If Date >= Range("D11") And Date <= Range("D12") Then
        talle = Target.Formula
        Application.EnableEvents = False
        Application.Undo
        vanhaArvo = Range("D10").Value
        Target.Formula = talle
        If Range("D10") > vanhaArvo Then Range("G20") = Range("G20") + 1
        End If
        End If
        virhe:
        Application.EnableEvents = True

        End Sub

        Nyt kun tämä onnistui, veisin tätä hieman pidemmälle. Nuo solut heitin esimerkin vuoksi, mutta saako tästä koodista muokattua samanlaista kuin jos kopioisi kaavaa alaspäin täyttökahvalla? Minulla on 42 solua sarakkeessa, jossa tämä vertailu tulisi tehdä, (tietenkään nuo päivämäärä solut eivät olisi tuossa alla) ja myöskin tuo esimerkissä oleva G20 tulisi jatkumaan myös 42:ssa solussa alaspäin. Jos nyt yritän tarkentaa tuosta esimerkistä, niin solut D10 ja G20 olisivat vierekkäin esim. D10 ja E10. Vai joudunko tylysti kirjoittamaan jokaisen ehdon erikseen.


      • Anonyymi
        Anonyymi kirjoitti:

        Nyt sain toimimaan korjatulla koodilla (Set puuttui, kiitos paljon).

        Private Sub Worksheet_Change(ByVal Target As Range)

        On Error GoTo virhe:
        Set alue = Range("D10")
        ' Set alue = Union(alue, Range("D8"), jne...)
        If Not Intersect(Target, alue) Is Nothing Then
        If Date >= Range("D11") And Date <= Range("D12") Then
        talle = Target.Formula
        Application.EnableEvents = False
        Application.Undo
        vanhaArvo = Range("D10").Value
        Target.Formula = talle
        If Range("D10") > vanhaArvo Then Range("G20") = Range("G20") + 1
        End If
        End If
        virhe:
        Application.EnableEvents = True

        End Sub

        Nyt kun tämä onnistui, veisin tätä hieman pidemmälle. Nuo solut heitin esimerkin vuoksi, mutta saako tästä koodista muokattua samanlaista kuin jos kopioisi kaavaa alaspäin täyttökahvalla? Minulla on 42 solua sarakkeessa, jossa tämä vertailu tulisi tehdä, (tietenkään nuo päivämäärä solut eivät olisi tuossa alla) ja myöskin tuo esimerkissä oleva G20 tulisi jatkumaan myös 42:ssa solussa alaspäin. Jos nyt yritän tarkentaa tuosta esimerkistä, niin solut D10 ja G20 olisivat vierekkäin esim. D10 ja E10. Vai joudunko tylysti kirjoittamaan jokaisen ehdon erikseen.

        Päivämäärät ovat nyt B-sarakkeessa. Makro tarkkailee D-sarakkeen soluja riveillä 10...51. Enää ei oteta huomioon sitä tapausta, että niiden arvo muuttuu välillisesti laskennan seurauksena. Kasvava laskuri on nyt muuttuvan solun oikealla puolella. Aktiiviseksi jää se solu, mikä olisi ilman makroakin jäänyt.

        Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo virhe:
            
            Set alue = Range("D10:D51")
            If Not Intersect(Target, alue) Is Nothing Then
                If Date >= Range("B11") And Date <= Range("B12") Then
                    Set nyt = Selection
                    talle = Target.Formula
                    r = Target.Row
                    Application.EnableEvents = False
                    Application.Undo
                    vanhaArvo = Target.Value
                    Target.Formula = talle
                    If Target > vanhaArvo Then Cells(r, "E") = Cells(r, "E") + 1
                    nyt.Select
                End If
            End If
        virhe:
            Application.EnableEvents = True
        End Sub

        Seuraava ottaa huomioon myös välilliseti muuttuneet arvot, mutta on vähän hitaanpuoleinen. Tarkkailatava alue otetaan talteen ja katsotaan, oliko joku kasvanut kun mitä tahansa solua muutettiin.

        Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo virhe:
            Dim arvot(41)
            Dim kaavat(41) As String
            uusi = Target.Formula
            If Date >= Range("B11") And Date <= Range("B12") Then
                For i = 0 To 41
                    arvot(i) = Cells(i + 10, "D")
                    kaavat(i) = Cells(i + 10, "D").Formula
                Next
                Application.EnableEvents = False
                Application.Undo
                For i = 0 To 41
                    If arvot(i) > Cells(i + 10, "D") Then Cells(i + 10, "E") = Cells(i + 10, "E") + 1
                Next
                For i = 0 To 41
                    Cells(i + 10, "D").Formula = kaavat(i)
                Next
            End If
            Target.Select
            Target.Formula = uusi
        virhe:
            Application.EnableEvents = True
        End Sub


      • Anonyymi
        Anonyymi kirjoitti:

        Päivämäärät ovat nyt B-sarakkeessa. Makro tarkkailee D-sarakkeen soluja riveillä 10...51. Enää ei oteta huomioon sitä tapausta, että niiden arvo muuttuu välillisesti laskennan seurauksena. Kasvava laskuri on nyt muuttuvan solun oikealla puolella. Aktiiviseksi jää se solu, mikä olisi ilman makroakin jäänyt.

        Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo virhe:
            
            Set alue = Range("D10:D51")
            If Not Intersect(Target, alue) Is Nothing Then
                If Date >= Range("B11") And Date <= Range("B12") Then
                    Set nyt = Selection
                    talle = Target.Formula
                    r = Target.Row
                    Application.EnableEvents = False
                    Application.Undo
                    vanhaArvo = Target.Value
                    Target.Formula = talle
                    If Target > vanhaArvo Then Cells(r, "E") = Cells(r, "E") + 1
                    nyt.Select
                End If
            End If
        virhe:
            Application.EnableEvents = True
        End Sub

        Seuraava ottaa huomioon myös välilliseti muuttuneet arvot, mutta on vähän hitaanpuoleinen. Tarkkailatava alue otetaan talteen ja katsotaan, oliko joku kasvanut kun mitä tahansa solua muutettiin.

        Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo virhe:
            Dim arvot(41)
            Dim kaavat(41) As String
            uusi = Target.Formula
            If Date >= Range("B11") And Date <= Range("B12") Then
                For i = 0 To 41
                    arvot(i) = Cells(i + 10, "D")
                    kaavat(i) = Cells(i + 10, "D").Formula
                Next
                Application.EnableEvents = False
                Application.Undo
                For i = 0 To 41
                    If arvot(i) > Cells(i + 10, "D") Then Cells(i + 10, "E") = Cells(i + 10, "E") + 1
                Next
                For i = 0 To 41
                    Cells(i + 10, "D").Formula = kaavat(i)
                Next
            End If
            Target.Select
            Target.Formula = uusi
        virhe:
            Application.EnableEvents = True
        End Sub

        Jälkimmäisessä meni väärin oikean solun palauttaminen aktiivseksi. Muutos pitää ottaa muistiin ennen sen perumista:

        Set nyt = Selection

        ja palauttaa lopussa.
        nyt.Select


      • Anonyymi
        Anonyymi kirjoitti:

        Päivämäärät ovat nyt B-sarakkeessa. Makro tarkkailee D-sarakkeen soluja riveillä 10...51. Enää ei oteta huomioon sitä tapausta, että niiden arvo muuttuu välillisesti laskennan seurauksena. Kasvava laskuri on nyt muuttuvan solun oikealla puolella. Aktiiviseksi jää se solu, mikä olisi ilman makroakin jäänyt.

        Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo virhe:
            
            Set alue = Range("D10:D51")
            If Not Intersect(Target, alue) Is Nothing Then
                If Date >= Range("B11") And Date <= Range("B12") Then
                    Set nyt = Selection
                    talle = Target.Formula
                    r = Target.Row
                    Application.EnableEvents = False
                    Application.Undo
                    vanhaArvo = Target.Value
                    Target.Formula = talle
                    If Target > vanhaArvo Then Cells(r, "E") = Cells(r, "E") + 1
                    nyt.Select
                End If
            End If
        virhe:
            Application.EnableEvents = True
        End Sub

        Seuraava ottaa huomioon myös välilliseti muuttuneet arvot, mutta on vähän hitaanpuoleinen. Tarkkailatava alue otetaan talteen ja katsotaan, oliko joku kasvanut kun mitä tahansa solua muutettiin.

        Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo virhe:
            Dim arvot(41)
            Dim kaavat(41) As String
            uusi = Target.Formula
            If Date >= Range("B11") And Date <= Range("B12") Then
                For i = 0 To 41
                    arvot(i) = Cells(i + 10, "D")
                    kaavat(i) = Cells(i + 10, "D").Formula
                Next
                Application.EnableEvents = False
                Application.Undo
                For i = 0 To 41
                    If arvot(i) > Cells(i + 10, "D") Then Cells(i + 10, "E") = Cells(i + 10, "E") + 1
                Next
                For i = 0 To 41
                    Cells(i + 10, "D").Formula = kaavat(i)
                Next
            End If
            Target.Select
            Target.Formula = uusi
        virhe:
            Application.EnableEvents = True
        End Sub

        Kiitos paljon.

        Nämä molemmat toimivat kuten olin ajatellut, tosin en ymmärrä mitä eroa näillä on, enkä huomannut hitautta jälkimmäisessä koodissa (lisäsin nuo Set nyt = Selection ja nyt.Select).


    • Anonyymi

      Voiko tuon kysymyksen tiivistää näin:

      Vain, jos solun arvo kasvaa tietyllä aikavälillä, solun (A1) arvo kasvaa yhdellä.

    • Anonyymi

      Tämän varmasti voi toteuttaa formulalla, mutta vähän on hankala ymmärtää mitä tarkalleen pitää saada tapahtumaan.

      Oletan että halutaan seuravaa: Kun päiväykset ovat sarakkeessa X ja niihin liittyvä data on sarakkeessa Y ja "lisäyksenkertymä" on sarakkeessa Z ja:

      1) X-data kasvaa X vuorokaudella alaspäin
      2) Y -data on jotain dataa joka liittyy X-päiväyksiin, ja Y-data joka kasvaa tai ei kasva (mutta ei pienene)
      3) Z-data on haluttu kasvamistapahtumien binäärinen summafunkio

      Niin ensin asetetaan:

      X1: paivämäärä n:o 1
      Y1: ko päivämäärn data
      Z1: 0.00

      ja sitten:

      X2: seuraava päivämäärä
      Y2: data joka liittyy X2:ssa olevaan päivämäärään
      Z2: =IF(Y2>Y1, Z1+1, Z1)

      Cellin Z2 (jossa haluttu bimäärikertymäfunktio on) voi sitten täyttökahvalla vetää alaspäin (mutta helpompaa on vain valita celli Z2 ja sitten 2clikata sitä pientä suorakulmaista täppää joka on valitun cellin valinta-indikaattorin oikeassa alakulmassa).

      Huom: Minun Excel on nykinkielellä, Suomessa parametrierotin lienee (en jaksa kokeilla) ";" mutta minulla se on "," ja desimaalierotin minulla on "." kun se Suomessa on ",". Nämä siis huomioitava Z2 formulassa. Suomalaiset asetukset Excelissä ovat lähes poikkeuksetta todella hankalat jos enempi käyttää suuresta maalimasta pudotettuja worksheettejä tai VBA satseja.

      Excelissä on järkyttävän laaja tilastomatematiikan kaskujoukko/funktiojoukko ihan sellaisenaan, kunhan asennuspakkaan sisältyvä(t ) "Data Analysis ToolPak" add-ins VBA(t) on "liitetty"), ja lisäksi verkossa on tarjolla valtava määrä päihdyttävän korkealuokkaisia ilmaisia VBA sovelluksia niitä täydentämään, tarvittaessa. Mutta jos on kyse jostain yksinkertaisesta tilastomatematiikasta, kuten Suomessa tapahtuvan perhosen siipien läpsahdyksen vaikutuksesta Kiinan populaation keski-iän muutokseen läpsähdystä seuraavien 100 vuoden aikana, niin sellaisiin Excelissä on ihan itsessään ylenmäärin paukkuja. Excelin kaikki tilastomatematiikan työkalut ovat lisäksi ao tieteenalan kaikkein kovinta ydintä, nykypäivänä on hieman työlästä kehittää uusia/parempia tilastomatemaattisia arviointi/analyysifunktiota.

      • Anonyymi

        Tässä ei liene kyse mistään tilastomatematiikasta.


      • Anonyymi
        Anonyymi kirjoitti:

        Tässä ei liene kyse mistään tilastomatematiikasta.

        Ei tuo edusta mitään matematiikkaa eikä myöskään tarjoa ratkaisua mihinkään, vaan puhtaasti koko viesti edustaa snoppailua termeillä.

        Cell = Solu
        Cellin = Solun

        ja niin edespäin.


      • Anonyymi
        Anonyymi kirjoitti:

        Tässä ei liene kyse mistään tilastomatematiikasta.

        "Tässä ei liene kyse mistään tilastomatematiikasta."

        No mistä siten on kysymys?

        Jos muuttuu niin +1, jos ei muutu niin +0.

        Se on (todella alkeellinen) binäärikertymäfunktio. Joiden tarkastelua varten Excelissä on useita, valtavasti kehittyneempiä, taatusti matemaattisesti virhettömiä, kaskuja/funktiota.


      • Anonyymi
        Anonyymi kirjoitti:

        "Tässä ei liene kyse mistään tilastomatematiikasta."

        No mistä siten on kysymys?

        Jos muuttuu niin +1, jos ei muutu niin +0.

        Se on (todella alkeellinen) binäärikertymäfunktio. Joiden tarkastelua varten Excelissä on useita, valtavasti kehittyneempiä, taatusti matemaattisesti virhettömiä, kaskuja/funktiota.

        Olet oikeassa, se todella on alkeellinen. Nykyään ei vain enää pärjätä missään niin alkeellisilla "matemaattisilla" taidoilla. Nykyiset funktiot sisältävät miljoonia tuon tasoisia vertailuja. Noilla taidoilla/tiedoilla pärjäsi silloin kun ei vielä tiedetty transistorista mitään.


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

    Luetuimmat keskustelut

    1. Raivoaako Putin, kun Suomi hyväksytään naton jäseneksi

      https://www.is.fi/politiikka/art-2000008913259.html "Kommentti: Madridista jysähti sittenkin – Suomi kutsutaan Naton jäseneksi jo keskiviikkona Lähes
      NATO
      302
      3389
    2. Miten olette pärjänneet kuumuuden kanssa?

      Viime yö oli trooppisen lämmin ja kämpässä kuuma. Heräilin vähän väliä kuumuuden takia vaikka nukuin pelkkä lakana päällä. Täkin heitin jo viime viiko
      Maailman menoa
      340
      3203
    3. Rydman "elämäni hirveimmät päivät" Entäs uhrisi?!

      https://yle.fi/uutiset/3-12515383 Rydman valittelee että vaikeaa on ollut kun jäänyt kiinni mutta entäs uhrisi? Ei yhtään empatiaa uhreja kohtaan!
      Maailman menoa
      151
      1907
    4. Nakkilassa on raiskattu wanhus

      Wanhus on raiskattu nakkilassa palvelutalossa. ( näin uutisoivat molemmat iltapäivälehdet sekä yle )
      Nakkila
      40
      1551
    5. No aloititko sä jo suhteen

      sen toisen ihailijasi kanssa? Sen jonka kanssa sulla oli jotain vispiläkauppaa? Olenko jo unohdettu ja tarpeeton?
      Ikävä
      150
      1272
    6. Mitä oikein odotat?

      Rehellisiä vastauksia sitten vain.
      Ikävä
      112
      1137
    7. JA SIEPIN VALITUS ALKOI TAAS

      Siepin unelma-asunnossa oli hajonnut ilmalämpöpumppu, jonka takia hän joutui lähtemään kuumuutta pakoon ylelliseen hotelliin. mutta voi kauhistus, k
      Kotimaiset julkkisjuorut
      107
      1021
    8. Totuus on että

      Se kaikki sattui ihan vit**ti koska mä tykkään susta todella paljon. Oikeesti tosi paljon. Menin ihan pois raiteilta enkä tajua tätä itekään. Oon mä j
      Ikävä
      34
      859
    9. Turkki tukee Suomen Nato-jäsenyyttä

      Kuinkas trollien suuhun nyt pannaan? 🤣 Juttua aiheesta löytyy kohta kaikista mahdollisista uutislähteistä. Mahtava homma!🫡🥳
      Maailman menoa
      383
      838
    10. Natoon liittymisen hinta kova.

      Suomi joutuu luovuttamaan kurdeja Turkkiin, maksoiko Suomen Nato-jäsenyys monien kymmenien ihmisten vankeus ja kidutuskohtalon vai peräti kuoleman. ht
      Maailman menoa
      228
      742
    Aihe