.NET Framework - Extraction du dernier mot d'une cellule Excel

Asked By mahefa on 30-Aug-11 02:36 AM
Bonjour,

J'ai un petit probl?me pour am?liorer la fonction suivante :

Function pf(lc, Optional last)
tmp = Trim(lc.Value)
tab1 = Split(tmp, " ")
If IsMissing(last) Then
tab1(UBound(tab1)) = ""
pf = RTrim(Join(tab1, " "))

Else
pf = tab1(UBound(tab1))
End If
End Function

Cette fonction marche bien, mais mon probl?me est comment faire :

- si le dernier mot est une cha?ne de caract?re alphanum?rique, on le remplace
par " "

- si la cellule est vide, la valeur renvoy?e est le signe d'erreur #VALEUR,
comment enlever cette signe d'erreur, je veux la remplacer par " "

Est-ce que quelqu'un peut m'aider.

Merci d'avance pour votre aide.




at replied to mahefa on 30-Aug-11 02:20 PM
mahefa a ?mis l'id?e suivante :

C'est pas le bon groupe, ici c'est visual basic, mais de toute fa?on
y'a plus personne ici.

Pour r?pondre ? ta question, vu que tu ma?trises plut?t bien pourquoi
ne pas utiliser un

if tmp = "#VALEUR" then ...
Ou encore, je ne sais pas si elle existe en vba, c'est la fonction
replace.


Ou alors j'ai pas compris ton probl?me.

A+
Gloops replied to mahefa on 31-Aug-11 02:45 AM
mahefa a =E9crit, le 30/08/2011 08:36 :
n le remplace
ALEUR,

Bonjour,

En d=E9but de fonction :
If Nz(lc, "") =3D "" Then
pf =3D ""
Exit Function
End If

comme =E7a on a r=E9solu la deuxi=E8me question. C'est quand m=EAme plus =
simple=20
d'=E9viter de provoquer une erreur que de la remplacer par autre chose=20
apr=E8s, et en plus l'avantage c'est que =E7a marche.

J'avoue que je suis un peu h=E9sitant sur le test de l'alphanum=E9rique. =
Il=20
y a bien la solution de tester le code ASCII de chaque caract=E8re, mais =

je n'affirmerais pas qu'il n'y a pas plus adapt=E9. Regarde bien dans les=
=20
fonctions de type texte.

Je vais partir du principe qu'on aura une fonction IsText qui retourne=20
vrai si son argument est alphanum=E9rique, faux sinon. Si tu ne trouves=20
rien de mieux, tu vas bien savoir =E9crire une fonction qui parcourt le=20
texte en boucle pour voir si chaque caract=E8re est dans l'intervalle=20
voulu (lettre ou chiffre), et retourner vrai ou faux en fonction de =E7a.=
=20
V=E9rifier si IsText n'est pas un mot r=E9serv=E9.

Dans le deuxi=E8me terme de l'alternative on a vid=E9 explicitement le=20
dernier mot, donc je ne vois pas bien ce qu'il reste =E0 faire dessus,

ensuite

Else
If IsText(tabl(UBound(tabl))) Then
pf =3D " "
Else
pf =3D tabl(UBound(tabl))
End If
End If


C'est vrai que le newsgroup microsoft.public.fr.excel existe encore,=20
m=EAme si le serveur Microsoft, qui =E9tait le principal l=E0-dessus, a c=
ess=E9=20
de fonctionner, ce qui fait qu'on ne joint pas forc=E9ment les m=EAmes=20
personnes selon sur quel serveur on poste.
J'imagine que GigaNews doit l'avoir ?

Par hasard je suis pass=E9 ici aujourd'hui, c'est vrai que je ne passe pa=
s=20
tous les jours puisque d'habitude il n'y a rien.
Au demeurant, j'ai une bonne exp=E9rience d'Excel, mais je ne l'ai pas=20
sous la main, donc je r=E9ponds de m=E9moire, alors je te laisse tester.

Je pense que je vais repasser demain pour le cas o=F9 quelque chose ne=20
serait pas clair.
Gloops replied to Gloops on 31-Aug-11 02:50 AM
Gloops a =E9crit, le 31/08/2011 08:45 :

Je voulais dire le premier, bien s=FBr.
Jean-marc replied to Gloops on 31-Aug-11 04:58 AM
Hello Gloops,
le plus simple est effectivement de faire une simple boucle.
On peut par exemple faire ceci:

Function isAlphaNumericString(ByVal str As String) As Boolean
Dim length  As Long
Dim i       As Long
Dim car     As String

length = Len(str)
If length > 0 Then
For i = 1 To length
car = Mid$(str, i, 1)
If Not (isAlpha(car) Or isDigit(car)) Then
isAlphaNumericString = False
Exit Function
End If
Next i
isAlphaNumericString = True
End If
End Function

Function isAlpha(ByVal car As String) As Boolean
Const diacritics As String = "àâäéèëêîïôöùüçÂÄËÊÏÎÔÖÛÜ"

If ((car >= "A") And (car <= "Z")) Or _
((car >= "a") And (car <= "z")) Or _
(InStr(diacritics, car) > 0) Then
isAlpha = True
End If
End Function

Function isDigit(ByVal car As String) As Boolean

If (car >= "0") And (car <= "9") Then
isDigit = True
End If
End Function


Bonne journée,



--
Jean-marc