Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Excel tiedostosta lukeminen/dynaamisten viittausten tekeminen

MoonD [30.05.2006 13:56:12]

#

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\[20060522_ProjectD_Report.xls]OverView'!$H$1

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

BadSource [30.05.2006 14:56:08]

#

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.

MoonD [01.06.2006 17:02:49]

#

Kiitos älyttömän paljon tästä vinkistä. Sain projektini jo melko edustavaan kuntoon... Pitää vielä viilata, että saa tuon Antin koodivinkin toimimaan.

Vastaus

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

Tietoa sivustosta