Calc, itsetehty makro ja sen käyttö

onre

Joo, eli teinpä aikani kuluksi viitenumeron laskevan makron OO Basicilla. Sain sen pelaamaan niin, että kun luon uuden tiedoston, kirjoitan kenttään A1 esim. 102 ja kenttään A2 kaavaksi =VIITE(A1), kenttään A2 ilmestyy 1025, eli käypä viitenumero.

Mutta.

Jos otan auki mun vanhan laskupohjan ja yritän sinne lisätä tuota, Openoffice ehdottaa korjausta ='Viite'*A2 joka viittais siihen ettei se "näe" ko. funktiota enää. No, eikö mitä, ajattelin että jospa ensin select all (Ctrl A), copy (Ctrl C) ja sitten luodaan uusi tiedosto, jossa testataan eka että toimiiko toi VIITE()-funktio. Toimii. No, sitten paste (Ctrl V), ja laskupohja nätisti liimautuu tähän uuteen tiedostoon. Mutta tässä vaiheessa tää VIITE()-funktio mystisesti lakkaa taas olemasta. Mikä avuksi?

13

1854

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Magi_Suuri

      Kopioitaessa ja liitettäessä Calcin sisältöä asiakirjasta toiseen siirtyvät vain solujen sisällöt, eivät makrot.

      OpenOfficessa makrot voi määritellä joko tiedoston mukana tallennettaviksi, jolloin ne kulkevat aina tiedoston mukana, tai OpenOfficeen globaalisti tallennettaviksi ("Omat makrot"), jolloin tiedoston jokaisen käyttäjän täytyy asentaa makro erikseen. Näistä ensimmäinen tapa lienee näppärämpi, jos asiakirja on tarkoitettu siirrettäväksi.

      Eli käyttäytyminen riippuu siitä mihin kohtaan olet lisännyt makron Basic-makrojen hallinta-ikkunassa. "Omat makrot" toimivat kaikissa _omissa_ asiakirjoissasi. Listassa on myös kaikki avoinna olevat asiakirjat, joiden alla olevat makrot toimivat vain kyseisessä asiakirjassa.

      • onre

        > Kopioitaessa ja liitettäessä Calcin sisältöä
        > asiakirjasta toiseen siirtyvät vain solujen
        > sisällöt, eivät makrot.

        Kenties ilmaisin ongelman hivenen epäselvästi. Mulla on siis sellainen tilanne, että voin ottaa uuden tiedoston, kirjoittaa kenttään A1 että =VIITE(A2) ja kenttään A2 viitenumeron, tämä toimii. Mutta jos pastean kyseiseen samaiseen tiedostoon clipboardista sen mun laskupohjani solujen sisällöt, VIITE()-funktio lakkaa toimimasta.

        Olen yrittänyt myöskin täsmälleen Helpin esimerkin mukaisesti siirtää tuota funktiota siihen laskupohjaani, mutta eipä sitä silloinkaan sen kummemmin löydy. Melkein tuntuu bugilta, tai sitten en vaan osaa.


    • irettep

      Haluaisitko jakaa tämän viitenumeromakrosi?
      Kelpaisi kyllä meille muillekin OO-käyttäjille.

    • Peräpohjalainen

      Osaan panna makron lukemaan työkirjan tietyssä solussa olevan sisällön,, mutta miten solun sarake- ja rivinumeo luetaan siinä tapauksessa, että makrokoodi itse päättelee ne. Ajattelen esimerkiksi tilannetta, jossa tietyssä solussa on luku ja samalla rivillä olevaan soluun pitäisi laksa jollakin kaavalla ko. luvun perusteelal toinen luku. Olen aloittelija makrohommissa, mutta kuvittelen, että jos esim. ko. luvun solun tai viereisn solun ollessa valltuna pitäisi olla mahdollisuus välittää makrokoodile tieto valitun solun rivi-ja sarakenumerosta. Netin oppaista en ole löyänyt vastausta ongelmaan ala. Ihmetteln, jos ei löydy, koska menetelmä on hyödyllinen ja luulisi tulleen Calcin suunnittelijoiden mieleen. (Esimekkini on
      tietenkin mahdollista ratkaista illman makroakin, mutta kysymys on harjoitteluesimerkistä.)

      • tuttumies

        Peräpohjalaiselle:
        Jos sinulla on Basic makro
        Function Laskejotain(arg1, arg2, arg3)

        niin tuo funktio käynnistyy solussa, jossa on kaava
        = Laskejotain(viite1, viite2, viite3)

        Tämänhän tiesitkin, mutta otin vähän vauhtia (-;

        Mitä tuo funktio ei kovinkaan helposti tiedä, on se, missä solussa laskenta tapahtuu. Kömpelö mutta toimiva tapa on välittää argumenteissa row() ja column() -funktioiden arvot.

        Jos Calcin (omatekemä) funktio hakee arvon valitusta solusta, tämä tapahtuu sitten pitkin taulukkoa kaikkialle, missä funktiota on käytetty. Jos makro ei ole Calc-funktiona, tulos pitää sitten saada jotenkin näkyviin.

        ThisComponent.CurrentSelection antaa Basic rutiinille tiedon valitusta alueesta.

        Lisätietoja saanet mm. tarkastelemalla Paolo Mantovanin rutiinia Sub RetrieveTheActiveCell() ja laajemmin Andrew Pitonyakin vapaasti jaetusta tuotannosta.


      • Peräpohjalainen
        tuttumies kirjoitti:

        Peräpohjalaiselle:
        Jos sinulla on Basic makro
        Function Laskejotain(arg1, arg2, arg3)

        niin tuo funktio käynnistyy solussa, jossa on kaava
        = Laskejotain(viite1, viite2, viite3)

        Tämänhän tiesitkin, mutta otin vähän vauhtia (-;

        Mitä tuo funktio ei kovinkaan helposti tiedä, on se, missä solussa laskenta tapahtuu. Kömpelö mutta toimiva tapa on välittää argumenteissa row() ja column() -funktioiden arvot.

        Jos Calcin (omatekemä) funktio hakee arvon valitusta solusta, tämä tapahtuu sitten pitkin taulukkoa kaikkialle, missä funktiota on käytetty. Jos makro ei ole Calc-funktiona, tulos pitää sitten saada jotenkin näkyviin.

        ThisComponent.CurrentSelection antaa Basic rutiinille tiedon valitusta alueesta.

        Lisätietoja saanet mm. tarkastelemalla Paolo Mantovanin rutiinia Sub RetrieveTheActiveCell() ja laajemmin Andrew Pitonyakin vapaasti jaetusta tuotannosta.

        Kiitos, Yitän perehtyä asiaan ja kysyn lisää, jos en ymmärrä. Kysymykseni oli huonosti muotoiltu, joten vastauksesi ei ole välttämättä juuri se, mihin hain vastausta.

        Keksin ongelmaan omatekoisen ratkaisuidean tapaukseen, jossa jompikumpi, sarakenumero pysyy vakiona ja kysymyksessä on kirjanpitotyyppinen sovellus eli jokaiselle riville tulee. Tällöin kenties voin panna rivinumeron automaattisesti kasvamaan laskentataulukossa ja määrätä rivinumeron tiettyyn soluun, jolloin voin kenties makossa viitata tuosta solusta ilmenevään rivinumeroon. Mielessäni on makro, jokaa jakaa useita tietoja sisältävän teksitimuotoisen numerokoodin sen sisältmiä eri tietoja sisältäviin osakoodeihin tapauksessa, jossa koodin pituutta ei voi etukäteen tietää. Calcista en löytänyt ratkaisua. Makro voi laskea Basicin koodin pituuden ja jakaa sen toistorakennemenetelämällä osiin, kun tiedetään kuinka monta numeroa kussakin koodin osassa on. En ole vielä selvitänyt toimiiko ideani. Käytännössä menetelmässä tulee eteen monia ongelmia. Uskon, että vastauksistasi löydän paremman menetelmän.
        En ole perehtynyt Calciin enkä Basiciin muuten kuin aivan perusasioihin.


      • tuttumies
        Peräpohjalainen kirjoitti:

        Kiitos, Yitän perehtyä asiaan ja kysyn lisää, jos en ymmärrä. Kysymykseni oli huonosti muotoiltu, joten vastauksesi ei ole välttämättä juuri se, mihin hain vastausta.

        Keksin ongelmaan omatekoisen ratkaisuidean tapaukseen, jossa jompikumpi, sarakenumero pysyy vakiona ja kysymyksessä on kirjanpitotyyppinen sovellus eli jokaiselle riville tulee. Tällöin kenties voin panna rivinumeron automaattisesti kasvamaan laskentataulukossa ja määrätä rivinumeron tiettyyn soluun, jolloin voin kenties makossa viitata tuosta solusta ilmenevään rivinumeroon. Mielessäni on makro, jokaa jakaa useita tietoja sisältävän teksitimuotoisen numerokoodin sen sisältmiä eri tietoja sisältäviin osakoodeihin tapauksessa, jossa koodin pituutta ei voi etukäteen tietää. Calcista en löytänyt ratkaisua. Makro voi laskea Basicin koodin pituuden ja jakaa sen toistorakennemenetelämällä osiin, kun tiedetään kuinka monta numeroa kussakin koodin osassa on. En ole vielä selvitänyt toimiiko ideani. Käytännössä menetelmässä tulee eteen monia ongelmia. Uskon, että vastauksistasi löydän paremman menetelmän.
        En ole perehtynyt Calciin enkä Basiciin muuten kuin aivan perusasioihin.

        "En ole perehtynyt Calciin enkä Basiciin muuten kuin aivan perusasioihin."
        Tuolla perusteella voisi ajatella, että ehkä koko asian voi ratkaista ilman makroa? Basicilla kirjoittettu funktiomakro on auttamattoman hidas, jos funktio esiintyy monissa soluissa taulukkolehdellä.
        Enkä todellakaan täysin hahmota tilannetta. Harmi, ettei tämä alusta tue liitekuvia.

        =Row(viite) antaa tulokseksi viitteen rivinumeron, =Row() kaavasolun rivinumeron.

        Calcin Mid-funtiolla saa merkkijonosta poimittua määräkohdalta osamerkkijonon, jos siitä tässä on apua.
        Basicissa melko tehokas merkkijonon jakamistoiminto on Split-funktio, mutta se vaatii erotinmerkin osamerkkijonojen väliin. Osamerkkijonot voivat olla eripituisia ja niiden lukumäärää ei tarvitse etukäteen tietää.


      • Peräpohjalainen
        tuttumies kirjoitti:

        "En ole perehtynyt Calciin enkä Basiciin muuten kuin aivan perusasioihin."
        Tuolla perusteella voisi ajatella, että ehkä koko asian voi ratkaista ilman makroa? Basicilla kirjoittettu funktiomakro on auttamattoman hidas, jos funktio esiintyy monissa soluissa taulukkolehdellä.
        Enkä todellakaan täysin hahmota tilannetta. Harmi, ettei tämä alusta tue liitekuvia.

        =Row(viite) antaa tulokseksi viitteen rivinumeron, =Row() kaavasolun rivinumeron.

        Calcin Mid-funtiolla saa merkkijonosta poimittua määräkohdalta osamerkkijonon, jos siitä tässä on apua.
        Basicissa melko tehokas merkkijonon jakamistoiminto on Split-funktio, mutta se vaatii erotinmerkin osamerkkijonojen väliin. Osamerkkijonot voivat olla eripituisia ja niiden lukumäärää ei tarvitse etukäteen tietää.

        Osaan kyllä panna Calcin funtion laskemaan merkkijonon pituuden, joka on tapauksessani aina jollakin kokonaisluvulla jaollinenm, esim luvulla 4. Tällöin on helppo Mid-funktiollaa jakaa merkkijono osiin ja sijoittaa osat haluttuihin soluihin.
        Ongelmani on toiminnon automatisoiminen siten, että heti kun mekkijono kirjoitetaan soluun se jakaantuu soluihin automaattisesti, tapauksissani samalle riville jaettavan solusta heti oikealle. Merkkijonoja tulee paljon ja on Calc-ohjelmasta tulee liian hiidas, jos jokainen mekkijonono pitää erikseen räätälöidä jaettavaksi. Automatisoinninkin osaan tehdä kopioimalla kertaalleen tehtävät toimenpiteet ja liitämällä seuraaviin riveihin suhteellista viittausta käyttäen, jos merkkijonot ovat yhtä pitkiäm esim. neljällä jaollisessa tapauksessa 12 merkin mittaisia.

        Ongelma on siinä, että eri merkkijonojen pituudet voivat vahdella niin, että pituutta ei tiedetä etukäteen. Calcista en ole löTiedän sen verran Basicistä, että sen koodilla ongelma ratkeaa "loopilla" , jos Basic-koodia saa tiedon merkkijonosta, jolloin koodi laskee merkkijonon pituuden ja osajonojen määän, josta tulee kierrosten lukumäärä. Jollakin nettisivulta löysin opastuksen sellaista tapausta varten, jossa koodiin kirjoitetaan tietyn solun "osoite" esim. A1 tai solun rivi-ja sarakenumerot (esim. (1,1). Vain jälkimmäinen tapa on käypä tapauksessani. Nyt kuitenkin viittaus tulee tehdä muuttujia käyttäen. En muista sijoituslauseita ulkoa, mutta oletetaan, että se on muotoa Cell(s,t). Tapauksessani s ja t olisivat intger-tyyppiä olevia muuttujia, joiden tarkoitus on viitata Calctaulukon sen solun rivi- ja sarakenumeroon, jossa merkkijono on, ja anamalla samalla solun tieto Basic-koodilla. Kyseinen solu pitäisi olla aktiivisena.

        Ensimmäisessä vastuaksessasi saattaa olla ratkaisun avain, jos row()-ja column(), funktioilla voidaan viitata mekkijonon sisältävään soluun. Jotakin lisuketta ilmeisesti tarvitaan, jotta funtiot yhdessä poimisivat merkkijonon aktiiviisesta solusta. (Jossakin nettiohjeessa vilahti sana "Active". kenties ohje sivusi ongelmaani, mutta harmikseni kadotin ko. nettisivun.) Valitettavasti en ole vielä ehtinyt tutkia opastuksiasia. Ajattelin kuitenkin kuvata ongelmani senkin vuoksi, että se voisi olla kiinnostava muillekin.

        Vastauksessani esittämä menetelmämadollisesti toimii, tosin epätyydyttävästi. Esimerkiksi laskentataulukon soluun A2 kirjoitetaan luku
        1. Soluun A3 kirjoitetaan kaava" =A2 1" 1 Tuo kaava kopioidaan "kohtalaiselle" määrälle sarakkeen soluja solusta A4 lähtien, anokaamme esim. soluun A30 saakka. Tällöin sarakkeen samalla rivilllä olevaksi luvuksi tulee edellisellä rivillä oleva luku luvulla 1 lisättynä ja sama luku alempiin lukuihn soluun A30 saakka.
        Soluun A1 kirjoitetaan kaava "=A30". Merkkijonot kirjataan sarakkeseen B toiselta riviltä lähtien. Tällöin solu A1 ilmoitaa merkkijonosolun rivinumeron. Tällöin pitäisi olla mahdollista välittää akriivisena olevan mekkijonosolun rivi- ja sarakenumero Basic-makron koodille. Esimerkiksi, jos merkkijono on solussa B10, rvinumero on 10 ja sarakenumero 2. Esim. merkkijonon ollessa 12 merkin pituinen ja osajonojen ollessa 4 merkin mittaisia sekä solun B10 ollessa valittuna pitäisi makron ajon tuottaa kolme neljän merkin mittaista merkkijonoa, jotka sijoittuisivat soluihin C10,C11 ja C12. Otaksun, että Basicissä on merkkijonon pituuden ja osajonon poimimiseen Calcin funktioita vastaavat funktiot. Kun solussa B10 olevan merkkijonon hajoitettu makrolla, soluihin
        B11 ja B12 ei tietenkään kirjoiteta merkkijonoa.

        Aavistan ko. menetelmän olevan haavoittuva. Epäkohtana on se, että sarakkeessa B olevan kaavan kopiointia on jatkettava, jos riveissä A2 - A30 ei ole riittävästi tilaa merkkijonoille. Merkkijonon soluun pitäisi makron koodissa voida viitata ilman kuvaamaani temppuilua.

        Otan vastaan nuvoja, vaikka entisiäkään en ole vielä ehtinyt tutkia. Kiios tähänastisista neuvoista.


      • Peräpohjalainen
        Peräpohjalainen kirjoitti:

        Osaan kyllä panna Calcin funtion laskemaan merkkijonon pituuden, joka on tapauksessani aina jollakin kokonaisluvulla jaollinenm, esim luvulla 4. Tällöin on helppo Mid-funktiollaa jakaa merkkijono osiin ja sijoittaa osat haluttuihin soluihin.
        Ongelmani on toiminnon automatisoiminen siten, että heti kun mekkijono kirjoitetaan soluun se jakaantuu soluihin automaattisesti, tapauksissani samalle riville jaettavan solusta heti oikealle. Merkkijonoja tulee paljon ja on Calc-ohjelmasta tulee liian hiidas, jos jokainen mekkijonono pitää erikseen räätälöidä jaettavaksi. Automatisoinninkin osaan tehdä kopioimalla kertaalleen tehtävät toimenpiteet ja liitämällä seuraaviin riveihin suhteellista viittausta käyttäen, jos merkkijonot ovat yhtä pitkiäm esim. neljällä jaollisessa tapauksessa 12 merkin mittaisia.

        Ongelma on siinä, että eri merkkijonojen pituudet voivat vahdella niin, että pituutta ei tiedetä etukäteen. Calcista en ole löTiedän sen verran Basicistä, että sen koodilla ongelma ratkeaa "loopilla" , jos Basic-koodia saa tiedon merkkijonosta, jolloin koodi laskee merkkijonon pituuden ja osajonojen määän, josta tulee kierrosten lukumäärä. Jollakin nettisivulta löysin opastuksen sellaista tapausta varten, jossa koodiin kirjoitetaan tietyn solun "osoite" esim. A1 tai solun rivi-ja sarakenumerot (esim. (1,1). Vain jälkimmäinen tapa on käypä tapauksessani. Nyt kuitenkin viittaus tulee tehdä muuttujia käyttäen. En muista sijoituslauseita ulkoa, mutta oletetaan, että se on muotoa Cell(s,t). Tapauksessani s ja t olisivat intger-tyyppiä olevia muuttujia, joiden tarkoitus on viitata Calctaulukon sen solun rivi- ja sarakenumeroon, jossa merkkijono on, ja anamalla samalla solun tieto Basic-koodilla. Kyseinen solu pitäisi olla aktiivisena.

        Ensimmäisessä vastuaksessasi saattaa olla ratkaisun avain, jos row()-ja column(), funktioilla voidaan viitata mekkijonon sisältävään soluun. Jotakin lisuketta ilmeisesti tarvitaan, jotta funtiot yhdessä poimisivat merkkijonon aktiiviisesta solusta. (Jossakin nettiohjeessa vilahti sana "Active". kenties ohje sivusi ongelmaani, mutta harmikseni kadotin ko. nettisivun.) Valitettavasti en ole vielä ehtinyt tutkia opastuksiasia. Ajattelin kuitenkin kuvata ongelmani senkin vuoksi, että se voisi olla kiinnostava muillekin.

        Vastauksessani esittämä menetelmämadollisesti toimii, tosin epätyydyttävästi. Esimerkiksi laskentataulukon soluun A2 kirjoitetaan luku
        1. Soluun A3 kirjoitetaan kaava" =A2 1" 1 Tuo kaava kopioidaan "kohtalaiselle" määrälle sarakkeen soluja solusta A4 lähtien, anokaamme esim. soluun A30 saakka. Tällöin sarakkeen samalla rivilllä olevaksi luvuksi tulee edellisellä rivillä oleva luku luvulla 1 lisättynä ja sama luku alempiin lukuihn soluun A30 saakka.
        Soluun A1 kirjoitetaan kaava "=A30". Merkkijonot kirjataan sarakkeseen B toiselta riviltä lähtien. Tällöin solu A1 ilmoitaa merkkijonosolun rivinumeron. Tällöin pitäisi olla mahdollista välittää akriivisena olevan mekkijonosolun rivi- ja sarakenumero Basic-makron koodille. Esimerkiksi, jos merkkijono on solussa B10, rvinumero on 10 ja sarakenumero 2. Esim. merkkijonon ollessa 12 merkin pituinen ja osajonojen ollessa 4 merkin mittaisia sekä solun B10 ollessa valittuna pitäisi makron ajon tuottaa kolme neljän merkin mittaista merkkijonoa, jotka sijoittuisivat soluihin C10,C11 ja C12. Otaksun, että Basicissä on merkkijonon pituuden ja osajonon poimimiseen Calcin funktioita vastaavat funktiot. Kun solussa B10 olevan merkkijonon hajoitettu makrolla, soluihin
        B11 ja B12 ei tietenkään kirjoiteta merkkijonoa.

        Aavistan ko. menetelmän olevan haavoittuva. Epäkohtana on se, että sarakkeessa B olevan kaavan kopiointia on jatkettava, jos riveissä A2 - A30 ei ole riittävästi tilaa merkkijonoille. Merkkijonon soluun pitäisi makron koodissa voida viitata ilman kuvaamaani temppuilua.

        Otan vastaan nuvoja, vaikka entisiäkään en ole vielä ehtinyt tutkia. Kiios tähänastisista neuvoista.

        Tekstiini tuli harmittavan paljon kirjoitusviheitä. Tovottavasti siitä saa kuitenkin selvän. Merrkijonot ova tieten string-tyyppiä eikä integertyyppiä. Soluviittausmuuttujissa pitänee rivinumero ja sarakenumero olla stringtyyppiä?


      • Peräpohjalainen
        Peräpohjalainen kirjoitti:

        Tekstiini tuli harmittavan paljon kirjoitusviheitä. Tovottavasti siitä saa kuitenkin selvän. Merrkijonot ova tieten string-tyyppiä eikä integertyyppiä. Soluviittausmuuttujissa pitänee rivinumero ja sarakenumero olla stringtyyppiä?

        Äsh.Sekosin temppumenetelmäni kuvauksessa, joka ei vastaa ideaani, koska
        siinä tulevat heti kerralla luvut sarakkeseen.Sitä se hajamielisyys teettää.
        Rivinumeron kasvattamisessa tarvitaan kahta saraketta, esim. A ja B.
        Soluun B1 tulee luku 1 ja souun B2 kaava "=B1 A2" ja sitä kopioidaan alaspäin
        esim. soluun B30 saakka. Merkkijonoti kirjataan sarakkeseen C. Ensimmäinen kirjaus tulee riville 2, jolloin kirjataan soluun A2 luku 1, jolloin B2-soluun tulee luku 2. Jokaiselle riville sarakkeeseen A rivistä 2 lähtien luku 1, samalla kuin merkkijono kirjataan ja myös aimmin kuvaamani makron ajon jälkeen osajonojen riveille myös luku 1, jotta rivinumero kasvaisi aina yhdellä sarakkeessa A rivi kerralaan alaspäin mentäessä. Soluun A1 tulee esimerkkiilanteessa kaava "=B30", joka kasvaa samassa tahdissa sarakkeen B numerojen kasvun kanssa. Koska en ole testannut temppumenetelmääni, en tiedä pitääkö solussa B30 oleva luku muuttaa strinmuotoon aina ennen makron suorittamista, jotta se voitaisiin makron koodissa lukea solun rivinumeroksi. Jos pitää, on se miinusta ko. menetelmälle samoin kuin luvun 1
        kirjoittaminen rivistä 2 lähtien sarakkeeseen A.


    • tuttumies

      Esimerkki
      Alue A11:A17 merkkijonoja, kuten
      ABCD1234abcd
      ABCD1234abcd5678xyzå

      Alue B10:I10 sarja 1,5,9 ...29
      Soluun B11 kaava
      =MID($A11;B$10;4)
      Tämä sitten vedetään alueelle B11:I17

      Tuossa siis sarakkeeseen A tulee eripituisia koostekoodeja, joissa on aina 4 peräkkäin samaa osakoodia, ja sarakkeisiin B...I tulee sitten osakoodit. "Liian" lyhyt koodi tuottaa vain tyhjän solun, kun osakoodit loppuvat.

      Laskentataulukon kaavat toimivat "vetämällä" eikä "työntämäll", kun ajatuksesi vaikutti siltä, että syöttösarakkeesta makron pitäisi "työntää" ne osamerkkijonot viereisiin soluihin.

      Eikä tuossa näyttäisi täyisin tyhjäkään solu sarakkeessa A haittaavan.

      Siinä on joku raja, kuinka monta merkkiä soluun mahtuu (olisikohan luokkaa 65 000) ja sarakkeita on vain n. tuhat.

      • Peräpohjalainen

        Kiitos jälleen vastauksesta, joka edisti Calcin osaamistani . Esittämäsi ratkaisun kaltaista ratkaisua olin itsekin miettinyt . Esittääsi ratkaisu ei kuitenkaan ole ongelmaani sopiva.

        Ensinnäkin etsin teoreettisesti hienoa ratkaisua, jossa ohjelmasovellus itse ratkaisee, mistä lähtien pisimmän merkkijonon viimeisen osajonon luku alkaa
        (Sinulla se on 29). Ongelmassani pisin merkkijono olisi muutaman kymmenen merkin pituinen. Toiseksi tyhjiä merkkijonon osia ei saisi tulla. Asia on vähän työläs selittää, mutta yritän kuitenkin:

        Oletetaan, että pätkittävät merkkijonot tulevat sarakkeeseen A ja osajonot ovat
        8 merkin mittaisia. Tulkoon ensimmäinen merkkijono soluu A1 eli ensimmäiselle riville ja olkoon sen pituus 16, jolloin pitäisi saada luetuksi kaksi osajonoa, joista ensimmäinen tulee soluun B1 ja toinen soluun B2 eli riviä alemmaksi kuin ensimmäinen osajono. Soluun A2 ei tällöin panna merkkijonoa. Vastaavasti menetellään muiden muiden merkkijonojen suhteen tietenkin pituuden vaihtelun mukaisesti. Tuon vaiheen suorittamista makrolla siten, että marko lukee merkkijonon solusta sen ollessa valittuna merkkijonon markron Basic-koodille.
        Koodi ratkaisee "loopimenetelmällä" merkkijonon osajonot . Makron ajon pitäisi sijoittaa osamerkkijonot oikeisiin soluihin. Tämän jälkeen pitäisi vielä osamerkkijonot jakaa kahteen osaan siten, että ne tulevat osamerkkijonon kanssa samalle riviile välittömästi oikealla oleviin soluihin. Tuon vaihe on helppo tehdä Calcin MID-funktiolla, koska osamerrkkijonot ovat yhtä pitkiä ja niiden osatkin ovat vakiomittaisia. Tämä jatkovaihe erityisesti ei salli tyhjiä soluja
        jakoalueeseen.

        Ymmärrän kyllä, että Calcissa ei työnnetä tietoa eteenpäin. Markovaiheessa ei ole kysymys vielä hämärissä suunnitelmissani sen paremmin työntämisestä kuin vetämisestäkään. Ajattelen vain, että esim. solusta A1 makroon luettu ensimmäistämerkkijonoa koskeva tieto käsitellään makron koodissa ja sijoitetaan makroa ajettaessa rinnakkaiseen soluun B1.

        Mulle ongelmallisin asia ei ole varsinaisen BASIC-koodin kirjoittaminen , koska olen, kylläkin vuosia sitten, harrastanut jonkin verran Visual Basiciä. Ontgelmallisimpia asioita ovat Basicin ja Calcin liittymäkohdat, koska tieto niistä on netissä hajallaan kuin "Jokisen eväät". Ehkä pitäisi ostaa hyvä kirja asiasta, jos sellaisen vain löytäisi.

        Ensimmäisessä vastauksessasi antamat vihjeet näyttävät lupaavilta eityisesti
        "ThisComponent.CurrentSelection", jos vain tietäisi, miten se nivelletään koodiin.
        Koodissa sarakenumero on vakio ja rivinumero aktiivisesta solun rivinumero. riippuva.


    • Calcis

      Peräpohjalaiselle makro. Sarakkeeseen A merkkijonot alkaen solusta A2. Soluun A1 merkitset viimeisen rivin numeron jolla on merkkijono. Merkkijonon osiot tulostuvat neljän sarjoissa samalle riville sarakkeisiin b,c,d,e jne...

      Sub Main
      Dim Doc As Object
      Dim Sheet As Object
      Dim Cell As Object
      Dim CellRange As Object

      Doc = ThisComponent
      Sheet = Doc.Sheets(0)
      rivitCell = Sheet.getCellRangeByName("A1")

      For Rivi = 1 To rivitCell.Value
      aCell = Sheet.getCellByPosition(0, Rivi)
      X = Len(aCell.String) / 4
      A = 1
      For Sarake = 1 To X 1
      Cell = Sheet.getCellByPosition(Sarake, Rivi)
      Cell.String = Mid(aCell.String, A, 4)
      A = A 4
      Next Sarake
      Next Rivi
      End Sub

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

    Luetuimmat keskustelut

    1. Seiska: Sofia Belorf haki terapeutilta apua - Avautuu Stefan Thermanista: "Räjähdysherkkä ilotulite"

      Sofia Belórf avautuu miesystäviensä Stefan Thermanin ja Niko Ranta-ahon yhteisistä piirteistä Seiskalle. Therman heitti Sofian tavarat ulos ikkunasta
      Kotimaiset julkkisjuorut
      71
      3526
    2. Raju tilitys Stefan T, nyt aloitti Sofia haukkumiset ja käy terapiassa.

      Siitä nähtiin taas, Sofia alkoi heti syyttelyt ja kaikki kertonut Seiskassa,ei osannut tätäkään nainen pitää suutaan kiinni erosta.
      Kotimaiset julkkisjuorut
      378
      2665
    3. Sofia ilmestyi eilen illalla instaansa, on silmät surulliset ja koko kasvojen olemus .

      Ei ole koskaan helppoa eroa olemassa, vaikka kuinka sitä toisin jotkut väittävät.
      Kotimaiset julkkisjuorut
      68
      1809
    4. Voitko kertoa rakas

      mikä sen muutoksen sinussa aiheutti?
      Ikävä
      146
      1471
    5. Marin jälleen poliittisia irtopisteitä keräämässä, matkusti Ukrainaan

      Saamme varmasti kuvasarjoja liikuttuneesta Marinista itkemässä ja surkuttelemasta ukrainalaisia. Loistava tilaisuus taas kerätä itselleen
      Maailman menoa
      370
      1021
    6. Tampereen sanna lähti lomalle Ukrainaan

      Suomessakin olisi asioita hoidettavana, ja siellä vaan ulkomailla patsastelee. Milloin on seuraavat eduskuntavaalit? Valtion velkaantumisen on loputt
      Tampere
      336
      952
    7. Varoituksen sana

      Älkää satuttako sitä ihmistä ketä rakastatte. Jos niin teette, edessä on katumuksen täyteinen pitkä yksinäisyys. Itsellä se varmaan jatkuu koko loppue
      Ikävä
      70
      908
    8. Mies eikä me voitas nähdä

      viikonloppuna? :) ai niin ootko muuten varattu?
      Ikävä
      108
      816
    9. Tekis mieli kertoa

      Miten pahalta tää on tuntunut ja mitä mietin mut en uskalla ottaa riskiä että sattuu vaan yhä enemmän. Ei näille tunteille voi mitään. Olisin vaan toi
      Ikävä
      28
      811
    Aihe