Excel-makro hakusessa

jelppiä

Minulla on kaava, jota täytyisi käyttää useampaan kertaan vaihtelevalle rivimäärälle. Kyseessä on siis urheilukilpailujen pisteytys, jossa käytettävä kaava on 1000-(kilpailijan aika - voittajan aika)/voittajan aika*1000. Kilpailijoita on joka viikko eri määrä ja kaava pitäisi saada toimimaan kahdelle eri sarjalle. Sarjat ovat taulukossa allekkain eli toisen sarjan paikka taulukossa riippuu ensimmäisen kilpailijamäärästä.
Olen saanut aikaan makron, jolla ensimmäisen sarjan pisteet saadaan laskettua. Kyseinen makro alkaa aina samasta solusta (koska ensimmäinen sarja alkaa aina samasta paikasta) ja pitäisi päättyä sitten kun se kohtaa tyhjän rivin. Tosin nykyisellään se päättyy aina yhden rivin liian aikaisin. Tässä väsäämäni makro, jonka ensimmäinen tulos tulee soluun F4:

Sub Testimakro_A()
Do While Not IsEmpty(ActiveCell.Offset(1, -2))
ActiveCell.FormulaR1C1 = "=1000-(RC4-R4C4)/R4C4*1000"
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Ongelmia aiheuttaa toisen sarjan pisteytys, sillä se alkaa aina eri kohdasta. Makron pitäisi siis alkaa valitusta solusta ja päättyä kohdatessaan tyhjän rivin. Millä keinolla makron saa alkamaan valitusta solusta?

Niin ja tuloksethan jakautuvat sarakkeisiin aina näin: A = sijaluku, B = Nimi, C = tyhjä, D = kilpailijan aika, E = ero voittajaan, F = pistemäärä.

8

