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?
Calc, itsetehty makro ja sen käyttö
13
1740
Vastaukset
- 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ä.)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. 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.
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
Poliisi tutkii murhaa Paltamossa
Poliisi tutkii Kainuussa sijaitsevassa Paltamon kunnassa epäiltyä henkirikosta, joka on tapahtunut viime viikon perjanta445299Jos me voitais puhua
Jos me voitais puhua tästä, mä sanoisin, että se on vaan tunne ja se menee ohi. Sun ei tarvitse jännittää mua. Mä kyllä243460Jenna meni seksilakkoon
"Olen oppinut ja elän itse siinä uskossa, että feministiset arvot omaava mies on tosi marginaali. Todennäköisyys, että t2992870Jere, 23, ja Aliisa, 20, aloittavat aamunsa Subutexilla tai rauhoittavilla: "Vaikka mä käytän..."
Jere, 23, ja Aliisa, 20, ovat pariskunta, joka aloittaa aamunsa Subutexilla tai rauhoittavilla. Jere on ollut koko aikui582686- 1732365
- 252157
Aku Hirviniemi tekee paluun televisioon Aiemmin hyllytetty ohjelma nähdään nyt tv:ssä.
Hmmm.....Miksi? Onko asiaton käytös nyt yht´äkkiä painettu villaisella ja unohdettu? Kaiken sitä nykyään saakin anteeksi1271899Vielä kerran.
Muista että olet ihan itse aloittanut tämän. En ei silti sinua syyllistä tai muutenkaan koskaan tule mainitsemaan tästä3661865Vain yksi elämä
Jonka haluaisin jakaa sinun kanssasi. Universumi heitti noppaa ja teki huonon pilan, antoi minun tavata sinut ja rakastu881771M nainen tiedätkö mitä
Rovaniemellä sataa nyt lunta, just nyt kun lähden pohjoiseen. Älä ota mitään paineita tästä mun ihastumisesta sinuun, ti161401