Onko Ideaa?

aloittelija_asialla

On siis taulukossa laskentaosio, johon käyttäjä syöttää muutaman lähtöarvon ja taulukko laskee myös muutaman tulosarvon. Siis soluja on samassa sarakkeessa kymmenisen kappaletta. Nyt olisi ideana aina valmiin laskennan jälkeen siirtää näiden solujen tiedot jonnekin toiselle välilehdelle talteen, ja sitten laskea taas samassa osiossa uudet tiedot, jne.
Kuinka tämän voisi toteuttaa yksinkertaisesti, onko kenelläkään ideoita?

35

469

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • niin.se.toimii

      POIMI.TEKSTI funktiolla voisi lukea soluista tekstin.

    • makro-mika

      Makro, joka ajetaan kun jotain solu-buttonia klikataan.
      Makro kopioi halutut tiedot sinne toiselle välilehdelle.

      • aloittelija_asialla

        Tuon toeuttaminen tarvitsee varmaan silmukkatoimintoa, lieneekö sellaista vakiofunktioissa. Makrojen ohjelmointiin ei omat taitoni riitä. Olisiko netin uumenissa paikkaa jossa olisi valmiita makroja eri tarkoituksiin?


      • aloittelija_asialla

        Onneksi kerkisin lukea viimeisen viestin ennen robottia.
        Täytyypä alkaa kehittelemään tuosta jotain, thanks!


    • makro-mara

      Täällä macro-ohjetta: http://www.excel-easy.com/vba/create-a-macro.html

      Alla koodi, joka kopioi Taul1:B-sarakkeessta 20 riviä Taul2:sta löytyvään vapaaseen
      sarakkeeseen.
      Onnistuisi ehkä helpomminkin, mutta ExcelMacro-taito jo vähän ruosteessa.

      Private Sub CommandButton1_Click()

      rowCnt = 20
      Set fromCell = Worksheets("Taul1").Range("B1")
      Set toCell = Worksheets("Taul2").Range("A1")

      Rem Find empty row in destination tab sheet
      colSel = -1
      maxCol = 100
      For ix = 0 To maxCol - 1
      If IsEmpty(toCell.Offset(0, ix)) Then
      colSel = ix
      ix = maxCol
      End If
      Next ix

      Rem Copy cells
      If colSel >= 0 Then
      For i = 0 To rowCnt - 1
      toCell.Offset(i, colSel).Value = fromCell.Offset(i, 0).Value
      Next i
      Else
      MsgBox ("MaxCol error")
      End If
      End Sub

      Alla dummy-suomi-tekstiä, jotta robotti-moderaattori ei poistaisi viestiä.

      On siis taulukossa laskentaosio, johon käyttäjä syöttää muutaman lähtöarvon ja taulukko laskee myös muutaman tulosarvon. Siis soluja on samassa sarakkeessa kymmenisen kappaletta. Nyt olisi ideana aina valmiin laskennan jälkeen siirtää näiden solujen tiedot jonnekin toiselle välilehdelle talteen, ja sitten laskea taas samassa osiossa uudet tiedot, jne.
      Kuinka tämän voisi toteuttaa yksinkertaisesti, onko kenelläkään ideoita?

      On siis taulukossa laskentaosio, johon käyttäjä syöttää muutaman lähtöarvon ja taulukko laskee myös muutaman tulosarvon. Siis soluja on samassa sarakkeessa kymmenisen kappaletta. Nyt olisi ideana aina valmiin laskennan jälkeen siirtää näiden solujen tiedot jonnekin toiselle välilehdelle talteen, ja sitten laskea taas samassa osiossa uudet tiedot, jne.
      Kuinka tämän voisi toteuttaa yksinkertaisesti, onko kenelläkään ideoita?

    • makro-mikko

      Moderaattori poisti kolmannenkin viestin, neljäs yritys.

      Itse asia alkaa Maamme-laulun jälkeen.
      1 Oi maamme, Suomi, synnyinmaa, soi, sana kultainen! Ei laaksoa, ei kukkulaa, ei vettä rantaa rakkaampaa, kuin kotimaa tää pohjoinen, maa kallis isien!-
      2 On maamme köyhä, siksi jää, jos kultaa kaivannet Sen vieras kyllä hylkäjää, mut meille kallein maa on tää, sen salot, saaret, manteret, ne meist on kultaiset.-
      3 Ovatpa meille rakkahat koskemme kuohuineen, ikuisten honkain huminat, täht’yömme, kesät kirkkahat, kaikk’kuvineen ja lauluineen mi painui sydämeen.-
      4 Täss auroin, miekoin, miettehin isämme sotivat, kun päivä piili pilvihin tai loisti onnen paistehin, täss Suomen kansan vaikeimmat he vaivat kokivat.-
      5 Tään kansan taistelut ken voi ne kertoella, ken? Kun sota laaksoissamme soi, ja halla näläntuskan toi, ken mittasi sen hurmehen ja kärsimykset sen?-
      6 Täss on sen veri virrannut hyväksi meidänkin, täss iloaan on nauttinut ja murheitansa huokaillut se kansa, jolle muinaisin kuormamme pantihin.-
      7 Tääll’ olo meill on verraton ja kaikki suotuisaa, vaikk onni mikä tulkohon, maa isänmaa se meillä on. Mi maailmass on armaampaa ja mikä kalliimpaa?-
      8 Ja tässä, täss’ on tämä maa, sen näkee silmämme. me kättä voimme ojentaa ja vettä rantaa osoittaa ja sanoa: kas tuoss’ on se, maa armas isäimme.-
      9 Jos loistoon meitä saatettais vaikk’ kultapilvihin, mis itkien ei huoattais, vaan tärkein riemun sielu sais, ois tähän köyhäänkotihin halumme kuitenkin.-
      10 Totuuden, runon kotimaa maa tuhatjärvinen miss’ elämämme suojan saa, sa muistojen, sa toivon maa, ain ollos, onnes tyytyen, vapaa ja iloinen.-
      11 Sun kukoistukses kuorestaan kerrankin puhkeaa, viel lempemme saa nousemaan sun toivos, riemus loistossaan, ja kerran, laulus synnyinmaa korkeemman kaiun saa.-

      Täällä macro-ohjetta: http://www.excel-easy.com/vba/create-a-macro.html
      Alla koodi, joka kopioi Taul1:B-sarakkeessta 20 riviä Taul2:sta löytyvään vapaaseen
      sarakkeeseen.
      Onnistuisi ehkä helpomminkin, mutta ExcelMacro-taito jo vähän ruosteessa.

      Private Sub CommandButton1_Click()

      rowCnt = 20
      Set fromCell = Worksheets("Taul1").Range("B1")
      Set toCell = Worksheets("Taul2").Range("A1")

      Rem Find empty row in destination tab sheet
      colSel = -1
      maxCol = 100
      For ix = 0 To maxCol - 1
      If IsEmpty(toCell.Offset(0, ix)) Then
      colSel = ix
      ix = maxCol
      End If
      Next ix

      Rem Copy cells
      If colSel >= 0 Then
      For i = 0 To rowCnt - 1
      toCell.Offset(i, colSel).Value = fromCell.Offset(i, 0).Value
      Next i
      Else
      MsgBox ("MaxCol error")
      End If
      End Sub

    • aloittelija_asialla

      Moderaattori poisti kolmannenkin viestin, neljäs yritys.

      Itse asia alkaa Maamme-laulun jälkeen.
      ---
      Private Sub CommandButton1_Click()

      rowCnt = 20
      Set fromCell = Worksheets("Taul1").Range("B1")
      Set toCell = Worksheets("Taul2").Range("A1")

      Rem Find empty row in destination tab sheet
      colSel = -1
      maxCol = 100
      For ix = 0 To maxCol - 1
      If IsEmpty(toCell.Offset(0, ix)) Then
      colSel = ix
      ix = maxCol
      End If
      Next ix

      Rem Copy cells
      If colSel >= 0 Then
      For i = 0 To rowCnt - 1
      toCell.Offset(i, colSel).Value = fromCell.Offset(i, 0).Value
      Next i
      Else
      MsgBox ("MaxCol error")
      End If
      End Sub

      Meinaat että Maamme-laulu auttaisi :)

      • makro-mara

        Katsotaan kuinka käy, viesti pysynyt jo puolitoista tuntia.
        Sinun ("aloittelija_asialla") viestisi varmaan kohta katoaa, kun siinä on tuota makro-koodia.


      • makro-mara
        makro-mara kirjoitti:

        Katsotaan kuinka käy, viesti pysynyt jo puolitoista tuntia.
        Sinun ("aloittelija_asialla") viestisi varmaan kohta katoaa, kun siinä on tuota makro-koodia.

        Tarkoitin että suurin osa viestistä on makro-koodia. Olen huomannut, että reilusti jotain muuta tekstiä softakoodin lisäksi auttaa viestien pysymiseen.
        Joko sait makron toimimaan?


      • aloittelija_asialla
        makro-mara kirjoitti:

        Katsotaan kuinka käy, viesti pysynyt jo puolitoista tuntia.
        Sinun ("aloittelija_asialla") viestisi varmaan kohta katoaa, kun siinä on tuota makro-koodia.

        Minä luulen että tuo linkki aheutti poistamisen. Tai sitten robotti väsyi.


      • aloittelija_asialla
        makro-mara kirjoitti:

        Tarkoitin että suurin osa viestistä on makro-koodia. Olen huomannut, että reilusti jotain muuta tekstiä softakoodin lisäksi auttaa viestien pysymiseen.
        Joko sait makron toimimaan?

        Makro toimii hienosti, kiitos siitä.
        Pitää vaan vielä saada muukin taulukko hiottua kuntoon.


      • makro-mara

        Väsyikö tosiaan roboraattori, vai menikö se ymmälleen Maamme-laulusta:)?
        Onko kopioitavassa alueessa aina sama määrä rivejä? Entä onko sarakkeita useita?
        Nyt rivilukumäärä on makro-koodissa, olisiko parempi että se olisi jossain solussa?


      • aloittelija_asialla
        makro-mara kirjoitti:

        Väsyikö tosiaan roboraattori, vai menikö se ymmälleen Maamme-laulusta:)?
        Onko kopioitavassa alueessa aina sama määrä rivejä? Entä onko sarakkeita useita?
        Nyt rivilukumäärä on makro-koodissa, olisiko parempi että se olisi jossain solussa?

        Kopioitavat blokit ovat pysyvän kokoisia ja vastaava painike on alueen jäljessä, joten rivimäärä voi olla koodissa. Useamman sarakkeen kopiointiin ei ole tällähetkellä tarvetta, mutta kuinka makro saadaan kopioimaan esim. kaksi saraketta kerralla?


    • makro-mara

      Solun arvo kopioidaan rivillä:
      toCell.Offset(i, colSel).Value = fromCell.Offset(i, 0).Value
      lisäämällä tämän kopioidaan myös seuraava sarake:
      toCell.Offset(i, colSel 1).Value = fromCell.Offset(i, 1).Value

      • aloittelija_asialla

        Tuo on näköjään helppoa kun sen osaa...
        Mites jos kopioitavissa riveissä olisi välissä sellaisia rivejä joita ei olisi tarpeen kopioida talteen?


      • aloittelija_asialla

        Testailin makroa tuossa vähän, voisiko siihen lisätä helposti äänimerkin kopioinnin tapahtumisesta. Tuo painike jää pohjaan painetuksi ennen kuin klikkaa jotain muuta kohtaa taulukossa, kuitenkin toistuvat painalluksetkin suorittavat kopioinnin normaalisti useampaan kertaan samasta näkymästä. Vai onko tuolle painikkeelle jotain asetusta jolla se ponnahtaisi takaisin ylös?


    • makro-mara

      Lisätty taulukko colTbl, joka määrittelee sarakkeet.

      Private Sub CommandButton1_Click()

      Rem row count to copy
      rowCnt = 20
      Dim colTbl As Variant
      Rem columns to copy, 0=B, 1=C, 2=D, etc.
      colTbl = Array(0, 2, 4)

      Set fromCell = Worksheets("Taul1").Range("B1")
      Set toCell = Worksheets("Taul2").Range("A1")

      Rem Find empty row in destination tab sheet
      colSel = -1
      maxCol = 100
      For ix = 0 To maxCol - 1
      If IsEmpty(toCell.Offset(0, ix)) Then
      colSel = ix
      ix = maxCol
      End If
      Next ix

      Rem Copy cells
      If colSel >= 0 Then
      For i = 0 To rowCnt - 1
      For j = 0 To UBound(colTbl) - LBound(colTbl)
      toCell.Offset(i, colSel j).Value = fromCell.Offset(i, colTbl(j)).Value
      Next j
      Next i
      Else
      MsgBox ("MaxCol error")
      End If
      End Sub

      • aloittelija_asialla

        Tässä esimerkissä kopiointi siis kohdistetaan sarakkeisiin A, C, E, jos oikein käsitin.
        Alunperin tarkoitin kyllä rivien pois jättämistä välistä.


    • makro-mara

      Onhan se buttonisi CommandButton, minulla se toimii. Togglebutton jää pohjaan.
      Meni rivit ja sarakkeet sekaisin. Millaisia rivialueita on tarkoitus kopioida?

      • aloittelija_asialla

        Kyllä se on CommandButton. Voi johtua ihan näytön ominaisuuksistakin tuo ilmiö ettei painikkeen ulkonäkö palaudu entiselleen heti klikkauksen jälkeen, vaan vasta muuta kohtaa klikatessa. Olen nyt läppärillä, pyhien jälkeen vasta oikealla koneella.
        Rivestä tarkoitin että esim. alueelta 1-20 rivit 5-10 jättäisi välistä pois kopioimatta.


    • makro-mara

      Rivit valittavissa rowTbl-taulukolla.

      Private Sub CommandButton1_Click()

      Dim rowTbl As Variant
      Dim colTbl As Variant
      Rem row areas to copy, number pairs [from,to],[from,to], ..
      rowTbl = Array(1, 4, 11, 20)
      rowMax = 100
      Rem columns to copy, 0=A, 1=B, 2=C, etc.
      colTbl = Array(1)

      Set fromCell = Worksheets("Taul1").Range("A1")
      Set toCell = Worksheets("Taul2").Range("A1")

      Rem Find empty row where to copy in destination tab sheet
      colSel = -1
      maxCol = 100
      For ix = 0 To maxCol - 1
      If IsEmpty(toCell.Offset(0, ix)) Then
      colSel = ix
      ix = maxCol
      End If
      Next ix

      Rem Copy cells
      If colSel >= 0 Then
      Application.Speech.Speak ("done")
      Rem Beep
      rowTblIdx = 0
      rowMax = rowTbl(UBound(rowTbl))
      rowIdx = 0
      For i = 1 To rowMax
      If i >= rowTbl(rowTblIdx) Then
      If i <= rowTbl(rowTblIdx 1) Then
      For j = 0 To UBound(colTbl) - LBound(colTbl)
      toCell.Offset(rowIdx, colSel j).Value = fromCell.Offset(i - 1, colTbl(j)).Value
      Next j
      rowIdx = rowIdx 1
      Else
      rowTblIdx = rowTblIdx 2
      If rowTblIdx >= UBound(rowTbl) Then
      i = rowMax
      End If
      End If
      End If
      Next i
      Else
      Application.Speech.Speak ("error")
      MsgBox ("MaxCol error")

      End If
      End Sub

      • aloittelija_asialla

        No nyt makro osaa kaiken, puhuakin. Osaiskohan tuo suomea ja selevää savoa, jos osaisi laittaa oikeat kirjaimet järjestykseen. :)


    • yksinkertaisesti ilman luuppeja...

      vaihda taulukon nimi, johon siirretään sopivaksi samoin kuin sarakkeet

      Private Sub CommandButton1_Click()
      Dim vika As Long
      vika = Worksheets("Sheet2").Range("A65536").End(xlUp).Row
      Union(Range("A1:A4"), Range("A11:A20")).Copy Worksheets("Sheet2").Range("A" & vika 1)
      End Sub

      Keep EXCELing
      @Kunde

      • aloittelija_asialla

        Toimii tällä lyhyelläkin kaavalla. Tämä tallentaa samaan sarakkeeseen peräkkäin kaikki tallennukset. Miten makroa pitäisi muuttaa että eri tallennukset tulisivat aina seuraavaan sarakkeeseen rinnakkain? Mahtuisi ruudulliseen enemmän tallennuksia.


      • aloittelija_asialla kirjoitti:

        Toimii tällä lyhyelläkin kaavalla. Tämä tallentaa samaan sarakkeeseen peräkkäin kaikki tallennukset. Miten makroa pitäisi muuttaa että eri tallennukset tulisivat aina seuraavaan sarakkeeseen rinnakkain? Mahtuisi ruudulliseen enemmän tallennuksia.

        Private Sub CommandButton1_Click()
        Dim vika As Long
        vika = Worksheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Offset(1, 0).Column 1
        Union(Range("A1:A4"), Range("A11:A20")).Copy Worksheets("Sheet2").Cells(1, vika)
        End Sub

        Keep EXCELing
        @Kunde


      • aloittelija_asialla
        kunde kirjoitti:

        Private Sub CommandButton1_Click()
        Dim vika As Long
        vika = Worksheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Offset(1, 0).Column 1
        Union(Range("A1:A4"), Range("A11:A20")).Copy Worksheets("Sheet2").Cells(1, vika)
        End Sub

        Keep EXCELing
        @Kunde

        No nyt :)


      • aloittelija_asialla kirjoitti:

        No nyt :)

        ;-)


      • aloittelija_asialla
        kunde kirjoitti:

        Private Sub CommandButton1_Click()
        Dim vika As Long
        vika = Worksheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Offset(1, 0).Column 1
        Union(Range("A1:A4"), Range("A11:A20")).Copy Worksheets("Sheet2").Cells(1, vika)
        End Sub

        Keep EXCELing
        @Kunde

        Havaintoja testailussa makroilla:
        On makuasia kumpi parempi, "lyhytversio" kopioi solut muotoiluineen, "pitkäversio" kopioi vain solun arvon.
        Jos on tarvetta taulukossa useammalle kopiointipainikkeelle, pitää lyhytversiossa olla omat väliledet jokaiselle, koska kopion kohderiviä ei voi muuttaa, että toinen painike kopioisi alemmille riveille.


      • makro-mara

        Kohderivi määritellään tässä: .. Cells(1, vika), muuta 1:stä suuremmaksi.
        Aika näppärä tuo lyhyt-toteutus, tiennytkään noista xlToLeft, Union ym. ominaisuuksista.


      • aloittelija_asialla
        aloittelija_asialla kirjoitti:

        Havaintoja testailussa makroilla:
        On makuasia kumpi parempi, "lyhytversio" kopioi solut muotoiluineen, "pitkäversio" kopioi vain solun arvon.
        Jos on tarvetta taulukossa useammalle kopiointipainikkeelle, pitää lyhytversiossa olla omat väliledet jokaiselle, koska kopion kohderiviä ei voi muuttaa, että toinen painike kopioisi alemmille riveille.

        Ja vielä sen huomasin, että komentopainike jää "aktiiviseksi" painamisen jälkeen, eikä päivitys palaa ruudulle, ennen kuin klikkaa jotain muuta kohtaa ruudulla. Noh laitoin piruuttani makrokoodin loppuun "ActiveCell.Select" -komennon. Tämä poisti tuon pienen kauneusvirheen, lieneekö tämä fiksaus ollut oikeaoppinen?


      • aloittelija_asialla
        makro-mara kirjoitti:

        Kohderivi määritellään tässä: .. Cells(1, vika), muuta 1:stä suuremmaksi.
        Aika näppärä tuo lyhyt-toteutus, tiennytkään noista xlToLeft, Union ym. ominaisuuksista.

        Kappas, tuota en hoksannut, etsin vain jotain row tai A1 -viittauksia.
        Myös tuohon toiseen Cells komentoon on solunumero vaihdettava.
        Pitäisiköhän ihan alkaa ja opetella tuota Visual Basicia :)


    • salaiset_ansiot

      Joo o. Kun syötät sinne jotain lukuarvoi, niin tapahtuuko kaikkei tiedejutskii?

      • tiede-tekniikka

        Tietotekniikka ei tiedehommiin kyllä liity laisinkaan.
        Tämä on suoli24-palstanjako-.ongelma, tiede pitäisi olla omassa hakemistossa ja tekniikka omassa.


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

    Luetuimmat keskustelut

    1. Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita

      Pupuhuhdasta löytyi lähes sadan kilon miljoonalasti huumeita – neljä Jyväskylän Outlaws MC:n jäsentä vangittu: "Määrät p
      Jyväskylä
      56
      1846
    2. Persut petti kannattajansa, totaalisesti !

      Peraujen fundamentalisteille, vaihtkaa saittia. Muille, näin sen näimme. On helppo luvata kehareille, eikä ne ymmärrä,
      Maailman menoa
      48
      1628
    3. Ei luottoa lakko maahan

      Patria menetti sovitun ksupan.
      Suomen Keskusta
      52
      1564
    4. Nähtäiskö ylihuomenna taas siellä missä viimeksikin?

      Otetaan ruokaöljyä, banaaneita ja tuorekurkkuja sinne messiin. Tehdään taas sitä meidän salakivaa.
      Ikävä
      5
      1507
    5. Sinäkö se olit...

      Vai olitko? Jostain kumman syystä katse venyi.. Ajelin sitten miten sattuu ja sanoin ääneen siinä se nyt meni😅😅... Lis
      Ikävä
      6
      1495
    6. Housuvaippojen käyttö Suomi vs Ulkomaat

      Suomessa housuvaippoja aletaan käyttämään vauvoilla heti, kun ne alkavat ryömiä. Tuntuu, että ulkomailla housuvaippoihin
      Vaipat
      6
      1405
    7. Hyvää yötä ja kauniita unia!

      Täytyy alkaa taas nukkumaan, että jaksaa taas tämän päivän haasteet. Aikainen tipu madon löytää, vai miten se ärsyttävä
      Tunteet
      8
      1306
    8. Lepakot ja lepakkopönttö

      Ajattelin tehdä lepakkopöntön. Tietääkö joku ovatko lepakot talvella lepakkopöntössä ´vai jossain muualla nukkumassa ta
      12
      1281
    9. Revi siitä ja revi siitä

      Enkä revi, ei kiinnosta hevon vittua teidän asiat ja elämä. Revi itte vaan sitä emborullaas istuessas Aamupaskalla
      Varkaus
      4
      1163
    10. Kello on puoliyö - aika lopettaa netin käyttö tältä päivältä

      Kello on 12, on aika laittaa luurit pöydälle ja sallia yörauha kaupungin asukkaille ja työntekijöille. It is past midni
      Hämeenlinna
      4
      1128
    Aihe