fonction par macro

Bonjour,

Je suis amenée à gérer des extractions de données issues de différents logiciels dans lesquels les données ( les prénoms en particulier) sont saisies soit avec des lettres accentuées soit en majuscules.

J'ai crée une fonction pour remplacer les lettres accentuées et autre ç.

Voici mon problème réduit à sa plus simple expression.

Si on lance la fonction par la procédure "principal", le retour est "vide", mais si on l'utilise dans une cellule de classeur par testerchaine(a1) avec a1 vide, elle renvoie 0.

Par debug, on voit bien que la valeur passée ( si la fonction est utilisée dans le classeur) dans le cas d'une chaine vide est 0. Je ne veux pas le tester dans la fonction car la chaine originale pourrait être 0 et j'aimerais éviter d'avoir à le tester dans le classeur par =SI(A1="";"";TESTERCHAINE(A1)).

/option explicit//
//sub principal//
//dim locstrchaine as string//
//print testerchaine(locstrchaine)//
//end sub//
//
//function testerchaine (chaine as string) as string//
//testerchaine=chaine//
//end function//
/
Si quelqu'un a une idée.

Merci

Claude

Bonjour

claude-2 wrote

J'ai crée une fonction pour remplacer les lettres accentuées et autre ç.
...Si on lance la fonction par la procédure "principal", le retour est
"vide", mais si on l'utilise dans une cellule de classeur par
testerchaine(a1) avec a1 vide, elle renvoie 0.

Deux pistes...

1. Ne pas utiliser de fonction mais associer une procédure à l'événement
"Contenu modifié" de la feuille.

Il faut alors tester ce qui provoque la modification. S'il s'agit
d'une cellule et si elle fait partie de celles à "inspecter", tu
fais ton traitement.

2. Modifier la fonction pour qu'elle ne reçoive plus le contenu d'une
cellule mais ses références sous forme de texte.

Ainsi ton programme peut accéder "classiquement" à la celllule et
faire la différence entre vide, non vide, texte, etc.

Naturellement, passer la référence de la cellule sous forme de texte
serait gênant pour copier ou déplacer la cellule contenant la formule:
un texte n'est pas "relatif" et la référence ciblée ne serait pas mise
à jour. On évite cet écueil en passant la référence via la formule
CELLULE("address"; xx).

Pour finaliser le truc, on passe aussi la cellule ciblée comme
deuxième paramètre de la formule. Ce paramètre n'est pas
utilisé dans le programme. Il ne sert qu'à provoquer le recalcul
quand la cellule ciblée est modifiée.

Ci-joint un exemple.
FonctionPersonnalisée.ods
<http://nabble.documentfoundation.org/file/n4129159/FonctionPersonnalisée.ods>

Cordialement
Pierre-Yves

Bonjour,

Merci pour ton retour.

Les fichiers en question sont extraits en csv de différentes applications, la première solution exigerait de modifier la macro si la colonne changeait et je ne suis pas maître de la structure des ces fichiers.

La deuxième solution est plus facile à mettre en œuvre mais du coup je pense qu'il est plus facile pour mes collègues qui réalisent régulièrement ces traitement de comprendre
=SI(A1="";"";TESTERCHAINE(A1))
que
=TESTERCHAINEPYS(CELLULE("address";B4);B4)

Cela dit, j'ai encore appris quelque chose et rien que pour çà mais aussi pour le temps que tu consacres aux autres, merci beaucoup

Claude

Suite...

claude-2 wrote

la première solution exigerait de modifier la macro si la
colonne changeait et je ne suis pas maître de la structure des ces
fichiers.

La deuxième solution est plus facile à mettre en œuvre mais du coup je
pense qu'il est plus facile pour mes collègues qui réalisent
régulièrement ces traitement de comprendre
=SI(A1="";"";TESTERCHAINE(A1))

Oui je comprends :slight_smile:

Bon dimanche... et merci.

Pierre-Yves