Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: VB: Solun osoite

turistit [24.07.2006 18:08:08]

#

Moro! Tarvitsemme apua Vbasic-koodauksessa.

Set alue = Application.Sheets(1).Range("A5", "A29")

For Each solu In alue
   If solu.Value = tunnit Then
       solu_rivi =           <- ???
   End If
Next

Mitä tuohon solu_rivi jälkeen pitää kirjoittaa, että saamme tallennettua kyseisen solun "osoitteen" rivin numeromuodossa muuttujaan solu_rivi ?

(Mod. edit: kooditagit.)

moptim [25.07.2006 07:47:49]

#

Pistäkääpä End Ifin jälkeen rivi

i = i + 1

ja määritelkää alussa muuttuja i. Koodin pitäisi näyttää tällaiselta:

Static i As Integer
Set alue = Application.Sheets(1).Range("A5", "A29")

For Each solu In alue
   If solu.Value = tunnit Then
       solu_rivi = i
   End If
  i = i + 1
Next

En kyllä ole koodannut VB.NETillä, mutta olin huvin vuoksi lukenut For Each loopista, joten ymmärsin, että kuinka kauan tuo vinkuu silmukassa. Ajattelin myös, että tuossa silmukassa ei taida olla silmukan suorituskerran mukaan kasvavia muuttujia, joten loin i:n.

turistit [01.08.2006 09:40:37]

#

Kiitokset vinkeistä! Tässä seuraava ongelma (tuli palautteena kaverilta)

Just noista tyyppimuutoksista puhuin teille. Eihän tollanen koodi voikaan toimia:

Dim tunnit As Integer
tunnit = Mid(aika, 1, 2)

Mid palauttaa stringin mitä oot sijoittamassa Integerin paikalle.


Eli miten Mid funktion palauttama string saadaan muutettua integeriksi?

Antti Laaksonen [01.08.2006 09:58:17]

#

Tässä on kolme tapaa muuttaa merkkijono kokonaisluvuksi:
1. luku = mjono
2. luku = Val(mjono)
3. luku = CInt(mjono)

Ensimmäinen tapa on automaattinen tyyppimuunnos. Tavallisesti VB huolehtii itse tyyppimuunnoksesta.

Val-funktio muuttaa merkkijonon ylipäätään numeeriseksi, ja CInt-funktio muuttaa merkkijonon kokonaisluvuksi.

Kaveri siis hieman erehtyi: tuo koodi toimii, jos Mid-funktion tuloksena on kokonaisluku.

Jos merkkijonossa on muuta kuin numeroita, suora sijoitus ja CInt-funktio aiheuttavat virheen. Val-funktio taas palauttaa silloin arvon 0. Merkkijonon numeerisuuden (kelpaako se numeroksi) voi tarkistaa IsNumeric-funktiolla.

Minä käytän yleensä tässä tilanteessa Val-funktiota selkeyden vuoksi.

Merri [01.08.2006 11:30:27]

#

Lisätarkennuksena, että Val palauttaa liukuluvun (Double) eikä kokonaislukua, mutta VB osaa muuntaa näitä eri tyyppejä ristiin automaagisesti (oikeampi termi lienee pakotus). Eli jos tahtoo laittaa täydellisesti oikeaan muotoon ilman automaattisuuksia, niin koodi olisi intLuku = CInt(Val(strLuku))

Huomautuksena vielä, että VB käyttää pankkiirin pyöritystä (banker's rounding), mikä tarkoittaa sitä, etteivät puolikkaat luvut mene aina perinteisen pyöristyslogiikan mukaan. Eli esim. 1.5 ja 2.5 pyöristyvät molemmat lukuun 2 (jos nyt ulkomuistista väännän oikein). Hyöty on se, että tämä vähentää vääristymiä rahasummien kanssa.

Jos vielä tahtoo estää tämän tapahtumisen, niin voi valintansa mukaan käyttää joko Fix() tai Int() komentoa; Int pudottaa desimaalit pois, Fix pyörittää ylempään tasalukuun. Jos yhtään oikein muistan (en voi tarkistaa nyt), niin Fix ja Int palauttavat Long kokonaislukutyypin.


Muoks!
Lisänä vielä, että kannattaa tosiaan muuttaa oikeaan muuttujatyyppiin käytön ja tarpeen mukaan, esim. lukujen vertailu string-tasolla keskenään antaa odottamattomia vastauksia: ("10" < "5") antaa vastaukseksi True eikä False, koska merkki viisi tulee merkin yksi jälkeen aakkosjärjestykseen laitettaessa.

setä [01.08.2006 13:15:58]

#

Tämä on todellakin pikun viilausta, mutta kannattaa myös huomata Val-funtion piirre, ettei se palauta desimaaleja ellei desimaalierottimena ole piste. Cdbl tai Csng taas antavat virheilmoituksen, jos desimaalierottimena on piste. Val-funktio ei ilmoittele desimaalierottimesta mitään, vaan jättää kylmästi desimaalit pois jos erottimena on pilkku.

Merri [01.08.2006 14:03:07]

#

Korjaus aiempaan sanomaani: Int ja Fix palauttavat saman muuttujatyypin kuin mitä niille syötetään. Paitsi että Boolean palautuu Integerinä (Boolean on "oikeasti" Integer).

Vastaus

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

Tietoa sivustosta