Terve!
Voi olla, että kysymykseeni on jossain jo vastattu, mutta en ainakaan nopealla haulla löytänyt vastausta. Osoittakaa minut siis oikeaan suuntaan mikäli jossain on jo vastaus.
Ongelmani on seuraavanlainen. Koodaan pientä yksinkertaista makroa Exceliin, jonka tarkoitus on kerätä useista muista exceleistä dataa. Kohde-excelien nimet ja määrät muuttuvat kuukausittain. Tahtoisin toteuttaa tiedostojen valinnan niin, että ns. Master Excelissä (jossa siis kaikki VB-koodi sijaitsee) olisi nappi (tai aina avattaessa tms.), jota painamalla avautuisi ikkuna kysymään lisättäviä tiedostoja. Se kysyisi niitä niin kauan kunnes antaa tyhjän tiedoston nimen.
Yritin purkkaviritelmää, jossa käyttäjä syöttää ensimmäiselle sivulle kaikki tiedoston nimet, jonka jälkeen voisi jollain concatenate -komennolla antaa viittauksia näiden solujen avulla. Tätä en kuitenkaan onnistunut tekemään. Toistaiseksi minulla on siis tällaisia viittauksia:
='C:\Documents and Settings\User1\My Documents\Raportointi\RaportointiDraft\
Haluaisin siis, että a) tiedoston nimiä voi vaihdella (päivämäärä ja projektin nimi) ja b) tiedostojen määrä vaihtelee.
Kun saan viittauksen kuntoon on loppu koodi jo valmiina kaiken datan käsittelyyn.
Vastauksia odotellen,
MoonD
Tässä yksi vaihtoehto, miten tuon voi hoitaa...
Sub Button1_Click() Dim obj As Excel.Workbook Dim path As String Dim arvo As String Dim rivi As Long Do Until MsgBox("Haetaanko arvo?", vbYesNo + vbDefaultButton1) = vbNo ' Estetään näytön päivitys excelin osalta, ettei ruudussa näy tekomme turhaan ' Kommentoi rivi pois hipsulla, niin näet vaikutuksen koodia ajettaessa ' Huom! Nopeuttaa ohjelman ajoa huomattavasti Application.ScreenUpdating = False ' Haluamamme tiedosto, josta tiedot haetaan path = "C:\Documents and Settings\bad\My Documents\Test.xls" ' Avataan tiedosto muuttujaan obj, jolloin siihen voidaan viitata samoin ' kuin aktiiviseen workbookiinkin Set obj = Application.Workbooks.Open(path) ' Otetaan talteen A1-solun arvo arvo = obj.Sheets(1).Range("A1").Value ' Suljetaan avaamamme tiedosto. False tarkoittaa, ettei tallenneta muutoksia obj.Close False ' Offsetilla viitataan haluttuun soluun ilman halutun solun aktivointia Application.ActiveCell.Offset(rivi, 0).Value = arvo rivi = rivi + 1 ' Palautetaan näytön päivitys, että käyttäjä näkee lopputuloksen ' Jos ScreenUpdating:a ei palauteta koko Excel on jumissa Application.ScreenUpdating = True Loop ' Vapautetaan obj-muuttujan varaama muisti Set obj = Nothing End Sub
InputBoxia parempi vaihtoehto on käyttää CommonDialogia. Laaksosen Antti teki siitä koodivinkin, jonka voi siirtää lähes sellaisenaan VBA:n puolelle ja sopii projektiisi kuin nenä päähän. InputBoxilla joutuisit kirjoittamaan aina koko polun haluamaasi tiedostoon.
Kiitos älyttömän paljon tästä vinkistä. Sain projektini jo melko edustavaan kuntoon... Pitää vielä viilata, että saa tuon Antin koodivinkin toimimaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.