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

506

    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. Nurmossa kuoli 2 Lasta..

      Autokolarissa. Näin kertovat iltapäivälehdet juuri nyt. 22.11. Ja aina ennen Joulua näitä tulee. . .
      Seinäjoki
      145
      8470
    2. Joel Harkimo seuraa Martina Aitolehden jalanjälkiä!

      Oho, aikamoinen yllätys, että Joel Jolle Harkimo on lähtenyt Iholla-ohjelmaan. Tässähän hän seuraa mm. Martina Aitolehde
      Suomalaiset julkkikset
      46
      2378
    3. Kaksi lasta kuoli kolarissa Seinäjoella. Tutkitaan rikoksena

      Henkilöautossa matkustaneet kaksi lasta ovat kuolleet kolarissa Seinäjoella. Kolmas lapsi on vakasti loukkaantunut ja
      Maailman menoa
      27
      2210
    4. Et olisi piilossa enää

      Vaan tulisit esiin.
      Ikävä
      36
      1822
    5. Miten meinasit

      Suhtautua minuun kun taas kohdataan?
      Ikävä
      95
      1748
    6. Miksi pankkitunnuksilla kaikkialle

      Miksi rahaliikenteen palveluiden tunnukset vaaditaan miltei kaikkeen yleiseen asiointiin Suomessa? Kenen etu on se, että
      Maailman menoa
      181
      1717
    7. Sinä saat minut kuohuksiin

      Pitäisiköhän meidän naida? Mielestäni pitäisi . Tämä värinä ja jännite meidän välillä alkaa olla sietämätöntä. Haluai
      Tunteet
      20
      1138
    8. Tunnekylmä olet

      En ole tyytyväinen käytökseesi et osannut kommunikoida. Se on huono piirre ihmisessä että ei osaa katua aiheuttamaansa p
      Ikävä
      108
      1133
    9. Taisit sä sit kuiteski

      Vihjata hieman ettei se kaikki ollutkaan totta ❤️ mutta silti sanoit kyllä vielä uudelleen sen myöhemmin 😔 ei tässä oik
      Ikävä
      5
      1019
    10. Oletko miten

      Valmis läheisyyteen?
      Ikävä
      53
      1015
    Aihe