Osaako joku kertoa mikä koodissa on vikana? tarkoituksena on laskea tietystä alueesta ehtojen mukaiset luvut yhteen. Alueessa on kuitenkin soluja, joissa on tekstiä, mutta niitä ei ole tarkoitus laskea. Ensimmäiset kaksi solua menee hyvin läpi, mutta saavuttaessa kolmanteen soluun, jossa on teksi "XXX" tulee virhesanoma "type mismatch". Koodinluku keskeytyy kolmannella kerralla kohtaan "Summa = Summa + (Cells(Row, Col).Value)". Millä koodilla noi tekstisolut voi ohittaa? Tässä koodi:
Sub Summaus() Dim Row As Integer Dim Col As Integer Dim Summa As Long Sheets("1. Summaus").Select For Row = 1 To 30 For Col = 1 To 6 If IsNumeric(Cells(Row, Col).Value) <= 14 Or IsNumeric(Cells(Row, Col).Value) >= 56 Then Summa = Summa + (Cells(Row, Col).Value) End If Next Next Range("J6") = Summa End Sub
Mod. lisäsi kooditagit!
en VBA:sta mitään tiedä mutta tuo IsNumeric(...) <= 14 vaikuttaa vähän oudolta. eikös isNumeric palauta boolean?
Jep, isNumeric palauttaa booleanin.
VBA:ssahan boolean True on -1 ja boolean False on 0. Eli siis tulkin kannalta tuo koodi näyttää ihan järkevältä ja ehto toteutuu aina koska sekä -1 että 0 ovat pienempiä kuin 14.
Jos arvaan mitä tuossa yritetään tehdä, niin seuraava voisi olla toimivampi:
Sub Summaus() Dim Row As Integer Dim Col As Integer Dim Summa As Long Dim Luku As Long Sheets("1. Summaus").Select For Row = 1 To 30 For Col = 1 To 6 If IsNumeric(Cells(Row, Col).Value) Then Luku = CLng(Cells(Row, Col).Value) If Luku <= 14 Or Luku >= 56 Then Summa = Summa + Luku End If End If Next Next Range("J6") = Summa End Sub
Moi Heglund!
Sub Summaus() Dim solu, alue Sheets("1. Summaus").Select Set alue = Range("A1:F30") Range("J6").Clear For Each solu In alue If IsNumeric(solu.Value) Then Select Case solu.Value Case Is <= 14, Is >= 56 Range("J6").Value = _ Range("J6").Value + _ CLng(solu.Value) End Select End If Next Set alue = Nothing End Sub
Kiitos neau33! Toi sun koodi toimi, mutta Grez:in koodissa tuli syntax error "If IsNumeric(Cells(Row, Col).Value)" kohdassa.
Jos vielä palaan tuohon mun ensimmäiseen koodiin niin osaako joku sanoa, että miksi excel lukee tuon mun koodin jos siinä on vaan ehtona tuo <=14? Kun teen saman koodin, mutta vaihdan tuon <=14 ---> >=56 niin koodi ei toimi?
Sub Summaus() Dim Row As Integer Dim Col As Integer Dim Summa As Long Sheets("1. Summaus").Select For Row = 1 To 30 For Col = 1 To 6 If IsNumeric(Cells(Row, Col).Value) <= 14 Then Summa = Summa + (Cells(Row, Col).Value) End If Next Next Range("J6") = Summa End Sub
Mod. lisäsi kooditagit!
Heglund kirjoitti:
Jos vielä palaan tuohon mun ensimmäiseen koodiin niin osaako joku sanoa, että miksi excel lukee tuon mun koodin jos siinä on vaan ehtona tuo <=14? Kun teen saman koodin, mutta vaihdan tuon <=14 ---> >=56 niin koodi ei toimi?
Se selitettiin jo ylempänä. IsNumeric palauttaa True tai False, joiden arvo on -1 ja 0. Kummatkin ovat pienempiä tai yhtäsuuria kuin 14.
Heglund kirjoitti:
Grez:in koodissa tuli syntax error "If IsNumeric(Cells(Row, Col).Value)" kohdassa.
Olin näköjään unohtanut "Then" ko. rivin lopusta. No, pitäis varmaan testata ennen kuin postaa. Korjasin nyt senkin sinne.
Heglund kirjoitti:
osaako joku sanoa, että miksi excel lukee tuon mun koodin jos siinä on vaan ehtona tuo <=14? Kun teen saman koodin, mutta vaihdan tuon <=14 ---> >=56 niin koodi ei toimi?
Sanoisin kyllä että kummallakin tavalla koodisi toimii suunnilleen yhtä hyvin eli huonosti. Jos siellä on <=14 niin se laskee yhteen kaikki alueella olevat luvut niiden suuruudesta riippumatta ja mikäli joukossa on tekstiä antaa virheen. Jos taas siellä on >=56 niin se laskee yhteen ei yhtäkään lukua, mutta ei toisaalta anna virhettä vaikka olisi tekstiä. Kumpikaan tapa tuskin on se mitä olet hakenut. Syy ja korjaus selitettiin jo aikaisemmin.
If IsNumeric(Cells(Row, Col).Value) <= 14 Then 'on monimutkainen tapa sanoa: If True Then
Ja vastavaatavasti
If IsNumeric(Cells(Row, Col).Value) >= 56 Then 'on monimutkainen tapa sanoa: If False Then
Moi taas Heglund!
Elikä siis IsNumeric -funktio palauttaa joko arvon True (-1) tai False (0)
Tämä pätkä: If IsNumeric(Cells(Row, Col).Value) <= 14
palauttaa aina arvon TOSI koska sekä -1 että 0 ovat pienempiä, kuin 14
Tämä pätkä: IsNumeric(Cells(Row, Col).Value) >= 56 Then
palauttaa aina arvon EPÄTOSI koska sekä -1 että 0 ovat pienempiä, kuin 56
Jotenka ehtolauseesi on kutakuinkin seuraava: If True Or False Then
elikä aina pääsee läpi oli solun arvo numeerinen tahi sitten ei...
Nyt jos testattavan solun arvo ei ole numeerinen ja Summa -muuttuja
on määritelty luvuksi (Long ~ pitkä kokonaisluku) niin virhe syntyy silloin,
kun Summa -muuttujan arvoon yritetään ynnätä ei numeerinen arvo eli solun
arvo sisältää tekstiä tai arvo on tyhjä merkkijono ("")...
Tarkastellan vielä alkuperäisen kysymyksesi koodia...
'... If IsNumeric(Cells(Row, Col).Value) <= 14 Or _ IsNumeric(Cells(Row, Col).Value) >= 56 Then Summa = Summa + (Cells(Row, Col).Value) 'jos korvaat pätkän: (Cells(Row, Col).Value) 'tällä pätkällä: Val(Cells(Row, Col).Value) 'niin Summaan lisätään 0 jos arvo ei ole numeerinen 'elikä virhettä ei tapahdu koska Val -funktio palautaa 'ei numeerista parametriarvosta numeerisen arvon 0 End If '...
Nyt jos tarkoituksesi oli, että summaan lisätään jos solun arvo on
pienempi kuin 15 tai suurempi kuin 55 niin homma hoituu esim. näin:
Sub Summaus() Sheets("1. Summaus").Select Range("J6").Clear For Each solu In Range("A1:F30") Select Case Val(solu.Value) Case Is < 15, Is > 55 Range("J6").Value = _ Range("J6").Value + Val(solu.Value) End Select Next End Sub
lisää valaistusta?
En tarvitse lisää valaistusta tästä asiasta. Kiitos kaikille jotka yrititte auttaa. Nyt osaan kyseisen tehtävän :D
(Mod. huom: tee uudesta kysymyksestä uusi keskustelu!)
Aihe on jo aika vanha, joten et voi enää vastata siihen.