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?
Kuinka tämän voisi toteuttaa yksinkertaisesti, onko kenelläkään ideoita?
Vastaukset 33
Vanhimmat
POIMI.TEKSTI funktiolla voisi lukea soluista tekstin.
Makro, joka ajetaan kun jotain solu-buttonia klikataan.
Makro kopioi halutut tiedot sinne toiselle välilehdelle.
Tuon toeuttaminen tarvitsee varmaan silmukkatoimintoa, lieneekö sellaista vakiofunktioissa. Makrojen ohjelmointiin ei omat taitoni riitä. Olisiko netin uumenissa paikkaa jossa olisi valmiita makroja eri tarkoituksiin?
Onneksi kerkisin lukea viimeisen viestin ennen robottia.
Täytyypä alkaa kehittelemään tuosta jotain, thanks!
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?
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
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 :)
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?
Minä luulen että tuo linkki aheutti poistamisen. Tai sitten robotti väsyi.
Makro toimii hienosti, kiitos siitä.
Pitää vaan vielä saada muukin taulukko hiottua kuntoon.
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?
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
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?
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?
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
Tässä esimerkissä kopiointi siis kohdistetaan sarakkeisiin A, C, E, jos oikein käsitin.
Alunperin tarkoitin kyllä rivien pois jättämistä välistä.
Onhan se buttonisi CommandButton, minulla se toimii. Togglebutton jää pohjaan.
Meni rivit ja sarakkeet sekaisin. Millaisia rivialueita on tarkoitus kopioida?
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.
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
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
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
No nyt :)
;-)
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.
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.
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?
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 :)
Joo o. Kun syötät sinne jotain lukuarvoi, niin tapahtuuko kaikkei tiedejutskii?
Tietotekniikka ei tiedehommiin kyllä liity laisinkaan.
Tämä on suoli24-palstanjako-.ongelma, tiede pitäisi olla omassa hakemistossa ja tekniikka omassa.