Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

VBA code voor aantal letters aanpassen

Pagina: 1
Acties:

Vraag


  • Hanneke05
  • Registratie: Januari 2016
  • Laatst online: 16-01-2023
Mijn vraag :
Enkele jaren geleden heb ik van iemand een VBA code gekregen om automatisch het aantal letters in haakjes vóór een betreffend woord te plaatsen.
Werkt goed : ik klik op een woord, en met een bepaalde toetscombinatie komt dus het aantal letters mooi tussen haakjes voor dat woord.
Nu is het zo dat de "ij" als 2 letters geteld wordt, terwijl ik dit als 1 letter wil laten tellen.
Weet iemand hoe ik die code aan kan passen ? Of evt. een stukje code kan toevoegen ( en zo ja, waar dan precies ? ; zelf heb ik hier helemaal geen verstand van ) om dit voor elkaar te krijgen ?
Volgens mij kan ik hier geen bijlage meesturen, daarom hieronder de betreffende code :
Sub ZetLengte()
Dim wd As Range
Dim iStart As Long
Dim strLen As String
Dim rng As Range
Application.ScreenUpdating = False
With Selection
For Each wd In .Words
If Left(wd.Text, 1) Like "[a-zA-Z]" Then
strLen = Len(wd) + 1 * (Right(wd, 1) = " ")
iStart = wd.Start - Len(strLen) - 3
If iStart >= 0 Then
FontProp wd.Start - 1, wd.Start
If ActiveDocument.Range(iStart, iStart + Len(strLen) + 3).Text <> "(" & strLen & ") " Then
wd.InsertBefore "(" & strLen & ") "
End If
Else
wd.InsertBefore "(" & strLen & ") "
FontProp 0, Len(strLen) + 3
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Sub FontProp(iFrom As Long, iTo As Long)
With ActiveDocument.Range(iFrom, iTo).Font
If .Bold Then .Bold = False
If .Italic Then .Italic = False
If .Underline Then .Underline = wdUnderlineNone
If .DoubleStrikeThrough Then .DoubleStrikeThrough = False
If .StrikeThrough Then .StrikeThrough = False
If .ColorIndex <> wdBlue Then .ColorIndex = wdBlue
End With
End Sub

Alvast bedankt voor de eventuele hulp !

Relevante software en hardware die ik gebruik
Windows 10, word 2013

Alle reacties


  • Switchie
  • Registratie: April 2009
  • Niet online

Switchie

Mr. Evil Genius

Zou je de code sowieso even tussen de daarvoor bedoelde tags willen plaatsen? Leest voor ons ook een stuk makkelijker

'Future proof' (de; v) Verschijnsel waarbij men een dure aankoop rechtvaardigt door innovatie te negeren


  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Er zijn een paar manieren die je kunt doen, een beetje afhankelijk van wat je precies wil met dit script.
1. Vervang alle ij's door een enkel karakter (een y bijvoorbeeld) voor het tellen.
2. Nadat je de karakters hebt geteld, kijk of het ergens matcht met 'ij' en voor iedere keer dat je die tegenkomt haal je 1 van het aantal letters af.

Overigens zal dit script waarschijnlijk op veel dingen nog wel eens stuk gaan, denk aan speciale karakters als ë, ó of ß wat prima letters zijn, maar door jouw script niet worden gematcht. In dat geval zou je alle woorden eerst moeten translitereren, waarbij het tellen weer een hele andere uitdaging wordt. Maar dat ligt er natuurlijk maar net aan wat je hiermee wil doen, en in hoeverre het moet kloppen. Het tellen van ij als 1 karakter is immers maar 1 op de vele uitzonderingen.

  • Hanneke05
  • Registratie: Januari 2016
  • Laatst online: 16-01-2023
Beiden bedankt voor jullie reactie.
Switchie schreef op zaterdag 26 augustus 2017 @ 15:15:
Zou je de code sowieso even tussen de daarvoor bedoelde tags willen plaatsen? Leest voor ons ook een stuk makkelijker
Oeps :? en nou klink ik vast heel dom maar wat bedoel je met "de daarvoor bedoelde tags" ?
TERW_DAN schreef op zaterdag 26 augustus 2017 @ 15:22:
Er zijn een paar manieren die je kunt doen, een beetje afhankelijk van wat je precies wil met dit script.
1. Vervang alle ij's door een enkel karakter (een y bijvoorbeeld) voor het tellen.
2. Nadat je de karakters hebt geteld, kijk of het ergens matcht met 'ij' en voor iedere keer dat je die tegenkomt haal je 1 van het aantal letters af.

Overigens zal dit script waarschijnlijk op veel dingen nog wel eens stuk gaan, denk aan speciale karakters als ë, ó of ß wat prima letters zijn, maar door jouw script niet worden gematcht. In dat geval zou je alle woorden eerst moeten translitereren, waarbij het tellen weer een hele andere uitdaging wordt. Maar dat ligt er natuurlijk maar net aan wat je hiermee wil doen, en in hoeverre het moet kloppen. Het tellen van ij als 1 karakter is immers maar 1 op de vele uitzonderingen.
-Wat ik precies wil met dit script is heel "simpel" : dat het aantal letters van een woord automatisch tussen haakjes vóór het woord komen staan en waarbij de ij als 1 letter geteld wordt.
-De ó of ß komen in mijn betreffende bestand volgens mij niet voor, maar bijv. de ë en ï wel, en hier heeft het script geen enkele moeite mee.
-Voor wat betreft het vervangen van de ij's door de y en 1 van het aantal letters afhalen: op het moment is het zo dat ik zelf al 1 van het aantal letters aftrek bij de woorden waar de ij in zit, zónder vooraf al die moeite van vervangen te doen...Dat is te doen, maar omdat het makkelijker zou zijn de code hierop aan te passen vroeg ik me zomaar af of dit mogelijk is. Helaas is mijn kennis hiervan schrikbarend slecht ;)
Het zou mooi zijn als iemand hier een code voor weet die ingebouwd kan worden in het script.

  • Switchie
  • Registratie: April 2009
  • Niet online

