Onko Ideaa?

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?
33623
Äänestä

Muut lukivat myös

Vastaukset 33

Vanhimmat

POIMI.TEKSTI funktiolla voisi lukea soluista tekstin.

Äänestä

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

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

    Äänestä

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

    Äänestä

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?

Äänestä

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

Äänestä

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 :)

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

    Äänestä

  • 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?

    Äänestä

  • 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.

    Äänestä

  • 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.

    Äänestä

  • 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?

    Äänestä

  • 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?

    Äänestä

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

Äänestä
  • 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?

    Äänestä

  • 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?

    Äänestä

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

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

    Äänestä

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

Äänestä
  • 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.

    Äänestä

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

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

    Äänestä

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

Äänestä
  • 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.

    Äänestä

  • 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

    Äänestä

  • 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 :)

    Äänestä

  • aloittelija_asialla kirjoitti:

    No nyt :)

    ;-)

    Äänestä

  • 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.

    Äänestä

  • 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.

    Äänestä

  • 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?

    Äänestä

  • 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 :)

    Äänestä

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

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

    Äänestä

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

Kommentoi aloitusta


aloittelija_asialla kirjoitti:

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?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu