Excel - Lopeta macro kun tyhjä solu

U-Bond

Kyseinen macro ajaa 300 kertaa "Call" Laske macron mutta saako tuohon lisättyä mitenkään kunnes A sarkkeessa on tyhjä solu "blank" niin macron ajaminen loppuisi siihen ettei tarvitse odotella että se ajaa 300 kertaa tyhjää taulukkoa.


Sub LoopMacro()
Dim i As Integer
For i = 1 To 300
Laske '<-- kutsuu Laske macron ja ajaa sen 300 kertaa
Next i
End Sub

8

399

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • ExitSub

      Oletan, että ko. makro kävisi läpi A-saraketta rivi riviltä.
      Lisää silmukkaan ennen Laske-makron kutsua:
      if cells(i,1)="" then exit sub

    • Miksi loopata 300 kertaa ja kutsua makroa kun sen voi kutsua vain kerran ja tehdä jutut?

    • U-Bond

      Itse asiassa tuon Laske macron takana on monta eri macroa, tuo tekee niin että taulukkoon tulee epämääräisesti dataa päivittäin, se voi olla esim 10 solua tai se voi olla 1000 solua mutta kaikki on sidottu päivämäärään, eli jokainen sama päivämäärä voi olla 50 solua = aina yksi laskenta erä jonka jälkeen se siirtelee laskennat toisille välilehdille ja palaa takaisin tuohon LoopMacroon, mikäli siellä ei ole enää dataa niin tuo oma tekele jatkaa silti sen 299kertaa laskien tyhjiä taulukoita.

      Kokeilin ExitSub nimimerkin ehdotusta mutta se ei pysäytä tuota omaa macroa vaan jatkaa silti sen 300 kertaa tai mitä siihen on limiitiksi asetettu. Varmasti se toimii mutta jotain en nyt vaan tajua.

      • Edelleen kuulostaa tosi tehottomalta ratkaisulta ;-)

        jos tietosi on A1-A300 niin if cells(i,1)="" then exit sub toimii, muuten pitää muuttaa
        vastaamaan alkavaa solua tyyliin if cells(99 i,1)="" then exit
        missä 99 i on aloitussolu eli tässä tapauksessa A100
        ja jos eri sarake kuin A esim B niin cells(99 i,2) eli B100

        Keep EXCELing
        @Kunde


    • U-Bond

      Joo no tehoton se on mutta kun yritin tehdä kerran Do While loopin niin se oli niin tehokas että jos olisin tehnyt sen viime vuonna niin se ajaisi vieläkin sitä samaa looppia, se ei koskaan pysähtynyt. Kun tämä tekele täytyy jättää oman onnensa nojaan ja pelästyin kun se vaan jatkoi ja jatkoi niin siksi tein tuohon limiitin 300 että varmasti pysähtyy viimeistään 300:n ajon jälkeen.

      Määräävä solu on A-sarakkeessa ja kun A-sarake on täysin tyhjä niin sitten pitäisi myös makro lopettaa ja data alkaa A1 solusta loppu on määräämätön määrä, en voi sitä ennakolta tietää.

      Mutta sain teiltä kummaltakin ison kopin, kiitos molemmille. Sovelsin sen näin ja tuntuisi toimivan.

      Sub LoopMacro_one()
      Dim i As Integer
      For i = 1 To 300
      dev = Worksheets("Data").Range("A" & i)
      If dev = "" Then Exit For
      Laske '<--kutsuu Laske macron ja ajaa sen 300 kertaa
      Next i
      End Sub

      Paitsi että se ei aja viimeistä solua/soluja tyhjäksi pitäisi olla joku i i tai x x tai joku? Onko ideoita, en osaa.

    • U-Bond

      Sub LoopMacro_one()
      Dim i As Integer
      For i = 1 To 300
      dev = Worksheets("Data").Range("A" & i)
      If dev = "" Then Exit For
      Laske '<--kutsuu Laske macron ja ajaa sen 300 kertaa ( siis ajaa nyt tässä tapauksessa max 300 kertaa ) mutta kyllähän te sen tiesitte tietenkin.
      Next i
      End Sub

      Paitsi että se ei aja viimeistä solua/soluja tyhjäksi pitäisi olla joku i i tai x x tai joku? Onko ideoita, en osaa.

      ----------------------------------------------------------------------------------

      Soluissa A on päivämäärä joka on muutettu digitaaliseksi = DATEVALUE() ja sitten ne Sort:taan ja tuo datevalue määrää aina yhden ajokerran on niitä soluissa 1 tai 120 samaa numeroa se on aina yksi ajokerta ( tai loop).

      Sarake A

      Ensimmäinen ajo jonka jälkeen Laske makro poistaa nämä rivit kun on tehnyt muita toimintoja ja nostaa seuraavat valuet alkaen A1 soluun
      42505
      42505
      42505

      Toinen ajo jonka jälkeen Laske makro poistaa nämä rivit kun on tehnyt muita toimintoja ja nostaa seuraavat valuet alkaen A1 soluun
      42504
      42504
      42504
      42504
      42504
      42504
      Kolmas ajo jne.
      42503
      Neläs ajo jne
      42501
      42501
      42501
      42501
      Viides ajo jne.
      42500
      Mutta nämä viimeiset valuet jää syystä jostain ajamatta, ne pitäisi saada myös mukaan looppiin ja vasta kun A sarake on täysin tyhjä niin sitten Macro lopetetaan.
      42498
      42498
      42498

      Muutoin Sub LoopMacro_one() toimii eikä aja sitä enää 300 kertaa turhaan.

      • ExitSub

        Jos ymmärsin oikein, Data-lehdeltä poistetaan rivejä ja sinne ei saa lopuksi jäädä riviäkään. Unohda for-silmukka. Viimeiset rivit jäävät poistamatta, koska Laske-makro menee sorkkimaan A-saraketta. Muuttuja i kasvaa joka kierroksella, ja kun solu Range("A" & i) on jossain vaiheessa tyhjä, lopetusehto täyttyy, mutta sen yläpuolella voi olla dataa.
        Tämä rakenne voisi toimia. Se toistaa makroa niin kauan, että solu A1 on tyhjä.
        Do
        LAske
        Loop until Worksheets("Data").Range("A1") = ""


      • U-Bond

        ExitSub
        Kokeilin ehdotustasi
        Tein monta testi ajoa eri pituisilla Data jaksotuksilla ja toimi jokaisessa ihan nappiin, nyt se ajaa kaiken puhtaaksi taulukosta ja lopettaa sen jälkeen makron.

        Kiitti!


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

    Luetuimmat keskustelut

    1. Suomen kansa haluaa Antti Lindtmanista pääministerin

      Lindtman on miltei tuplasti suositumpi kuin etunimikaimansa Kaikkonen. Näin kertoo porvarimedian teettämä kysely. http
      Maailman menoa
      282
      4751
    2. Vain 21% kannattaa Lindtmania pääministeriksi

      se on selvästi vähemmän kuin puolueen kannatus, mites nyt noin?
      Maailman menoa
      135
      3056
    3. Miksei Björn Wahlroos jaa rahaa köyhille?

      Esimerkiksi Nordean tiloissa? Vai tuovatko ne köyhät hiekkaa marmorilattioille ja siksi ei pysty mursunviiksi pystyyn k
      Maailman menoa
      50
      2959
    4. Jouluksi miettimistä: kuka tai mikä valmistaa rahan?

      Nyt kun on ollut vääntöä rahasta ja eritoten sen vähyydestä, niin olisi syytä uida rahan alkulähteille, eli mistä se syn
      Maailman menoa
      28
      1541
    5. Julkinen sektori on elänyt aivan liian leveästi yli varojensa!

      Viimeisen 15 vuoden aikana julkisen puolen palkat ovat nousseet n. 40%, kun taas yksitysellä sektorilla vain n. 20%. En
      Maailman menoa
      227
      1242
    6. Missä kunnassa kaivattusi asuu

      Kuinka tarkkaa uskalla sanoa?
      Ikävä
      47
      1189
    7. Yksikään persu ei ole saanut Nobelin palkintoa

      Kertoo paljon persujen älyn puutteesta. Demareista mm. Ahtisaari on kyseisen palkinnon saanut.
      Maailman menoa
      7
      986
    8. Emme koskaan keskustelleet kasvotusten syistä välirikollemme

      Enkä voisi kertoa perimmäistä rehellistä syytä. Kerroin sinulle pintapuolisen ”paketin” ja otin tavallaan omalle vastuu
      Ikävä
      58
      981
    9. Paskalaista valokuitulakiin

      Nyt maksajiksi joutuvat kaupunkilaiset eivätkä mökkiensä ulkohuusseissa kakistelevat mummot. Nimittäin EU määrää jokais
      Maailman menoa
      52
      969
    10. Miten antaa merkki hyvin eri ikäiselle miehelle, että kertoisi toiveensa ja ajatuksensa?

      Olen pitkään pitänyt miehestä, joka myös varmasti minusta. Hän ei tosin kerro ihastumisesta, eli voi hyvin olla, että tu
      Ikävä
      78
      961
    Aihe