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!
(*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.
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?
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
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?
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.