Mulla on pari tuhatta sanaa jotka on tällä tavalla: "sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana sana"
ja haluaisin jokaisen omalle rivilleen näin:
"sana
sana
sana
sana
sana
sana
sana
sana
sana
sana
sana
sana"
Mitenkäs tuo onnistuisi?
Ja sitten vielä että miten saisin kun mulla on teksti jossa on sanoja riveillä ja haluaisin että se poistaisi kaikki rivit joissa on alle 5 merkkiä?
Kuinkas sellaisen ohjelman teen?
Jos sulla on VB6 niin Replace-funktiolla voit korvata välilyönnin rivinvaihtomerkillä vbCrLf. Jos aiempi versio niin kopioit tekstin uudeksi korvaamalla välilynnit rivivaihtomerkillä.
Rivin pituuden saat selville Len-funktiolla ja rivin loppukohdan InStr-funktiolla jolla haetaan rivinvaihdot eli merkkiyhdistelmä vbCrLf. Jos rivin pituus on alle 5 merkkiä jätät sen kopioimatta.
Olisi kiva jos voisit näyttää esimerkin.
Dim lehma As String, lammas As String lehma = "moomoomoomoomoo" lammas = Replace(lehma, "o", "ä") MsgBox lammas 'tulostaa määmäämäämäämää
Kiitos, laitoin textboxiin pari tuhatta sanaa ja käytin tuota mutta textboxiin jäi vain kolmasosa sanoista. Mihinkäs loput hävisi?
Miten tuota Len-funktiota käytetään?
Haku olisi antanut useita esimerkkejä, mutta tässä yksi lisää...
Dim rivi As String: rivi = "FooBar" MsgBox Len(rivi) 'palauttaa messageboxilla arvon 6
Laaksonen(?) on listannut tuon ja vastaavia tuonne.
Mitenkäs tuolla saan että se poistaa rivit joilla on alle 5 merkkiä?
Jos lähtökohta on tuo aloitusviestin sana-rivi, niin Split-funktiolla (löytyy edellisen viestini linkin alta Merkkijonoista) saat pilkottua rivisi välilyöntien kohdalta taulukoksi. Käyt sitten taulukkosi solut läpi esimerkiksi For-silmukalla. Jos solun pituus on vähintään 3 merkkiä, niin arvo kopioidaan jonnekkin talteen (toinen taulukko, merkkijono tms.), muuten solun sisällölle ei tehdä mitään.
Luulisi että sen vois helpommalla tehdä.
Miten saan että "rivinteksti" on aluksi rivin 1 teksti sen jälkeen rivin 2 teksti jne.?
Dim rivi As Integer Dim rivinteksti As Integer Private Sub Poista() Do Until rivinteksti = "" rivi = rivi + 1 rivinteksti = 'Koodia tähän, Text1:ssä on sanat riveillä If Len(rivinteksti) => 5 Then List1.AddItem rivinteksti Loop End Sub
Dim KokoRoska As String Dim Splitti As Variant Dim i As Integer KokoRoska = "Sana sanoi Sanalle: sana sana sana sana sana" Splitti = Split(KokoRoska, Space(1)) 'jos rivitetty, niin pilkotaan vbCrLf:n kohdalta For i = LBound(Splitti) To UBound(Splitti) If Len(Splitti(i)) < 5 Then List1.AddItem Splitti(i) End If Next i
Edellinen koodi lisää List1-listaan 6 Sana-sanaa deletoiden kaikki laumasta poikkeavat (sanoi ja Sanalle:). Siitä sitten soveltamaan...
Tästä ei tapahtunu mitään:
Private Sub Command1_Click() Dim Splitti As Variant Dim i As Integer Splitti = Split(Text1.Text, Space(1)) 'jos rivitetty, niin pilkotaan vbCrLf:n kohdalta For i = LBound(Splitti) To UBound(Splitti) If Len(Splitti(i)) < 5 Then Text2.Text = Text2.Text & vbCrLf & Splitti(i) Next i End Sub
Ja tästä tuli virhe "Expected array":
Private Sub Command1_Click() Dim Splitti As Variant Dim i As Integer Splitti = Split(Text1.Text, vbCrLf(1)) 'jos rivitetty, niin pilkotaan vbCrLf:n kohdalta For i = LBound(Splitti) To UBound(Splitti) If Len(Splitti(i)) < 5 Then Text2.Text = Text2.Text & vbCrLf & Splitti(i) Next i End Sub
JussiR kirjoitti:
Ja tästä tuli virhe "Expected array":
Split palauttaa taulukon, siis Dim Splitti() As String
Sit sanoo Lboundista ton virheen.
Rivinvaihdon merkki on vbCrLf, ei siis vbCrLf(1). Tästä johtui, että VB "odotti taulukkoa". Muuttuja Splitti voi olla tyypiltään yhtä hyvin Variant kuin String-taulukko. Muuta ehtoa sen mukaan, pitääkö liian lyhyet sanat karsia (>= 5) vai säilyttää (< 5).
Antti Laaksonen kirjoitti:
Rivinvaihdon merkki on vbCrLf, ei siis vbCrLf(1). Tästä johtui, että VB "odotti taulukkoa". Muuttuja Splitti voi olla tyypiltään yhtä hyvin Variant kuin String-taulukko. Muuta ehtoa sen mukaan, pitääkö liian lyhyet sanat karsia (>= 5) vai säilyttää (< 5).
Joo. Nyt sain sen toimimaan, mutta tulee overflow, koska on niin paljon sanoja. :(
Vaihda i:n muoto integeristä (arvo maksimissaan ~32700) longiksi (arvo maksimissaan ~2,15 miljardia), eli...
Dim i As Long
Aihe on jo aika vanha, joten et voi enää vastata siihen.