Microsoft word macro omzetten naar python

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 332492

Topicstarter
Hallo iedereen,

Sinds vandaag ben ik begonnen met python, ik heb al wat ervaring in macro's schrijven in word. Alleen hoe kan ik zo een macro omzetten naar python?

Hieronder een voorbeeldje om te laten zien waar ik vast loop, het gaat over het vervangen van een stukje tekst in word.
Dit is het vba script in word:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub TEST()
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "[NAAM]"
        .Replacement.Text = "principaal_naam"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Dat heb ik omgezet naar python, alleen twee regels krijg ik niet werkend:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
doc.Content.Find.Replacement.ClearFormatting
doc.Content.Find.Text = "[NAAM]"
doc.Content.Find.Replacement.Text = "principaal_naam"
doc.Content.Find.Forward = True
#TEST Onderstaande regel werkt niet (NameError: name 'wdFindContinue' is not defined)
#doc.Content.Find.Wrap = wdFindContinue
doc.Content.Find.Format = False
doc.Content.Find.MatchCase = True
doc.Content.Find.MatchWholeWord = False
doc.Content.Find.MatchWildcards = False
doc.Content.Find.MatchSoundsLike = False
doc.Content.Find.MatchAllWordForms = False
#TEST Onderstaande regel werkt niet (De tekst Replace hieronder wordt rood en ik krijg een popup box met de tekst: Invalid syntax)
#doc.Content.Find.Execute Replace:=wdReplaceAll


Als het echt niet mogelijk is om dit met behulp van python uit te voeren zou ik het vba script in word kunnen gebruiken en op onderstaande manier uit voeren met python. Dit heeft alleen niet mijn voorkeur aangezien ik dan veel bestanden moet aanpassen en in de toekomst kan dit problemen opleveren.
code:
1
doc.Application.Run("TEST")


Zelf heb ik al verschillende dingetjes geprobeerd en gegoogled maar tot dusver geen succes. Hopelijk kan iemand mij helpen.

Met vriendelijke groeten,
Moustache

[ Voor 0% gewijzigd door Anoniem: 332492 op 23-12-2012 16:23 . Reden: Code tag foutje ]


Acties:
  • 0 Henk 'm!

  • windwarrior
  • Registratie: Januari 2009
  • Laatst online: 12-07-2024

windwarrior

ʍıupʍɐɹɹıoɹ

Hmm, wat ik niet helemaal begrijp is waarom je je VBA macro om zou zetten naar Python, Python is een practige scriptingtaal, maar intergreerd niet op dezelfde manier met office als VBA dat doet.

Verder, wat voor Lib op python gebruik je uberhaubt om docjes te kunnen openen en bewerken?

Acties:
  • 0 Henk 'm!

Anoniem: 332492

Topicstarter
Omdat ik maar een paar kleine dingetjes in verschillende word documenten hoef te vervangen, vandaar dat het vele male eenvoudiger is om dit met python te doen in plaats van een VBA script in meerdere word documenten te plaatsen of uit te voeren.

Excuses dit had ik inderdaad moeten vermelden, ik gebruik IronPython-2.7.3: http://ironpython.codeplex.com/

[ Voor 12% gewijzigd door Anoniem: 332492 op 23-12-2012 17:32 ]


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 07-07 19:35
IronPython is een Python implementatie in .NET. Wat Windwarrior vraagt is welke module je gebruikt om Word te openen en te bewerken.

Ik vermoed dat je zoiets doet:
Python:
1
2
3
4
5
import win32com.client as win32

word = win32.gencache.EnsureDispatch('Word.Application')
doc = word.ActiveDocument # of iets dergelijks
etc ...

?

Wat je nu doet is gewoon het macro kopieren en hopen dat Python het snapt. Python heeft geen notie van 'wdFindContinue' en de syntax in de laatste regel is verkeerd, net als dat Python wdReplaceAll ook niet kent. Dat staat overigens letterlijk in de foutmelding.

Kijk eens hier: http://stackoverflow.com/...xt-inside-a-word-document

wdReplaceAll is een constante in macros en is niet beschikbaar in Python. Gelukkig is de waarde 2 gelijk aan deze constante.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

Anoniem: 332492

Topicstarter
Bedankt voor je hulp!

Ow sorry mijn fout. Ik ben niet zo bekend met het vakjargon, dit is de code die ik gebruik:
code:
1
2
3
4
5
import win32com.client as win32
word = win32.Dispatch("Word.Application")
word.Visible = True
word.Documents.Open("C:\\Basisbestand.doc")
doc = word.ActiveDocument

word.Visible heb ik tijdelijk even op true staan zodat ik kan zien wat er gebeurt.

Ik snap dat de syntax fout was en dat in python de constante wdReplaceAll niet kent. Alleen ik had geen idee welke waarde python wel snapt.


Dit is wat ik nu heb en werkt, bedankt:
code:
1
2
3
Selectie = word.Selection
Zoek = Selectie.Find
Zoek.Execute("[NAAM]", True, False, False, False, False, True, False, False, "Hier komt de naam", 2)


Alleen hoe weet je bijvoorbeeld dat wdReplaceAll in Python gelijk is aan 2? In VBA heb ik nu redelijk mijn weg gevonden met dingen uitproberen en opzoeken maar in Python ben ik redelijk verdwaald.

EDIT:
Deze site heb ik net gevonden waar waardes als wdReplaceAll op staan: MSDN: Word Enumerated Constants

[ Voor 9% gewijzigd door Anoniem: 332492 op 23-12-2012 21:26 ]


Acties:
  • 0 Henk 'm!

  • mrmartijn
  • Registratie: Augustus 2010
  • Laatst online: 04-07 13:21
Is het niet veel simpeler om hiervoor python macro's in openoffice te gebruiken?

http://blog.brixit.nl - Programming, electronics and guitars. http://debestesupermarktpizza.nl - pizza


Acties:
  • 0 Henk 'm!

Anoniem: 332492

Topicstarter
Nee want ik wil het kunnen gebruiken zonder andere programma's te installeren. Word staat namelijk al op de computer waar ik het script wil gebruiken en het python script zet ik als ik klaar ben om naar een exe bestand zodat ik op die computer alleen het exe bestand hoef te plaatsen en verder niks hoef te installeren.
Pagina: 1