973

    Vastaukset 8

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • jelppiä

      Ehkä tuo edellinen oli turhan epäselvästi kirjoitettu, kun ei ole kuulunut vastauksia. Yritetäänpäs selvemmin.
      Eli minulla on tuo ylläoleva kaava, jonka pohjalta yritän vääntää makroa. Ensimmäinen ja helpompi makro (joka sekin yllä) toimii hyvin, kunhan lisäsin siihen vielä loppuun yhden rivin.
      Mutta harmaita hiuksia aiheuttaa toinen makro, jonka alkamispaikka määräytyy edellisen listan mukaan. Listojen välissä on aina 2 tyhjää riviä. Makron pitäisi siis osata aloittaa laskeminen valitusta solusta ja hyödyntää sarjan voittajan aikaa niin kauan, kunnes kohtaa tyhjän rivin. On muuten hankala selittää. Mutta kokeilen tehdä tälläisen mallikaavion:

      A B C D E F
      ===== 3 riviä tekstiä ym. ======
      1. nimi1 - aika1 - pisteet (=1000)
      2. nimi2 - aika2 ero pisteet (=1000-(aika2-aika1)/aika1*1000)
      3. nimi3 - aika3 ero pisteet (=1000-(aika3-aika1)/aika1*1000)
      .........
      x. nimiX - aikaX ero pisteet (=1000-(aikaX-aika1)/aika1*1000
      ====== 2 tyhjää riviä =========
      1. nimi1 - aika1 - pisteet (=1000)
      2. nimi2 - aika2 ero pisteet (=1000-(aika2-aika1)/aika1*1000)
      3. nimi3 - aika3 ero pisteet (=1000-(aika3-aika1)/aika1*1000)
      ...........
      x. nimiX - aikaX ero pisteet (=1000-(aikaX-aika1)/aika1*1000)

      Ja nuo pisteet väleissä tarkoittavat, että tuloslista jatkuu aina x. sijaan asti.
      Toivottavasti en sekoittanut enempää ja joku ymmärsi jotain. Apuja odotellessa.

      • jelppiä

        Menipäs epäselväksi tuo kaaviokuva. Tuolla nimen ja ajan välissä olevat viivat tarkoittavat, että sarake C on siis tyhjä. Ja voittajen ajan ja pisteiden välillä oleva viiva taas, että kyseinen E-sarakkeen solu on tyhjä. Olispa kiva jos tänne vois lisäillä taulokoissa tavaraa, niin pysyisi järjestyksessä.


      • jelppiä kirjoitti:

        Menipäs epäselväksi tuo kaaviokuva. Tuolla nimen ja ajan välissä olevat viivat tarkoittavat, että sarake C on siis tyhjä. Ja voittajen ajan ja pisteiden välillä oleva viiva taas, että kyseinen E-sarakkeen solu on tyhjä. Olispa kiva jos tänne vois lisäillä taulokoissa tavaraa, niin pysyisi järjestyksessä.

        Sub Testimakro_A()
        Dim vika As Long
        Dim solu As Range
        Dim aloitus As String

        Range("F:F") = ""

        aloitus = "F4"
        Range("F4") = 1000
        vika = Range("F4").Offset(1, -2).End(xlDown).Row
        For Each solu In Range(aloitus & ":F" & vika)
        solu = (Range(aloitus) - solu.Offset(0, -2)) / Range(aloitus) * 1000
        Next

        vika = vika 3
        aloitus = "F" & vika
        Range("F" & vika) = 1000
        vika = Range("D" & vika).Offset(1, 0).End(xlDown).Row
        For Each solu In Range(aloitus & ":F" & vika)
        solu = (Range(aloitus) - solu.Offset(0, -2)) / Range(aloitus) * 1000
        Next
        End Sub

        Keep Excelling
        @Kunde


      • jelppiä
        kunde kirjoitti:

        Sub Testimakro_A()
        Dim vika As Long
        Dim solu As Range
        Dim aloitus As String

        Range("F:F") = ""

        aloitus = "F4"
        Range("F4") = 1000
        vika = Range("F4").Offset(1, -2).End(xlDown).Row
        For Each solu In Range(aloitus & ":F" & vika)
        solu = (Range(aloitus) - solu.Offset(0, -2)) / Range(aloitus) * 1000
        Next

        vika = vika 3
        aloitus = "F" & vika
        Range("F" & vika) = 1000
        vika = Range("D" & vika).Offset(1, 0).End(xlDown).Row
        For Each solu In Range(aloitus & ":F" & vika)
        solu = (Range(aloitus) - solu.Offset(0, -2)) / Range(aloitus) * 1000
        Next
        End Sub

        Keep Excelling
        @Kunde

        Kiitoksia kovasti Kundelle, nyt on jo sinnepäin, mutta pieni virhe tuostakin löytyy. Tuo kirjoittamasi makro tuntuu laskevan joka rivin vain kaavalla =1000 - kilpailijan aika / 1000 * 1000 eli lyhyemmin =1000 - Dx, jossa D on sarake ja x on käsiteltävä rivi.

        Käyttämäni kaava on hieman monimutkaisempi eli =1000-(kilpailijan aika - voittajan aika)/voittajan aika*1000. Eli toisin sanottuna =1000 - (Dx - Dy) / Dy * 1000, jossa x on käsiteltävä rivi ja y voittajan tulosrivi.

        Muuten makro toimii hyvin, eli laskee joka rivin ja osaa vaihtaa sarjan oikeassa paikassa.
        Kiitos kun jaksat vaivautua auttamaan.


      • jelppiä kirjoitti:

        Kiitoksia kovasti Kundelle, nyt on jo sinnepäin, mutta pieni virhe tuostakin löytyy. Tuo kirjoittamasi makro tuntuu laskevan joka rivin vain kaavalla =1000 - kilpailijan aika / 1000 * 1000 eli lyhyemmin =1000 - Dx, jossa D on sarake ja x on käsiteltävä rivi.

        Käyttämäni kaava on hieman monimutkaisempi eli =1000-(kilpailijan aika - voittajan aika)/voittajan aika*1000. Eli toisin sanottuna =1000 - (Dx - Dy) / Dy * 1000, jossa x on käsiteltävä rivi ja y voittajan tulosrivi.

        Muuten makro toimii hyvin, eli laskee joka rivin ja osaa vaihtaa sarjan oikeassa paikassa.
        Kiitos kun jaksat vaivautua auttamaan.

        eihän siinä tartte kuin muuttaa soluviittaukset kaavariville...
        ei tietoa missä muodossa noi jutskat on.
        Olit kuitenkin jo laskenut eron sarakkeeseen E joten kai sitä sitten olisi voinut käyttää nyt meni vahingossa sarakkeelle D ...

        keep Excelling
        @Kunde


      • jelppiä
        kunde kirjoitti:

        eihän siinä tartte kuin muuttaa soluviittaukset kaavariville...
        ei tietoa missä muodossa noi jutskat on.
        Olit kuitenkin jo laskenut eron sarakkeeseen E joten kai sitä sitten olisi voinut käyttää nyt meni vahingossa sarakkeelle D ...

        keep Excelling
        @Kunde

        Nyt meni valitettavasti vähän ohi tuo viestisi sisältö. Ehkä osittain siksi, että tämä on ensimmäinen varsinainen kokeiluni makrojen ja VBA:n syövereihin.

        Eli mitä meinasit tuolla jutskien muodolla? Eikä tuo soluviittauksien muuttaminenkaan näin sanallisessa muodossa oikein auennut minulle.

        Ja tosiaan nämä tulostiedostot tulevat aina suoraan erään ohjelmiston kautta, eli en itse laske eroa tai muitakaan tietoja. Ainut laskettava on tämä pistemäärä, jota varten yritän laiskana ja homman nopeuttamiseksi tehdä tätä makroa. Ja oppiihan tässä samalla jotain uuttakin makroista ja muusta.


      • jelppiä kirjoitti:

        Nyt meni valitettavasti vähän ohi tuo viestisi sisältö. Ehkä osittain siksi, että tämä on ensimmäinen varsinainen kokeiluni makrojen ja VBA:n syövereihin.

        Eli mitä meinasit tuolla jutskien muodolla? Eikä tuo soluviittauksien muuttaminenkaan näin sanallisessa muodossa oikein auennut minulle.

        Ja tosiaan nämä tulostiedostot tulevat aina suoraan erään ohjelmiston kautta, eli en itse laske eroa tai muitakaan tietoja. Ainut laskettava on tämä pistemäärä, jota varten yritän laiskana ja homman nopeuttamiseksi tehdä tätä makroa. Ja oppiihan tässä samalla jotain uuttakin makroista ja muusta.

        Eli mitä meinasit tuolla jutskien muodolla?
        mikä on solumuotoilu?

        Eikä tuo soluviittauksien muuttaminenkaan näin sanallisessa muodossa oikein auennut minulle.
        Ymmärtääkseni on jo laskettu ero voittajaan sarakkeessa E?
        joten
        Käyttämäni kaava on hieman monimutkaisempi eli =1000-(kilpailijan aika - voittajan aika)/voittajan aika*1000. Eli toisin sanottuna =1000 - (Dx - Dy) / Dy * 1000, jossa x on käsiteltävä rivi ja y voittajan tulosrivi.

        1000-sarake E/ D & aloitusrivi*1000 on oikea kaava ( aloitusrivi on eri koodissa ekalla sarjalla ja toisella sarjalla, joten pientä hienosäätöä)...

        ;-)
        Keep Excelling
        @Kunde


      • jelppiä
        kunde kirjoitti:

        Eli mitä meinasit tuolla jutskien muodolla?
        mikä on solumuotoilu?

        Eikä tuo soluviittauksien muuttaminenkaan näin sanallisessa muodossa oikein auennut minulle.
        Ymmärtääkseni on jo laskettu ero voittajaan sarakkeessa E?
        joten
        Käyttämäni kaava on hieman monimutkaisempi eli =1000-(kilpailijan aika - voittajan aika)/voittajan aika*1000. Eli toisin sanottuna =1000 - (Dx - Dy) / Dy * 1000, jossa x on käsiteltävä rivi ja y voittajan tulosrivi.

        1000-sarake E/ D & aloitusrivi*1000 on oikea kaava ( aloitusrivi on eri koodissa ekalla sarjalla ja toisella sarjalla, joten pientä hienosäätöä)...

        ;-)
        Keep Excelling
        @Kunde

        Kiitos selvennyksestä, avautui asiat jo huomattavasti paremmin.

        Solumuotoilu on aikasarakkeessa (D) muodossa t:mm:ss ja muualla yleinen eli ei määriteltyä muotoa.

        Muotoilun takia ero voittajaan-sarake eli E ei ole käytettävissä laskukaavoille suoraan, koska ohjelmisto, josta tulokset puretaan exceliin lyö eron E-sarakkeeseen tyhmästi vaihtelevissa muodoissa. Jos ero on sekunteja muoto on ss, ero minuutteina on muoto m.ss tai mm.ss ja mikäli ero on niinkin suuri kuin yli tunnin on muoto t.mm.ss. Ja excelhän ei ymmärrä erojen olevan lukuja, vaan käsittelee niitä tekstinä solumuotoilusta riippumatta.

        Tietenkin on yksi vaihtoehto muuttaa käsin erot ensin aikamuotoisiksi ja siitä sitten hyödyntää kaavaa. Tai mahdollisesti korvata valmiit erot laskemalla uudet suoraan lukumuotoon makron avulla. Mutta mielelläni kuitenkin haluaisin pitää pisteidenlaskun mahdollisimman nopeana ja kivuttomana toimenpiteenä, että olisivat kilpailijatkin tyytyväisiä, kun on tulokset ja pisteet nopeasti nähtävillä.


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

    Luetuimmat keskustelut

    1. Mikä on totta mikä ei?

      Onko juoru vai ei että nimeltä mainitsematon henkilö on tehnyt naiselle/naisille jotain joka on väärin?
      Kuhmo
      21
      2244
    2. Päivän aivopieru Trumpilta

      Trump julisti sodan hyttysiä vastaan. Myös punkit ovat Trumpin sodan kohteena. Eikö vieläkään USA:n kansa tajua tuon uko
      Maailman menoa
      83
      1452
    3. Lopetetaanko tämä

      Juttu ja mennään eteenpäin? Pystytkö?
      Ikävä
      132
      958
    4. Just saying

      Mies joka antaa naiselle turvallisen olon, on seksikäs. Ei kieroja kikkoja ja haluaa olla vain sen yhden naisen mies.
      Ikävä
      142
      737
    5. Löytyikö syy miksi Martina on Muhiksen kanssa

      Saipa naurut Gekkosen kuvasta, missä ovat ravintola Hookissa Immu fight night ottelun jälkeen, Muhoksella pullottaa hirv
      Kotimaiset julkkisjuorut
      95
      672
    6. Voisin antaa sulle nyt

      Halin❤️
      Ikävä
      54
      666
    7. Janpen Thai lopettanut, miksiköhän

      Hyvää apetta teki.
      Suomussalmi
      13
      627
    8. Jos selviäisi että kaivattusi

      Olisi savant asperger? Rakastaisitko vielä? Savant-lahjakkuus olisi kapea-alaista neroutta liittyen mekanisiin ja tilan
      Ikävä
      96
      592
    9. Jorma Uotinen läväytti härskin heiton - Paljastus uudesta TTK-romanssista?

      Tuomari Jorma Uotisen linja on välillä hyvinkin rohkea TTK:ssa. Hän näpäytti Jaakko Parkkalille ja Kastanja Rauhalalle v
      Tanssii tähtien kanssa
      12
      588
    10. Tosi kiva on

      Joo. Mitä olisit menettänyt jos olisit paljastanut itsesi?
      Ikävä
      65
      561
    11. Jokin ei täsmää

      Joskus yksi vuosiluku saa katsomaan koko tarinaa uudestaan. Löysin gradun. Matematiikka ei oikein täsmää siihen, mitä mi
      Ikävä
      298
      556
    12. Toivotko vielä viestiä

      Minulta? En rohkene enää ottaa yhteyttä, kun varmasti jo uusia naisia elämässä. Nolaisin vain itseni.
      Ikävä
      44
      549
    13. Tehdään yhdessä itsestämme

      Parhaat versiot❤️ Se vaatii molemmilta hyvää itsetuntoa!
      Ikävä
      42
      525
    14. Olen ajellut Dieseleillä yli 50 vuotta.

      Enkä ole koskaan kaivannut sähköautoa.
      Hybridi- ja sähköautot
      133
      509
    15. Oliko Jani Halmeen aika jo tippua TTK:sta?

      Jani Halme ja Claudia Ketonen joutuivat jättämään TTK:n. Halme ja Ketonen saivat viimeiseksi jäänestä tanssista, sambas
      Tanssii tähtien kanssa
      28
      508
    16. On väärin

      Tykätä ja haluta sua kun tilanne täysin mahdoton mutta minkäs teet. Mun sisällä roihuaa 🔥 kunpa tietäisit mitä sä minus
      Ikävä
      34
      503
    17. Kuka kaipaa T m?

      Kerro nainen kirjaimesi vaan... Haluan miettiä kuka tulee ekana mieleeni.. kuin kurkistus tunteiden meren pinnalle, jota
      Ikävä
      36
      500
    18. Mitä tunteita

      Sulla vielä on?
      Ikävä
      77
      494
    19. S-ryhmän vastuullisuuden kaksoisstandardi

      Vastuullisuuspuhe on helppoa. Vaikeampaa on selittää, miksi S-ryhmän omien merkkien tuotteita ja raaka-aineita hankitaan
      Maailman menoa
      12
      485
    20. Miksi jotku naiset on niin tyhmiä

      Että elättelevät turhaa toivoa toisen kustannuksella. Onko ne kaikki kaappilesboja vai mikä niitä vaivaa? Sitten itketä
      Ikävä
      52
      474
    Aihe