Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: type mismatch

Sivun loppuun

Heglund [04.01.2013 23:57:29]

#

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!

samip [05.01.2013 00:05:59]

#

en VBA:sta mitään tiedä mutta tuo IsNumeric(...) <= 14 vaikuttaa vähän oudolta. eikös isNumeric palauta boolean?

groovyb [05.01.2013 00:20:16]

#

Jep, isNumeric palauttaa booleanin.

Grez [05.01.2013 01:44:50]

#

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

neau33 [05.01.2013 10:00:33]

#

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

Heglund [05.01.2013 18:23:24]

#

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!

Chiman [05.01.2013 19:24:04]

#

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.

Grez [05.01.2013 19:24:17]

#

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

neau33 [06.01.2013 10:47:24]

#

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?

Heglund [06.01.2013 18:32:00]

#

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


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta