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?
Onko Ideaa?
35
506
Vastaukset
- 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
@KundeNo 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
@KundeHavaintoja 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
Nurmossa kuoli 2 Lasta..
Autokolarissa. Näin kertovat iltapäivälehdet juuri nyt. 22.11. Ja aina ennen Joulua näitä tulee. . .1458470Joel 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 Aitolehde462378Kaksi lasta kuoli kolarissa Seinäjoella. Tutkitaan rikoksena
Henkilöautossa matkustaneet kaksi lasta ovat kuolleet kolarissa Seinäjoella. Kolmas lapsi on vakasti loukkaantunut ja272210- 361822
- 951748
Miksi pankkitunnuksilla kaikkialle
Miksi rahaliikenteen palveluiden tunnukset vaaditaan miltei kaikkeen yleiseen asiointiin Suomessa? Kenen etu on se, että1811717Sinä 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ä. Haluai201138Tunnekylmä olet
En ole tyytyväinen käytökseesi et osannut kommunikoida. Se on huono piirre ihmisessä että ei osaa katua aiheuttamaansa p1081133Taisit sä sit kuiteski
Vihjata hieman ettei se kaikki ollutkaan totta ❤️ mutta silti sanoit kyllä vielä uudelleen sen myöhemmin 😔 ei tässä oik51019- 531015