Toon posts:

[WORD 2003] Macro in dir + subdir

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende macro, alleen zoekt en vervangt deze alleen in de directory die ik aangeef, hoe geef ik aan dat ie ook alle subdirectorys bij langs moet?


Sub vervangen()
'
' vervangen Macro
' Macro gemaakt op 12-04-2007 door 240
'
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder("c:\dir")


Const Tekst = "gezochte tekst"
Const VervangTekst = "vervangen tekst"
For Each file In f.Files
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = Tekst
.Replacement.Text = VervangTekst
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next
End Sub

  • onkl
  • Registratie: Oktober 2002
  • Nu online
Als je niet het Scripting.Filesystemobject maar het Office.FileSearch object gebruikt, kan je de optie "subdirs" meenemen. (En je hebt minder references, altijd mooi meegenomen. Je zal wel iets moeten ombouwen, de Foundfiles collectie die je zo terugkrijgt bevat geen files, maar bestandsnaamstrings.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je kan ook gewoon recursief alle mapjes aflopen:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Option Explicit

Sub ProcessFolder(fol As Folder)
    'roep functie recursief aan voor alle subdirs
    Dim subfol As Folder
    For Each subfol In fol.SubFolders
        ProcessFolder subfol
    Next

    'doe iets per file
    Dim fil As File
    For Each fil In fol.Files
        MsgBox fil.Path
    Next
End Sub

Sub Start()
    Dim fso As New FileSystemObject
    ProcessFolder fso.GetFolder("c:\")
End Sub


Je moet voor dit voorbeeld wel "Microsoft Scripting Runtime"(scrrun.dll) toevoegen aan references. Het grote voordeel hiervan is dat alle methods/properties getoond worden als je een puntje zet na een variabele.

offtopic:
Als iemand zo dom is om mijn voorbeeld te proberen met "c:\", dan is het handig om te weten dat een Macro gestopt kan worden door een Ctrl+Break.

Verwijderd

Topicstarter
Dus op zich werkt het zoals je hier boven hebt neergezet, alleen moet er iets aan references toegevoegd worden? Veel verstand heb ik er niet van merk je al, maar hoe doe ik dit?
Oke dat was makkelijker dan het leek, is het ook mogelijk om alleen alles op .doc langs te gaan?

[ Voor 21% gewijzigd door Verwijderd op 13-04-2007 10:16 ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Dit had je natuurlijk ook zelf kunnen bedenken:
Visual Basic:
13
        If Right(fil.Name, 4) = ".doc" Then MsgBox fil.Path

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Had je ook nog naar de tip van onkl gekeken?

Dat object zit al in Application. Het wordt dus:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Option Explicit 

Sub Start()
    Dim fn As Variant

    With Application.FileSearch
        .NewSearch
        .LookIn = "C:\"
        .SearchSubFolders = True
        .FileName = "*.doc" '.FileType=msoFileTypeWordDocuments geeft ook .html
        .Execute

        For Each fn In .FoundFiles
            MsgBox fn
        Next
    End With
End Sub
Pagina: 1