[VBA] Word, replace in string

Pagina: 1
Acties:
  • 312 views sinds 30-01-2008
  • Reageer

  • kippy
  • Registratie: September 2004
  • Laatst online: 00:11
Ok, het gene wat ik wil is een txt file opennen en daar een woord met cijfers er achter vervangen door een ander woord met cijfers er achter bijvoorbeeld:
jantje heeft appels830, appels600, appels343

word:
jantje heeft fietsen1, fietsen1, fietsen1

De file uitlezen en een replace op een vaste waarde uitvoeren is geen probleem, maar ik wil dus een replace uitvoeren op appels***. Het is wel zeker dat er altijd 3 cijfers achter appels staan. Maar ik heb geen idee hoe ik dat kan fixen.

ik heb al geprobeerd met:
code:
1
2
3
4
retstring = Replace(retstring, ("appels" & ("0" Or "1" Or "2" Or "3" Or "4" _
Or "5" Or "6" Or "7" Or "8" Or "9") & ("0" Or "1" Or "2" Or "3" Or "4" Or "5" _
Or "6" Or "7" Or "8" Or "9") &("0" Or "1" Or "2" Or "3" Or "4" Or "5" Or "6" _
Or "7" Or "8" Or "9"), "fietsen1")


Maar dat werkt voor geen meter. heb meer dingen geprobeerd meer niets werkt. en om nu 1000 mogenlijkheden af te gaan vind ik een beetje ziek.

hoop dat iemand een idee heeft, al vast bedankt.

  • lier
  • Registratie: Januari 2004
  • Laatst online: 23:13

lier

MikroTik nerd

Ga op zoek naar wildcards:

http://word.mvps.org/FAQs/General/UsingWildcards.htm

? Any single character
* Any string of characters
[ ] One of the specified characters
[-] Any single character in this range
[!] Any single character except the characters inside the brackets
[!x-z] Any single character except characters in the range inside the brackets
{n} Exactly n occurrences of the previous character or expression
{n,} At least n occurrences of the previous character or expression
{n,m} From n to m occurrences of the previous character or expression
@ One or more occurrences of the previous character or expression
< The beginning of a word
> The end of a word
^w 1 or more spaces

[ Voor 132% gewijzigd door lier op 04-04-2005 13:55 ]

Eerst het probleem, dan de oplossing


  • kippy
  • Registratie: September 2004
  • Laatst online: 00:11
dank u dank u, heb nooit geweten dat die dingen zo heten. Ik ga et meteen ff testen.

*En ja als je niet weet hoe het heet kan je het ook niet vinden :P

  • lier
  • Registratie: Januari 2004
  • Laatst online: 23:13

lier

MikroTik nerd

kippy schreef op maandag 04 april 2005 @ 13:58:
dank u dank u, heb nooit geweten dat die dingen zo heten. Ik ga et meteen ff testen.

*En ja als je niet weet hoe het heet kan je het ook niet vinden :P
offtopic:
U mag wel je zeggen ;)

Eerst het probleem, dan de oplossing


  • kippy
  • Registratie: September 2004
  • Laatst online: 00:11
lier schreef op maandag 04 april 2005 @ 14:05:
[...]


offtopic:
U mag wel je zeggen ;)
Maar "U" typt zo snel en als het om replies gaat ben ik nog al lui :P. Maar het weil nog niet helemaal, ik denk dat het komt omdat ik de hele zin in een keer als string inlees en ik geen 100 wildcards of iets dergelijks wil gebruiken.

ik lees dus helemaal in "Jantje heeft appels343"
maar ook zinnen die veel langer zijn, ik probeer het nu te fixen (zoals de link vertelde):

code:
1
retstring = Replace(retstring, "appels[0-9]{3}", "fietsen1")

