"Summa"-alueesta läpikäydään Excelissä solut ja ne joissa on sisältöä pitäisi saada valittua summafunktioon.
Alla olevalla virityksellä saan muita tapahtumia aikaan mutta kuinka kyseiset solut saa valittua summafunktioon?
Private Sub CommandButton5_Click() Const a As Integer = 0 For Each x In Range("Summa").Cells If x.Value <> a Then x.???????????????? End If Next x End Sub
Mod. lisäsi kooditagit
Tyhmä kysymys, mutta eikö tulos olisi ihan sama, vaikka nollat ottaisi mukaan summaan?
Sitten toinen tyhmä kysymys, että miksei summa.jos - funktio käy?
Eli siis =SUMMA.JOS(Summa;"<>0")
Jos nyt kuitenkin väkisin haluat tehdä summan, jolle annat ohjelmallisesti listan soluja, niin Formulaksi tulee tehdä jotain seuraavan tyylistä "=SUM(A1,B3,C3,C4,D2)"
Kysymys ei ole summasta vaan loppuviimeksi summafunktion rangen määrityksestä. Summattavien rivien määrä vaihtelee ja summafunktion sisältävä solu pannaan kohdalleen offsetilla mutta summattavien rivien määrää ei tiedetä.
=SUMMA(Rangen solut joissa sisältöä) ja offsetillä viimeisen summattavan arvon jälkeen (esim. offset 3,0) summasolu.
Joku saattaisi keksiä tähän toisenkin ratkaisun...
Niin no järkevimpiä vastauksia on mahdoton keksiä kun ei kerrota mitä oikeasti halutaan tehdä.
Eli jos kerran ei ole kyse summafunktiosta niin sitten ilmeisesti on kyse jostain muusta funktiosta ja jostain syystä haluat pimittää mistä funktiosta on kyse eli mitä olet oikeasti tekemässä.
Noilla lähtökohdilla et varmasti tule saamaan parasta ratkaisua.
Tarkoitukseni ei todellakaan ole pimittää tietoa.
Summafunktioon on tarkoitus saada summafunktion kaipaama alue(Range) josta summa muodostetaan. Koska summafunktion sisältävä solu sijoittuisi offsetilla 3 riviä alemmas kuin viimeinen summattava solu, pitäisi summattavien rivien määrä saada selvitettyä jotta valittavien solujen alue saataisi selville.
Summattavien rivien määrää ei todellakaan tiedetä ennakkoon.
"Summa"-alue on yhdessä sarakkeessa.
Miten saataisi aiemmassa VB:ssä solut, joissa on sisältöä (x), valittua...(?????????)
Toivon osanneeni selvittää asian...
No, kuten jo aikaisemmin kirjoitin, että jos tosiaan haluat VB:llä valita tietyt solut summafunktiolle, niin teet vaan koodin, joka tuottaa sopivan summafunktion sisältävän formulan siihen soluun. Eli jos siellä suomeksi pitäisi lukea =SUMMA(A1;B3;C2:D8) niin sitten ohjelmallisesti laitat sinne formulaksi =SUM(A1,B3,C2:D8)
Siis tuo on esimerkki, osannet soveltaa sitä omaan tilanteeseesi.
Toisaalta jos tarkoitus on tehdä näyttämäsi koodin mukaan, että summaan otetaan mukaan sellaiset solut, joissa arvo on muu kuin tietty vakio, niin en edelleenkään ymmärrä mikset käytä summa.jos -funktiota, kun se on juuri siihen tarkoitettu.
Ei tiedetä onko =SUMMA(F5:F12) vai =SUMMA(F5:F75).
Olennainen: miten määrittää solut, jotka täytävät ehdon (solu ei ole tyhjä) valittavaksi (select). Arvo ei ole vakio!
x.Select ei sovellu... Mitä muuta???
No siis sitähän sä siinä VB-koodissa käsittääkseni olit tekemässä. Selvittämässä niitä soluja.
Jos se koodi selvittää, että esimerkiksi solut F5:F12 pitää ottaa mukaan niin silloin sen koodin pitäisi muodostaa esimerkiksi formula =SUM(F5:F12)
Olennainen:
Koodin 5. rivi,
x._____.Select
Mitä puuttuu välistä ? Cells ei toimi...
Tarkoitus saada haettu alue valituksi/aktiiviseksi summafunktiota varten.
SUMMA.JOS sekoaa koska summafunktio asetetaan "Summa"-alueelle.
En varmaankaan yritä hommaa helpoimman kautta mutta aloittelijan täytyy lähes kaikkea kokeilla.
Kiitos tähänastisesta kärsivällisyydestä.
En kyllä yhtään käsitä miksi haluat tehdä valintoja (.Select), mutta voit laittaa alkuperäiseen koodiisi riville 5: x.Select
Tällöin se jokaisella loopissa käyntikerralla valitsee sen yhden solun.
Mutta jotenkin minusta tuntuu että sinulla ei ole ihan perusjutut excelistä nyt hallussa. Kokeile laittaa päälle makron nauhoitus, tee ihan taulukon puolella käsin se, mitä haluat ohjelmasi tekevän, ja katso minkälaista koodia makroon tulee.
Kiitos tästä, täytynee koettaa keksiä jotakin muuta...
Ai niin, ei minulla tuo summa.jos funktio sekoillut mitenkään vaikka laitoin sen osoittamaan Summa nimiselle alueelle.
Ja en nyt ymmärrä tuotakaan miksi pitäisi keksiä jotain muuta, teet vaan niin kuin olen tässä pariin kertaan neuvonut (jos siis tuo summa.jos ei tosiaan kelpaa)
Laitahan "Summa"-alueelle summafunktio soluun 'viimeinen summattava offset(3,0)' eli 3 solua viimeisen summattavan alapuolelle.
Summattavia voi olla esim. 3 tai 40 tai jtn eli minulla summa-alue on sen mukaan riittävän laaja. Summa funktion sisältävä solu kopioidaan paikalleen Buttonilla.
Näkemykseni mukaisia ratkaisuvaihtoehtoja:
-rajata koodilla (nimetä) range summien lukumäärän mukaan jolloin summasolun sijainnilla ei ole väliä. Tällöin pitäisi alkuperäisen viestin mukaan saada valittua kyseinen koko summattavien alue.
-saada summasolu rajaamaan itsensä pois laskuista ettei summa tuplaannu.
Muutkin ratkaisut huomioidaan. Toivottavasti tämä selvittäisi ongelmaa.
Lainaus Greziltä "Mutta jotenkin minusta tuntuu että sinulla ei ole ihan perusjutut excelistä nyt hallussa."
Exceliä olen pyörittänyt jonkin verran työn ohessa ja harrasteena, VB:tä vähän koettanut tutustua... Aloitteleva harrastaja toki jonka ei pidä helpoimmalla tavalla edetä, kantapään kautta kivun kanssa edeten.
Minulla oli ehdotuskin tuohon ongelmaan että perusjutut ei ole hallussa, mutta et ilmeisesti noudattanut sitä(kään) ohjetta.
Eli kai sitten teen sen puolestasi:
- Laitan taulukkoon vähän lukuja (kun minulla ei ole valmiina taulukkoa kuten sinulla olisi)
- Laitan makron nauhoittumaan
- Valitsen solun johon haluan summan
- Valitsen että haluan ko. soluun summafunktion
- Valitsen solut, jotka haluan mukaan summaan
- Lopetan makron nauhoituksen
Kas näin, Excel väänsi minulle rautalangasta miten homma tehdään ohjelmallisesti.
Sub TestiMakro() ' ' TestiMakro Makro ' HoPon puolesta tehty nauhoitus ' Range("B11").Select ActiveCell.FormulaR1C1 = _ "=SUM(R[-6]C:R[-3]C,R[-6]C[1]:R[-4]C[1],R[-5]C[2],R[-4]C[3]:R[-3]C[3])" End Sub
Eli jos haluaisit tehdä saman niin, että ohjelma valitsee mitkä solut summaan otetaan, niin muodostat vaan ohjelmallisesti tuon kaltaisen Formulan tai suhteellisen FormulaR1C1:n (kuten olen jo neuvonutkin).
Kiitos, Grez, sisukkaasta väännöstä.
Tässä on lopulta se mitä hain:
Private Sub CommandButton6_Click() Application.ScreenUpdating = False 'Hintojen valinta Dim Hinnat As Range Range("H18", Range("H65536").End(xlUp)).Select Selection.Name = "Hinnat" 'Funktio ynnä-soluun Range("AC3").Select Selection.Formula = "=SUM(HINNAT)" 'Kopioidaan ynnä-solu laskulle Application.Goto Reference:="Laskuala" Selection.Copy Range("A65536").End(xlUp).Offset(4, 0).Select ActiveSheet.Paste End Sub
Kanta(-kin)päät kipeänä mutta mieli huojentunut.
Ketjun varrella oli väärinkäsityksiäkin mutta nyt on hyvä.
Jatketaan...
Aihe on jo aika vanha, joten et voi enää vastata siihen.