Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Excel -makro ongelma

xr2o4NAusiC2 [04.11.2007 21:22:18]

#

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

Antti Laaksonen [04.11.2007 21:33:36]

#

Voisitko vielä kertoa tarkasti, mitä tietoa välilehdillä on ja mitä ohjelman pitäisi etsiä?

neau33 [05.11.2007 02:24:28]

#

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

xr2o4NAusiC2 [05.11.2007 06:15:12]

#

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ä.

neau33 [05.11.2007 07:03:44]

#

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)

xr2o4NAusiC2 [05.11.2007 08:20:28]

#

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.

xr2o4NAusiC2 [05.11.2007 09:30:03]

#

Heippa,

Kiitos Nea koodista. Sain sen toimimaan.

t:henkka

Vastaus

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

Tietoa sivustosta