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 SubEtsi 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 SubAntti 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.