Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Apua aloittelevalle

Guuna [12.04.2012 18:33:08]

#

Tarkoitus on siis, että nappia painamalla koodi laskee asteen, jonka jälkeen kertoo sen tekstilaatikossa. Mikä mahtaa olla pielessä kun ei toimi? Tämä on siis excelissä toimiva pieni makro.

Private Sub CommandButton2_Click()

Dim t As Integer
Dim m As Integer
Dim aste As Double

    t = Worksheets("Sheet1").Cells(3, 17).Value
    m = Worksheets("Sheet1").Cells(7, 17).Value

aste = t / (m * -1)

If aste > 1.5 Then
    MsgBox "Omavaraisuusasteesi on" + Str(aste) + ". Kaikki vaikuttaa hyvätlä."

ElseIf aste < 1 Then
    MsgBox "Omavaraisuusasteesi on" + Str(aste) + ". Menosi ylittää tulosi. Kiristä budjettia."

Else aste > 1 And aste < 1.5
    MsgBox "Omavaraisuusasteesi on" + Str(aste) + ". Tulosi on vain hieman suuremmat kuin menosi. Kiristä budjettia tarvittaessa."

End If


End Sub

Sainki jo ratkaistua osin tuon. Käytänkin siis vain ElseIf -rakennetta ja sitten pitäs toimia. Nyt tuli toinen ongelma. Subscript out of range. Mitähän nyt?

Mod. korjasi kooditagit!

neau33 [12.04.2012 20:50:57]

#

Moikka Guuna!

Ensinnäkin et voi If...Then...Else lauseessa sijoitta vertailua enää Else osalle vaan Else kattaa kaikki muut mahdollisuudet, joita If/ElseIf osien sisältämä vertailut eivät toteuta. Elikäs seuraavan mallin mukaan:

Dim ilmo As String
If aste >= 1.5 Then 'tarkista myös ateen arvon kaava!!!
   ilmo = "plaa plaa plaa..."
Elseif aste < 1 Then
   ilmo =  "plöö plöö plöö..."
Else 'kaikissa muissa tapauksessa
   ilmo = "plää plää plää..."
End If
MsgBox ilmo

 
tahi

Dim ilmo As String
Select case aste
   Case Is >= 1.5
      ilmo = "plaa plaa plaa..."
   Case Is < 1
      ilmo =  "plöö plöö plöö..."
   Case Else
      ilmo = "plää plää plää..."
End Select
MsgBox ilmo

Toisekseen Subscript out of range ilmoitus johtunee siitä, että käytössäsi on suomenkileinen Excel jolloin et voi viitata laskentataulukoon käyttämällä nimeä "Sheet1" (jos et erikseen ole nimennyt jotain taulukkoa ko. nimellä). Mikäli epäilyni osui oikeaan niin voit tehdä viittauksen esim. tyyliin: t = Sheets("Taul1").Cells(3, 17).Value jne.

-Nea-

tkok [12.04.2012 23:11:14]

#

Kannattaa tarkistaa ettei tuo m ole nolla, jottei tule nollalla jako.

Guuna [13.04.2012 00:10:13]

#

Ilmeisesti pitäs toimia noin. En vieläkään tiedä, mistä tuo Subscript out of range -tulee. Exceli on tosiaan suomenkielinen, mutta kaikki sheettien nimet ym. täsmää. Debuggaus herjaa siis t = Worksheets("Sheet1").Cells(3, 17).Value -kohdassa.

Private Sub CommandButton2_Click()

Dim t As Integer
Dim m As Integer
Dim aste As Double

    t = Worksheets("Sheet1").Cells(3, 17).Value
    m = Worksheets("Sheet1").Cells(7, 17).Value

aste = t / (m * -1)

If aste >= 1.5 Then
    MsgBox "Omavaraisuusasteesi on" + Str(aste) + ". Kaikki vaikuttaa hyvältä."

ElseIf aste < 1 Then
    MsgBox "Omavaraisuusasteesi on" + Str(aste) + ". Menosi ylittää tulosi. Kiristä budjettia."

ElseIf aste >= 1 And aste < 1.5 Then
    MsgBox "Omavaraisuusasteesi on" + Str(aste) + ". Tulosi ovat vain hieman suuremmat kuin menosi. Kiristä budjettia tarvittaessa."

End If


End Sub

Grez [13.04.2012 00:51:30]

#

Sinänsähän tuottaisi täsmälleen saman lopputuloksen jos rivi 18 olisi

Else

Tuohon "Subscript out of range"-ilmoitukseen. Jos kirjoitat immediate ikkunaan (ja enteriä perään)

? worksheets(1).Name

Niin sanooko se Sheet1 kuten koodissasi lukee?

Esimerkiksi (kuten Nea sanoikin) suomenkielisessä Excelissä tulos olisi tällainen:

? worksheets(1).Name
Taul1

Eli tietekään mitään "Sheet1" taulukkoa ei löydy, jos sen nimi on vaikkapa "Taul1".

Guuna [14.04.2012 19:14:00]

#

Liekö sitten joku kirjoitusvirhe tms. kun antoi tuon Subscript out of range. Mielestäni nimet täsmäsivät kokoajan ja tajusin kyllä, mikä oli jutun juoni. Nyt on kuitenki taas jo uusi herjaus 'type mismatch' highlightattuna on:

t = Worksheets("Ohjelma").Cells(3, 17).Value

Mikä ihme tässä nyt on?

neau33 [14.04.2012 19:40:20]

#

Moi taas Guuna!

Johtuupi todennäköisesti siitä, että sulla on ko. solu tahi koko sarakkeen ja/tai rivin solut määritetty muotoiluasetuksissa esim. tekstiksi, päivämääräksi tms. tahi jos et ole tehnyt mitään muutoksia jolloin tyyppi on oletuksena yleinen (variant) ja olet typonnut (finger failure) luvun sekaan vahingossa kirjainmerkin ja yrität sijoittaa ko. solun arvoa muuttujaan t jonka olet määrittänyt integer (kokonaisluku) tyyppiin.

Toisekseen rohken kyllä vahvasti epäillä, että olisit vielä missään vaiheessa todella tajunnut (anteeksi vaan) mikä jutun juoni oli eli on...

Ystävällisin terveisin
Nea Uusitalo

Vastaus

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

Tietoa sivustosta