Olen nauhoittanut seuraavan etsintämakron:
Sub SiirryValilehdilla() ' ' SiirryValilehdilla Makro ' With Application.FindFormat.Font .Name = "Arial" .Size = 14 .Subscript = False End With Sheets("213").Select Cells.Find(What:="213", After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True _ , SearchFormat:=True).Activate End Sub
Etsi ja korvaa asetukset ovat:
Kohteesta: Työkirja x Sama kirjainkoko Etsi: Riveittäin x Koko solun sisältö Käy läpi: Arvot
Tähän pitäisi saada sellainen kohta, jossa annetaan numerosarjan ö213ö tilalle toinen numerosarja.
Etsi toiminnon, on käytävä parhaassa tapauksessa läpi yli 100 välilehteä ennen kuin oikea numerosarja löytyy B1:stä.
Välilehdet ovat numeroitu samoilla numeroilla, mutta en tiedä miten niitä voisi hakea.
Etsi ja korvaa on ollut helpompi tapa hakea ja se on vielä löytänyt noilla asetuksilla aina oikean numeroisen solun.
Itse en paljoa ymmärrä näistä makroista. Nauhotella osaan. Nyt olen koittanut tyrkyttää INPUTBOX –kysymystä, mutta jos sen muuttujan laittaa suoraan ö213ö tilalle makro pysähtyy siitä tulevaan virheeseen.
t:henkka
Voisitko vielä kertoa tarkasti, mitä tietoa välilehdillä on ja mitä ohjelman pitäisi etsiä?
Moikka xr2o4NAusiC2!
jännä tunnus...
Tässä sulle yksinkertainen esimerkki:
ekaks laita VBA-projektin formille tekstiboxi & komentopainike ja sit...
ThisWorkbook:
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 'aiheuttaa mitä tahansa työkirjan taulua tuplaklikatessa 'formin ilmestymisen näytölle mikäli ei ole jo näkyvissä. If UserForm1.Visible = False Then UserForm1.Show End Sub
UserForm1:
Private Sub CommandButton1_Click() 'asetetaan ehdoksi: Jos tekstiloota ei ole tyhjä niin... If Not TextBox1.Text = Empty Then 'määritellään lohkomuuttuja Dim taulu As Worksheet 'käydään läpi kaikki työkirjan taulut 'eli silmukka pyörii niin monta kertaa, 'kuin työkirjassa on tauluja, mikäli ei 'lauseella aiheuteta poistumista ** For Each taulu In ActiveWorkbook.Worksheets Application.FindFormat.Font.Name = "Arial" Application.FindFormat.Font.Size = 14 Application.FindFormat.Font.Subscript = False With taulu .Activate .Cells(1, 1).Activate 'määritellään objekti Dim fc 'estetään Excelin tökkiminen 'mahdollisen virheen sattuessa On Error Resume Next 'huomaa toi What:=TextBox1.Text 'eli etsitään tekstilootan arvoa Set fc = Cells.Find(What:=TextBox1.Text, _ After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=True, _ SearchFormat:=True).Activate '** If lauseen ehto aiheuttaa tässä poistumisen silmukasta 'ensimmäisen hakuarvoa vastaavan arvon löytyessä jonkin taulun 'jostain solusta. 'Voit eliminoida ehdon lisäämällä If...End IF väliin jäävien 'rivien ensimmäiseksi merkiksi heittomerkin ('), jolloin haku 'jatkuu aina loppuun asti... If ActiveCell.Text = TextBox1.Text Then '** hypätään nimiöön jmp: GoTo jmp End If 'tuhotaan objekti Set fc = Nothing End With Next '** jmp: 'Tyhjennetään tekstiboxi, 'tuhotaan objekti & 'ladataan formi pois muistista TextBox1.Text = "": Set fc = Nothing: Unload Me Else 'tahi muutoin kerrotaan, että: MsgBox "Hakuarvo puuttuu!", vbExclamation, Application.Name End If End Sub
Antti Laaksonen kirjoitti:
Voisitko vielä kertoa tarkasti, mitä tietoa välilehdillä on ja mitä ohjelman pitäisi etsiä?
Välilehdillä tieto on numeerista ja tekstiä. Kumpaakin tietoa pitäisi etsiä.
Heippa taas!
Esimerkin haussa datatyypillä ei ole mitään merkitystä. Nyt täytyy vain muistaa sellainen seikka, että esimerkissä hakuehtona ei ole pelkästään solun sisällön arvo, vaan myös fontin tyyppi ja koko. Elikä jos laitetaan esim. MatchCase:=False, SearchFormat:=False niin silloin haku löytää joka ikisen työkirjan solun joka vastaa tekstiboksiin syötettyä arvoa tekstinä. Jos nyt lisäätään formille vaikkapa pari checkboxia ja muutetaan hieman koodia esim. MatchCase:=checkbox1.value jne. niin voidaan joko eliminoida tai sisällyttää erilaisia hakuehtoaja tarpeen mukaan. Fonttin tyyppi ja arvot on myös hyvin yksinkertaista määritellä käyttäen valmiita koponentteja koodin juurikaan muuttumata esim. Application.FindFormat.Font.Name = Texbox2.Font.Name jne. Kietomalla koodissa nyt oleva silmukka silmukalla, joka tutkii ja aktivoi vuorollaan jokaisen instanssin avoimen työkirjan voidaan samaan hakuun sisällyttää jokaisen avoimen työkirjan jokaisen taulun jokainen solu. Jos avoimet työkirjat eivät riitä voidaan etsiä ja avata lisää (ja sulkea jo läpikäytyjä) ensin vaikkapa omalta kiintolevyltä sitten vaikkapa intrasta ja jos ei riitä niin Internetistä löytyy lisää...(huh. nyt koodi taisi triplaantua)
Heippa,
Tunnus tulee generoidessa. Helpompi näin, koska omat tunnukset ovat jo jonkun käytössä. Generoidessa ei tule sitä ongelmaa.
Kiitos koodista. Yritän sulatella sitä tässä hiljalleen. Asia ei aukea ihan helpolla minulle. Tosin olen hieman perehtynyt asiaan, mutta ei se helppoa ole.
Heippa,
Kiitos Nea koodista. Sain sen toimimaan.
t:henkka
Aihe on jo aika vanha, joten et voi enää vastata siihen.