Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Excel pvm vertailu VBA

stonessi [01.05.2011 20:23:22]

#

Moi!

Ongelma päivämäärien vertailu/lajittelu pitäisi poimia sarakkeesta ei koko saraketta, seuraava vastaantuleva päivämäärä ja kopioda se toiselle "etusivulle" taulukko2 puolelta. Taulukoita on useampia joissa päivämäärät vaihtelee ja taulukoista pitäisi saada seuraava pvm etusivulle...

laitoin makrolla lajittelun ja poimin solun sarakkeesta "K" etusivulle, mutta nyt järjestysnumero muuttuu ja taulukon käytön kannalta monimutkaistuu jos en sitten laita ennen käyttöä palauta lajittelu järjestysnumeron mukaan.

Helpompiakin konsteja on!

neau33 [04.05.2011 21:45:39]

#

Moi stone!

tässä muutamia esimerkkejä...

'VBAProject(Työkirja1) - Taul1
Private Sub CommandButton1_Click()

    'alustetaan long ja string tyyppiset muuttujat
    Dim rivit As Long, alue As String

    'asetetan muuttujan rivit arvoksi taulun Taul2
    'viimeisimmän käytössä olevan solun rivinumero
    rivit = Taul2.Cells.SpecialCells(xlCellTypeLastCell).Row


    'esim. 1
    'taulun Taul2 sarakkeen K viimeisin päivämäärä
    'taulun Taul1 sarakkeeseen A riville 1
    For i = rivit To 1 Step -1
       alue = "K" & CStr(i) & ":K" & CStr(i)
       If Taul2.Range(alue).Text <> "" And _
       TypeName(Taul2.Range(alue).Value) = "Date" Then
          Taul1.Cells(1, 1).Value = Taul2.Range(alue).Value
          Exit For
       End If
    Next i


    'esim. 2
    'taulun Taul2 sarakkeen K ensimmäinen päivämäärä
    'taulun Taul1 sarakkeeseen B riville 2
    For i = 1 To rivit
       alue = "K" & CStr(i) & ":K" & CStr(i)
       If Taul2.Range(alue).Text <> "" And _
       TypeName(Taul2.Range(alue).Value) = "Date" Then
          Taul1.Cells(2, 2).Value = Taul2.Range(alue).Value
          Exit For
       End If
    Next i


    'esim. 3
    Dim laskuri As Integer
    laskuri = 3

    'taulun Taul2 sarakkeen K kaikki päivämäärät alkaen
    'ensimmäisestä päivämäärästä taulun Taul1 sarakkeeseen C
    'muuttujan laskuri osoittamalle riville alkaen muuttujan
    'alkuarvon osoittamalta riviltä (3)
    For i = 1 To rivit
       alue = "K" & CStr(i) & ":K" & CStr(i)
       If Taul2.Range(alue).Text <> "" And _
       TypeName(Taul2.Range(alue).Value) = "Date" Then
          Taul1.Cells(laskuri, 3).Value = Taul2.Range(alue).Value
          laskuri = laskuri + 1
       End If
    Next i


    'esim 4.
    'käydään laskurisilmukassa taulun Taul2
    'sarakeen K solut läpi alkaen riviltä 1
    'muuttujan rivit osoittamalle riville...
    For i = 1 To rivit

       'asetetaan muuttujan alue arvoksi merkkijono
       'joka muodostaa sarakkeen K ja laskurin i
       'osoittaman solun alueen merkkijonomutoisen arvon
       alue = "K" & CStr(i) & ":K" & CStr(i)

       'jos edellä muodostetun alueen solun teksti arvo ei
       'ole tyhjä ja solun arvon muoto on tyyppiä Date niin...
       If Taul2.Range(alue).Text <> "" And _
       TypeName(Taul2.Range(alue).Value) = "Date" Then

          'jos taulun Taul2 muuttujan alue osoittaman solun
          'arvo on suurempi kuin taulun Taul1 sarakeen A rivin 1
          'solun sisältämän päivämäärän arvo niin...
          If Taul2.Range(alue).Value > Taul1.Cells(1, 1).Value Then

             'taulun Taul1 sarakeen A rivin 1 solun arvoksi
             'taulun Taul2 muuttujan alue osoittaman solun arvo
             Taul1.Cells(1, 1).Value = Taul2.Range(alue).Value

             'ja poistutaan laskurisilmukasta.
             Exit For

          End If

       End If
    Next i


   'esim.5
   'alustetaan kolme Date tyyppistä muuttujaa
    Dim pvm1 As Date, pvm2 As Date, pvm3 As Date

    'asetetaan muuttujien pvm1 ja pvm3 arvoksi taulun
    'Taul1 sarakkeen A rivin 1 solun sisältämä päivämäärä
    pvm1 = Taul1.Cells(1, 1).Value
    pvm3 = Taul1.Cells(1, 1).Value
    'aloitetaan päivämäärien etsintä taulun Taul2
    'sarakkeen K muuttujan rivit osoittamalta riviltä
    For i = rivit To 1 Step -1

       'asetetaan muuttujan alue arvoksi merkkijono
       'joka muodostaa sarakkeen K ja laskurin i
       'osoittaman solun alueen merkkijonomutoisen arvon
       alue = "K" & CStr(i) & ":K" & CStr(i)

       'jos edellä muodostetun alueen solun teksti arvo ei
       'ole tyhjä ja solun arvon muoto on tyyppiä Date niin...
       If Taul2.Range(alue).Text <> "" And _
       TypeName(Taul2.Range(alue).Value) = "Date" Then

          'asetetaan muuttujan pvm2 arvoksi ko. solun arvo
          pvm2 = Taul2.Range(alue).Value

          'jos muuttujan pvm1 arvo on suurempi
          'tai yhtäsuuri kuin muuttujan pvm2 arvo niin...
          If pvm1 >= pvm2 Then
             'poistutaan For...Next laskurisilmukasta
             'jolloin muuttujan pvm3 arvoksi jää muuttujan
             'pvm2 se arvo joka oli lähinnä seuraavaksi
             'suurempi muuttujan pvm1 arvoa ***
             Exit For
          Else
             pvm3 = pvm2 '***
          End If
          '(jos taulun Taul2 sarakkeen K minkään solun arvo
          'ei ollut suurempi kuin taulun Taul1 sarakkeen A
          'rivin 1 solun arvo niin päivämäärä ei muutu)

       End If

    Next i

    'asetetaan taulun Taul1 sarakkeen A
    'rivin 1 solun arvoksi muuttujan pvm3 arvo
    Taul1.Cells(1, 1).Value = pvm3

End Sub

Vastaus

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

Tietoa sivustosta