Ongelmani on yhden rivin trimmauksessa.
Rivi, josta pitäisi trimmata on muotoa:
1.1.2004 blaa, blaa 12345
Käytän trimmauksessa seuraavanlaista riviä.
Label3.Caption = Mid$(rr, 19, Len(rr) - 1)
Ongelmani on, että jos rivillä päivämäärä muuttaa muotoaan, esim. 12.12.2004, niin trimmauksessa käytetty luku 19 ei pidä enää paikkaansa.
Eli trimmauksesta pitäisi aina saada luku 12345 (joka on muuttuva) talteen.
Itselläni ei ole vaikutusmahdollisuutta vaikuttaa tuon päivämäärän esitysmuotoon, joten en voi sitä muuttaa esim. muotoon 01.01.2004, jolloin trimmaus onnistuisi aina.
Onko keinoja tehdä trimmaus aina oikein?
Esim voisiko tuossa trimmauksessa määrittää esim siten, että ennen tuota lukua 12345 olisi joku merkkijono, jonka jälkeinen trimmataan, jolloin päivämäärällä ei olisi vaikutusta missä muodossa se milloinkin on.
Esim rivi menisi näin.
1.1.2004 koe 12345
Josta napataan koe aloitusjonoksi, jonka jälkeinen luku 12345 luetaan muistiin joka myös näytetään. Kuinka tuo onnistuisi vai onnistuuko? Näin siis päivämäärällä ei ole merkitystä eikä aiheuta ongelmia.
Vilkaise InStr-funktiota. Lisäksi voit hyödyntää For-silmukkaa, jonka avulla saat etsittyä tietyn merkin (tarkistat, onko kohdassa X tietty merkki. Jos ei, siirryt seuraavaan X:ään).
onko tuo luku 12345 aina viiden numeron suuruinen? Jos on voisit kai käyttää right$(rr, 5) joka ottaa viisi merkkiä oikealta puolelta.
Jos ei ole kiinteän mittainen, niin kuten Metabolix sanoi niin for-silmukalla voi tutkia aina tarkemmin. Voisit esimerkiksi lähteä lukemaan riviä merkki kerrallaan oikealta ja tutkia onko luettu merkki numero (IsNumeric-funktio) ja/tai jatkaa niin kauan kunnes saadaan esim, välilyönti.
Jooh, jos tuolla rivillä ei tule välilyöntejä ennen kohtien "1.1.2004" ja "blaa, blaa" väliä, niin etsi tuolla funktiolla välilyönnin kohta, ja lue siitä eteen/taaksepäin.
esakom kirjoitti:
onko tuo luku 12345 aina viiden numeron suuruinen? Jos on voisit kai käyttää right$(rr, 5) joka ottaa viisi merkkiä oikealta puolelta..
Yleensä se on ollut viiden numeron suuruinen, mutta ei välttämättä aina.
Tuo InStr on vähän sitä suuntaa jota haen, mutta tarvisin ihan konkreettisen koodiesimerkin, kun nämä trimmaushommat ei oikein ole minun lajini.
Rivi, josta pitäisi lukea on tämän muotoinen: (esimerkkirivi)
30.11.2004 Hintaarvio 12,4556
Eli koodissa voisi olla avainsanana Hintaarvio, joka etsitään ja jonka jälkeen kaikki luetaan muuttujaan.
Millainen koodirivi tuollaisesta pitäisi tehdä?
Osan haku:
Private Function HaeLoppu(Mista As String, MinkaJalkeen As String) As String HaeLoppu = Mid(Mista, (InStr(1, Mista, MinkaJalkeen) + Len(MinkaJalkeen) + 1), Len(Mista)) End Function
Testaukseen:
Private Sub Command1_Click() Dim Rivi As String Rivi = "30.11.2004 Hinta-arvio 12,4556" MsgBox HaeLoppu(Rivi, "Hinta-arvio") End Sub
BadSource: Tuossahan on vielä se ongelma, kun Aku2 ei tiedä myöskään sitä tunnistetta (sinulla hinta-arvio). Eikö kaikkein yksinkertaisin olisi funktio split (jos käytössä on VB)?
Private Sub Command1_Click() String data() As String 'Poistetaan turhat spacet päistä pois... Rivi = Trim(Rivi) 'Jaetaan rivi (näin saadaan erilleen päivämäärä, tunnus ja ID) data = Split(Rivi, " ") 'erottimena " " eli väli ' Nyt data(0) on päivämäärä, data(1) on avainsana ja ' data(2) on haettava luku MsgBox data(2) End Sub
Muista sitten myös testata taulukon koko, jos rivillä ilmenee virheellinen muoto.
Tuo sqwiik:n ehdottama splitti toimii varmasti parhaiten tässä tapauksessa: kaikki tiedot saadaan omiin tiedettyihin muuttujiinsa. Oma ehdotukseni toimii vain, jos tunniste on tarkasti tiedossa.
BadSource kirjoitti:
Tuo sqwiik:n ehdottama splitti toimii varmasti parhaiten tässä tapauksessa: kaikki tiedot saadaan omiin tiedettyihin muuttujiinsa. Oma ehdotukseni toimii vain, jos tunniste on tarkasti tiedossa.
Kiitos esimerkeistä.
Tunniste on tarkasti tiedossa, joka ei tule muuttumaan.
En ole noita vielä kokeillut, mutta enköhän noilla pääse eteenpäin.
Tuossa sqwiikin esimerkissä heittää punaiseksi rivin:
String data() As String
Piti varmaan olla Dim, eikä String alkuinen :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.