Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: [VB] Exceliin päivämääriä

Aotes [21.11.2005 20:38:17]

#

Heipä hei! Melko noviisi näissä hommissa ja tämäkin taitaa mennä enemmän excel- kuin VB-puolelle... Pitäis tehdä vähän semmonen MS Project:in tapainen excel-viritys.

Eli pystyisi syöttämään projektin aloituspäivän ja loppumispäivän/keston formilla exceliin, jolla sitten voisi seurata käynnissä olevia projekteja ja ajoittaa kuormituksia. Yksi päivämäärä olisi yhtä kuin yksi solu ja projektin pituus ilmenisi solujen värjääntymisellä/jollain muulla.

Sheetin yläreunassa, vaakatasossa, olisi liukuva päiväys(*2) ja alemmilla vaakariveillä sitten näkyisivät nuo projektit, jotka olisivat sidottuina(*1) oikeisiin pystyriveihin (päivämääriin) aloitus- ja lopetuspäivämäärän mukaan.

Varsinaiset kysymykset:
(*1):Kun teen formin, joka syöttää aloitus-ja lopetuspvm:än exceliin, esim. aloituspäivämäärän soluun 2, 2, niin miten saisi tuon lopetuspäivämäärän niin monen solun päähän, kuin aloitus- ja lopetuspvm:än välillä on päiviä?

(*1):Entä miten tuon aloituspäivämäärän sijainnin saisi sidottua samanarvoiseen, samalla pystyrivillä olevaan soluun, mutta kuitenkin siis esim. yhtä alempaan soluun?

(*2): Entäpä miten saisi VB:llä tehtyä exceliin napin, joka syöttää soluihin tästä päivästä lähtien johonkin tiettyyn päivään asti päivämääriä? Yksi päivämäärä per solu.

Kaikki neuvot tervetulleita ja kiitos jo etukäteen!

BadSource [22.11.2005 08:02:06]

#

(*1) Molempiin kohtiin auttaa Offset. Offset:llä määritetään siirtymä jostain tietystä solusta. Siirtymä määritetään Offset([Rivit],[Sarakkeet]).

'Kopioidaan soluun G2 arvo solusta B2 (siirtymä 5 saraketta)
Cells(2, 2).Offset(0, 5).Value = Cells(2, 2).Value
'Kirjoitetaan valintaa alemmalle riville ja lihavoidaan se
Selection.Offset(1, 0).Value = "Alempi rivi"
Selection.Offset(1, 0).Font.Bold = True

Päivämäärien erotuksen saat selville ihan vain miinustamalla.

Dim alku As Date
Dim loppu As Date

alku = "1.1.2005"
loppu = "3.11.2005"
MsgBox loppu - alku

(*2) Lisää Excelin View-valikosta Visual Basic -valikko näkyviin. Avautuneessa valikossa on painike, jossa on jakoavain ja vasara ristissä (Control Toolbox). Sitä klikkaamalla saat esiin Toolbox-ikkunan, jossa on yleisimmät VB:n kontrollit, mukana myös Command Button. Kun Toolbox-ikkunasta on valittuna se viivoittimia ja kynän sisältävä nappula (Design Mode), niin saat määriteltyä missä nappisi on ja mitä se tekee. Vapauta Design Mode ja nappi toimii kuin mikä tahansa nappi.

Aotes [22.11.2005 10:29:53]

#

Jep, kiitos neuvoista!

1. Tuosta sen varmaan jotenkin saisi mitä haen. Eli määrittäisi jollain if-lauseella? tuon aloitus solun. Jos jostain solusta löytyy vastaavuus, niin siitä offsetillä yhtä riviä alemmas.

2. Laitoin aloituspäivämäärän ja loppupvm:än textboxeilla, mutta se ei aivan ollut sitä mitä hain.

Tarkoitin siis sellaista koodin pätkää, että kun syötät formiin esim. 23.11.2005, niin se tulee soluun A2. B2 soluun tulee automaattisesti sitten 24.11.2005, C2 = 25.11.2005, D2 = 26.11.2005 jne. Oliskohan tuollainen mahdollista?

BadSource [22.11.2005 10:53:18]

#

Tiedon soveltaminen sallittua, mutta laitetaan nyt valmista koodia. DateAdd-funktiolla voidaan kasvattaa aikaan sekunneista vuosiin, d=day...

Public Sub Test()
    Dim Alku As Date
    Dim i As Integer

    Alku = CDate(InputBox("Anna päivä:", "Alku", FormatDateTime(Now, vbShortDate)))
    For i = 0 To 29
        Range("A2").Offset(0, i).Value = DateAdd("d", i, Alku)
    Next i
End Sub

Aotes [22.11.2005 16:14:56]

#

Aivan loistavaa! Kiitos!

Nyt tein napin taakse tämän:

Private Sub CommandButton2_Click()

    Dim Alku As Date
    Dim i As Integer

    Alku = CDate(InputBox("Anna päivämäärä:", "Alku", FormatDateTime(Now, vbShortDate)))
    For i = 0 To 29
        Range("B2").Offset(0, i).Value = DateAdd("d", i, Alku)
    Next i

End Sub

En tuosta oikein mitään tajua, niin osaisiko joku neuvoa vielä, miksi koodi pukkaa run-time error 13:sta type mismatch, jos painaa inbutbox:issa cancelia? Tuohon viittaa

Alku = CDate(InputBox("Anna päivämäärä:", "Alku", FormatDateTime(Now, vbShortDate)))

Entä voiko tuon i:n To-arvoksi antaa jossain solussa tai textboxissa olevan arvon?

BadSource [22.11.2005 17:06:53]

#

Mismatch tulee, koska tuo Inputbox palauttaa tyhjän Cancelin painamisen jälkeen, joka sitten yritetään muotoilla päivämääräksi -> seurauksena virhe. Muuta tuota Inputbox-riviä niin, että luet tuloksen ensin johonkin String-muuttujaan. Sen jälkeen tarkastetaan onko muuttujassa sellainen arvo, että sen voi muuttaa päivämääräksi (ei ole tyhjä ja tosiaan on päivämäärä).

Dim abu As String
Dim Alku As Date

If IsDate(abu) Then 'Voiko abu-muuttujaa muuttaa päivämääräksi?
    Alku = CDate(abu)
    'Tänne loput koodista. Mitään ei tapahdu, jos Inputboxin palauttamaa arvoa ei voi muuttaa päiväksi.
End If

Aotes kirjoitti:

Entä voiko tuon i:n To-arvoksi antaa jossain solussa tai textboxissa olevan arvon?

Voit. Ei muuta väliä, kunhan se on numero.

Vastaus

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

Tietoa sivustosta