Switchie

Mr. Evil Genius

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
Sub ZetLengte()
     Dim wd As Range
     Dim iStart As Long
     Dim strLen As String
     Dim rng As Range
     Application.ScreenUpdating = False
     With Selection
         For Each wd In .Words
             If Left(wd.Text, 1) Like "[a-zA-Z]" Then
                 strLen = Len(wd) + 1 * (Right(wd, 1) = " ")
                 iStart = wd.Start - Len(strLen) - 3
                 If iStart >= 0 Then
                     FontProp wd.Start - 1, wd.Start
                     If ActiveDocument.Range(iStart, iStart + Len(strLen) + 3).Text <> "(" & strLen & ") " Then
                         wd.InsertBefore "(" & strLen & ") "
                     End If
                 Else
                     wd.InsertBefore "(" & strLen & ") "
                     FontProp 0, Len(strLen) + 3
                 End If
             End If
         Next
     End With
     Application.ScreenUpdating = True
     End Sub
 Sub FontProp(iFrom As Long, iTo As Long)
     With ActiveDocument.Range(iFrom, iTo).Font
         If .Bold Then .Bold = False
         If .Italic Then .Italic = False
         If .Underline Then .Underline = wdUnderlineNone
         If .DoubleStrikeThrough Then .DoubleStrikeThrough = False
         If .StrikeThrough Then .StrikeThrough = False
         If .ColorIndex <> wdBlue Then .ColorIndex = wdBlue
     End With
 End Sub
 
Nu is het zo dat de "ij" als 2 letters geteld wordt, terwijl ik dit als 1 letter wil laten tellen.
Vind ik overigens een ietwat rare wens . Waarom zou je dit willen? Het zijn toch gewoon 2 letters?
Enige wat ik dan zou kunnen bedenken is een search+replace van "ij" voor "y"

[ Voor 9% gewijzigd door Switchie op 26-08-2017 19:45 ]

'Future proof' (de; v) Verschijnsel waarbij men een dure aankoop rechtvaardigt door innovatie te negeren


  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

[quote]Hanneke05 schreef op zaterdag 26 augustus 2017 @ 19:34:

-Wat ik precies wil met dit script is heel "simpel" : dat het aantal letters van een woord automatisch tussen haakjes vóór het woord komen staan en waarbij de ij als 1 letter geteld wordt.
[q]

De vraag alleen, hoe accuraat moet het zijn, wat is je uiteindelijke doel met die info. Dingen tellen lijkt simpel, maar afhankelijk van wat je ermee gaat doen kun je nog wel eens tegen wat dingetjes aanlopen.
Het zou mooi zijn als iemand hier een code voor weet die ingebouwd kan worden in het script.
Als je op zoek bent naar kant en klare scripts ben ik bang dat je hier niet veel gaat vinden.
Begin zelf eens met het aanpassen van je script en kijk wat er gebeurt. Kom je er niet uit, geef dan aan waar je precies vastloopt, dan is er vast iemand die je verder kan helpen met een specifieke vraag :)

  • Switchie
  • Registratie: April 2009
  • Niet online

Switchie

Mr. Evil Genius

Hanneke05 schreef op zaterdag 26 augustus 2017 @ 19:34:
-Wat ik precies wil met dit script is heel "simpel" : dat het aantal letters van een woord automatisch tussen haakjes vóór het woord komen staan en waarbij de ij als 1 letter geteld wordt.
Waarom doe je trouwens moeilijk met VBA als je met =len aan de slag kunt?

'Future proof' (de; v) Verschijnsel waarbij men een dure aankoop rechtvaardigt door innovatie te negeren


  • Jorgen
  • Registratie: Mei 2007
  • Laatst online: 09:01

Jorgen

Moderator Beeld & Geluid

AV Liefhebber

Wees je ervan bewust dat er in het Nederlands ook woorden gebruikt worden waarbij de i en de j wel naast elkaar staan, maar ze geen ij vormen. Dat kan bijvoorbeeld voorkomen bij samenstellingen zoals minijurk / mini-jurk en nazijager / nazi-jager (hoort beide met een streepje, maar vind je vast ook zonder) en bijv. ook bij het uit het Frans afkomstige: bijou en bijous. Andersom kan ook glijijzer (officieel glij-ijzer) en rijinstructeur (rij-instructeur).

Misschien een heel simpele oplossing: kan je niet gewoon een tweede telling toevoegen met deze inhoud:

ALS woord heeft IJ, dan counter -1 (dit is vanzelfsprekend geen echte code) ;)

Your Friendly Neighborhood Moderator

Pagina: 1