had ook al "appels###" geprobeerd maar dat wil ook niet echt..... ;(

ben ik nu gewoon heel krom bezig of licht het aan mij?

*ps heb ook al zonder "" geprobeerd, maar het mocht niet helpen

  • lier
  • Registratie: Januari 2004
  • Laatst online: 23:13

lier

MikroTik nerd

Volgens de MSDN site:

strSQL = "SELECT * FROM Products WHERE ProductName Like 'M*' ORDER BY ProductName;"
strFind = "'M*'"
strReplace = "'T*'"

Debug.Print Replace(strSQL, strFind, strReplace)

Dus ik denk dat je in ieder geval de single quotes mist.


bron:
http://msdn.microsoft.com...acingtextwithinstring.asp

Met behulp van de macro recorder (misschien heb je hier iets aan ?):

Sub Macro1()
'
' Macro1 Macro
' Macro opgenomen op 4-4-2005 door LIER
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "appels[0-9]{3}"
.Replacement.Text = "fietsen1"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute
With Selection
If .Find.Forward = True Then
.Collapse Direction:=wdCollapseStart
Else
.Collapse Direction:=wdCollapseEnd
End If
.Find.Execute Replace:=wdReplaceOne
If .Find.Forward = True Then
.Collapse Direction:=wdCollapseEnd
Else
.Collapse Direction:=wdCollapseStart
End If
.Find.Execute
End With
End Sub

Eerst het probleem, dan de oplossing


  • kippy
  • Registratie: September 2004
  • Laatst online: 00:11
meschien was het handig als ik er bij had verteld dat ik een een *.txt open als "scripting.FileSystemObject" Ik heb dus geen selection, want ik gebruik geen "Word find"

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim fs, a, retstring
Set fw = CreateObject("Scripting.FileSystemObject")
Set b = fw.CreateTextFile(ThisDocument.Path & "\testfile.txt", True)
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile(ComboBoxfiles.Text)
Do While a.AtEndOfStream <> True

retstring = a.Readline
    
retstring = Replace(retstring, "appels[0-9]{3}", "fietsen1")

b.WriteLine (retstring)

Loop
b.Close
a.Close

Ik dacht dat ik heb begon te begrijpen maar snap er nu helemaal niets meer van waarom het niet werkt. :'(

*Wordt nu ook lichtelijk geiriteerd van VBA :?

edit:

Ik heb het nu ook op jou mannier geprobeerd, maar still the same sh*t. Ik blijf het erg wazig vinden....

[ Voor 25% gewijzigd door kippy op 04-04-2005 15:30 ]


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 07-05 15:06

sopsop

[v] [;,,;] [v]

m.b.v. regular expressions moet je een heel eind kunnen komen: zoek eens op RegExp.

Verwijderd

Snap niet waarom je dit zou willen, maar goed...

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Sub Kippy()
    
    Dim objFileSystemObject As Scripting.FileSystemObject
    Dim strOutput           As String
    Dim objInputFile        As Scripting.TextStream
    Dim objOutputFile       As Scripting.TextStream
    Dim lngPosition         As Long
    
    On Error GoTo Error_
    
    Set objFileSystemObject = New Scripting.FileSystemObject
    Set objInputFile = objFileSystemObject.OpenTextFile(ComboBoxfiles.Text)
    Set objOutputFile = objFileSystemObject.CreateTextFile(ThisDocument.Path & "\testfile.txt", True)
    Set objFileSystemObject = Nothing
    
    Do Until objInputFile.AtEndOfStream
    
        strOutput = objInputFile.ReadLine
        lngPosition = InStr(1, strOutput, "appels")
        If lngPosition > 0 Then
            strOutput = Left(strOutput, lngPosition - 1) & "fietsen1" & Right(strOutput, Len(strOutput) - (lngPosition - 1 + Len("appels") + 3))
        End If
            
        Call objOutputFile.WriteLine(strOutput)
            
    Loop
        
Exit_:
        
    objInputFile.Close
    Set objInputFile = Nothing
    objOutputFile.Close
    Set objOutputFile = Nothing
    
    Exit Sub
    
Error_:
    MsgBox Err.Description, vbCritical, Err.Number
    Resume Exit_
End Sub


Gebruik indentation
Declareer je variabelen
Geef je variabelen een herkenbare naam
...

  • kippy
  • Registratie: September 2004
  • Laatst online: 00:11
ik had er gister geen tijd om het nog te testen, maar met een beetje tweaken werkt het perfect, dank U/je wel. Ik snap alleen niet waarom die wildcards niet werken. Vind et maar zeer vreemd.

Dus microsoft geeft je een mogenlijkheid om VBA te proggen en wildcards te gebruiken maar ze werken niet. Ok het is microsoft dus soms moet je een beetje tweifelen aan de software maar dan nog..... ze zeggen dat VBA het ondersteund waarom werkt het dan niet.

Als iemand daar een andwoord op weet zou ik het wel leuk vinden om te horen/lezen

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Dat find() jokertekens ondersteunt wil nog niet zeggen dat iedere andere functie hetzelfde kan. Ik lees iig nergens dat jokertekens gebruikt kunnen worden i.c.m. replace(). :?

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • kippy
  • Registratie: September 2004
  • Laatst online: 00:11
Ik heb op google een paar dingen gelezen waar mensen dat ook deden in VBA en waar het wel werkte..... maarja is ook in combinatie Windows/Office verzie. Want onderstening van die tekens schijnd volgens MSDN niet bij elke windows/office verzie combo te werken, maar zover ik kon zien zou ik der geen last van moeten hebben.

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

hmm, ik lees toch echt op MSDN dat de replace functie géén jokertekens ondersteunt.
The Replace function greatly simplifies string search-and-replace operations, but it doesn't make it possible for you to perform wildcard searches.
Je gooit VBA en VB-script een beetje door elkaar. Voor VB-script bestaat het regexp object, dat een replacemethode heeft die doet wat jij wilt. Moet je wel in je VBA-project een verwijzing instellen naar 'microsoft vbscript regular expressions 5.5'.

[ Voor 30% gewijzigd door Lustucru op 05-04-2005 17:28 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1