VBA Scripting

Excel 2003:ssa on tehty makro joka tarkistaa onko jossakin tietyssä kansiossa tietyllä merkkijonolla (tunnisteella)olevia tiedostoja. Excel 2007 tökkää tuohon "Set fs = Application.FileSearch" kohtaan.

Virheilmoituksena tulee Run-time Error "445", Object doesn´t support this action.

Visual Basic editorissa on Tools -> References laitettu ruksi "Microsoft Scripting Runtime" -kohtaan ja Excel taulukon puolella Makrojen suojaus kohdassa on täppä kohdassa "salli VBA-projektin objektimallin käyttäminen"

Mikähän voisi olla pielessä? Alla koodia: (Muuttujat "Kansio" ja "Tunniste" on määritelty aikaisemmin).


Dim fs As Variant
Set fs = Application.FileSearch
With fs
.LookIn = Kansio
.FileName = Tunniste
If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then
jotakin
Else
jotakin muuta
End If
End With

-Pasi-
6720
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat
  • Näyttää toimivan, mutta valitettavasti en voi käyttää tuota työkirjaa koska toiminnon tulisi olla osa omaa työkirjaani...

    Miksi ihmeessä tuo .FileSearch on menty poistamaan, ja muutenkin, miksi ihmeessä yleensä Excel 2007 on menty tekemään...

    -Pasi-

    Äänestä

  • -Pasi- kirjoitti:

    Näyttää toimivan, mutta valitettavasti en voi käyttää tuota työkirjaa koska toiminnon tulisi olla osa omaa työkirjaani...

    Miksi ihmeessä tuo .FileSearch on menty poistamaan, ja muutenkin, miksi ihmeessä yleensä Excel 2007 on menty tekemään...

    -Pasi-

    ja syystä tai toisesta poistaa funktioita uusista versioista aika ajoin. Uusin funktio on DIR(). Vastaavaa on tapahtunut aikaisemminkin. Löysin Excel.Programming sivustosta myös 2007 sopivan VBA-koodin.

    Äänestä

  • rpo kirjoitti:

    ja syystä tai toisesta poistaa funktioita uusista versioista aika ajoin. Uusin funktio on DIR(). Vastaavaa on tapahtunut aikaisemminkin. Löysin Excel.Programming sivustosta myös 2007 sopivan VBA-koodin.

    Tässä lyhykäisyydessään Dir()-listaus, joka toimii myös vanhemmissa versioissa. Muuta koodin tiedot tarvittavaksi.

    Sub DirListaus()
    Application.ScreenUpdating = False
    Sheets("Sheet1").Columns("A").ClearContents
    Omahakemisto = "C:\Temp"
    Tiedostonimi = Dir(Omahakemisto & "\")
    Tiedostot = 0
    Rivi = 1
    Do While Tiedostonimi ""
    Kokonimi = Omahakemisto & "\" & Tiedostonimi
    Tiedostot = Tiedostot 1
    Range("A" & Rivi) = Kokonimi
    Rivi = Rivi 1
    Tiedostonimi = Dir()
    Loop
    End Sub

    Äänestä

  • rpo kirjoitti:

    Tässä lyhykäisyydessään Dir()-listaus, joka toimii myös vanhemmissa versioissa. Muuta koodin tiedot tarvittavaksi.

    Sub DirListaus()
    Application.ScreenUpdating = False
    Sheets("Sheet1").Columns("A").ClearContents
    Omahakemisto = "C:\Temp"
    Tiedostonimi = Dir(Omahakemisto & "\")
    Tiedostot = 0
    Rivi = 1
    Do While Tiedostonimi ""
    Kokonimi = Omahakemisto & "\" & Tiedostonimi
    Tiedostot = Tiedostot 1
    Range("A" & Rivi) = Kokonimi
    Rivi = Rivi 1
    Tiedostonimi = Dir()
    Loop
    End Sub

    Niin, kyllähän ne ohjelmat muuttuu, kutsutakoon sitä nyt sitten vaikkapa kehitykseksi. Vaikka aina välillä tuntuu että tuo "kehitys" aiheuttaa tavalliselle käyttäjälle enemmän ongelmia kuin mitään muuta. Väkisinkin tuli taas mieleen Linuxiin ja OpenOfficeen siirtyminen Microsoftin pikkuruisten muutosten myötä, mutta sekin olisi aikamoisen työläs tie kun VBA on tullut edes jollain tavalla tutuksi.

    Suuri kiitos tuosta DIR-listauksesta, uskoisin että tuolla saan korvattua .FileSearch funktiolla tekemäni toiminnon. Saa nähdä kuinka pitkälle ohjelma sen jälkeen toimii...

    Suuri kiitos siis sinulle ja Rauhallista Joulun aikaa!

    Äänestä

  • rpo kirjoitti:

    Tässä lyhykäisyydessään Dir()-listaus, joka toimii myös vanhemmissa versioissa. Muuta koodin tiedot tarvittavaksi.

    Sub DirListaus()
    Application.ScreenUpdating = False
    Sheets("Sheet1").Columns("A").ClearContents
    Omahakemisto = "C:\Temp"
    Tiedostonimi = Dir(Omahakemisto & "\")
    Tiedostot = 0
    Rivi = 1
    Do While Tiedostonimi ""
    Kokonimi = Omahakemisto & "\" & Tiedostonimi
    Tiedostot = Tiedostot 1
    Range("A" & Rivi) = Kokonimi
    Rivi = Rivi 1
    Tiedostonimi = Dir()
    Loop
    End Sub

    Muokkasin koodin seuraavanlaiseksi, sain siitä melko siistin, ja mikä tärkeintä, toimivan. Kiitos.

    Tiedosto = Dir(Kansio & "\")
    Do While Tiedosto ""
    If Left(Tiedosto, 8) = Tunniste Then
    jotakin
    KansioOk = True
    End If
    Tiedosto = Dir()
    Loop

    If KansioOk = False Then
    jotakin muuta
    End If

    -Pasi-

    Äänestä

Kommentoi aloitusta


-Pasi- kirjoitti:

Excel 2003:ssa on tehty makro joka tarkistaa onko jossakin tietyssä kansiossa tietyllä merkkijonolla (tunnisteella)olevia tiedostoja. Excel 2007 tökkää tuohon "Set fs = Application.FileSearch" kohtaan.

Virheilmoituksena tulee Run-time Error "445", Object doesn´t support this action.

Visual Basic editorissa on Tools -> References laitettu ruksi "Microsoft Scripting Runtime" -kohtaan ja Excel taulukon puolella Makrojen suojaus kohdassa on täppä kohdassa "salli VBA-projektin objektimallin käyttäminen"

Mikähän voisi olla pielessä? Alla koodia: (Muuttujat "Kansio" ja "Tunniste" on määritelty aikaisemmin).


Dim fs As Variant
Set fs = Application.FileSearch
With fs
.LookIn = Kansio
.FileName = Tunniste
If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then
jotakin
Else
jotakin muuta
End If
End With

-Pasi-

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu