Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Une fonction VBA envoie #Valeur!

jlgarnier

XLDnaute Nouveau
Bonjour,
Je viens d'écrire une fonction relativement simple : à partir d'un nom de société, je cherche à créer un identifiant unique sur 6 caractères. Je normalise la chaine en entrée en remplaçant tous les caractères accentués, puis je crée l'identifiant :
  • Si la chaine est plus courte que le code voulu, je la conserve telle quelle.
  • Sinon je cherche les espaces éventuels et je garde une portion de chaque sous-chaine pour assembler le code.

VB:
Public Function CreateCode(InString) As String

NormString = LCase(ConvertCharInString(InString))
StringLength = Len(NormString)
MaxCodeSize = Worksheets("Data").Cells(1, 2)

' Fonction Excel : =SI(NBCAR(C2)<Data!$B$1;C2;SI(NON(ESTERR(TROUVE(" ";C2)));GAUCHE(C2;Data!$B$1/2) & GAUCHE(STXT(C2;TROUVE(" ";C2)+1;NBCAR(C2)-TROUVE(" ";C2));Data!$B$1/2);STXT(C2;1;Data!$B$1)))

If Len(NormString) <= MaxCodeSize Then          ' Si la chaine d'entrée est plus courte que le code désiré, on garde la chaine complète
  CreateCode = NormString
Else
  HasSpace = InStr(1, NormString, " ")          ' La chaine contient-elle un espace ?
  If (HasSpace = 0) Then
    CreateCode = Left(NormString, MaxCodeSize)  ' NON : on tronque juste la chaine d'entrée à la longueur maximale choisie
  Else
    Dim SubStrings() As String
    SubStrings = Split(NormString, " ")         ' OUI : on sépare les membres gauche et droite de la chaine
    If (UBound(SubStrings) >= 2) Then
      SubStrings(2) = SubStrings(2) & SubStrings(3)
    End If
    CreateCode = Left(SubStrings(1), MaxCodeSize / 2) & Left(SubStrings(2), MaxCodeSize / 2)
  End If
End If

CreateCode = LCase(CreateCode)
End Function

J'ai deux problèmes :
  1. Si je saisis dans une cellule =CreateCode(A1), la fonction est bien appelée puisque j'atteins le point d'arrêt que j'y ai mis. Mais une fois le code déroulé, bien que je n'ai aucune erreur, la cellule affiche #VALEUR! alors que la "variable" CreateCode est bien calculée.
  2. Si la chaine d'entrée fait moins de 6 caractères (la valeur par défaut de MaxCodeSize), tout se passe bien et la chaine est bien affichée dans la cellule...

Je dois passer à côté d'un truc évident, mais je ne vois pas quoi ! Toute aide sera donc la bienvenue !

Merci d'avance !
 

vgendron

XLDnaute Barbatruc
Hello
peut etre ici (enfin. surement)
If (UBound(SubStrings) >= 2) Then
SubStrings(2) = SubStrings(2) & SubStrings(3)

si c'est 2.. substrings(3) est inconu.. puisque
si ubound = 2, alors les éléments sont substring(0) (1) et (2)
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…