InStr - problème de base

Bonjour,

J'ai dans un tableau une colonne contenant des Points Kilométriques
ils peuvent ressembler à

"000+000"
"0+000"
"00-000"
"X+000"
etc etc
Au final ils doivent épouser le format "000+000" "000-000" "X+000" ou "X-000"

considérant qu'ils peuvent commencer soit par un chiffre soit par une lettre, pour les traîter en une fois, je vais utiliser leur forme texte et utiliser leur seul point commun, à savoir qu'ils possèdent tous soit un "+" soit un "-"

Apparemment la fonction InStr permet de déterminer l'emplacement de ce signe, mais dans mon cas (de bleu en VBA) ça ne foncionne pas

    Dim ContenuCell As String
    ContenuCell = Range("M3").Value
    positionDuplUS = InStr(1, (M3), "+")

    MsgBox ContenuCell & "  " & positionDuplUS

Pourquoi, alors que j'espère que ça me revoie "3+539 2", j'obtiens toujours ça :

image

Bonjour,

Cela sors d'où ce : (M3) ?

    Dim ContenuCell As String
    ContenuCell = Range("M3").Value
    positionDuplUS = InStr(1, ContenuCell, "+")

    MsgBox ContenuCell & "  " & positionDuplUS

Attention aussi à la méthode de comparaison qui est Binary par défaut.

Plus d'informations ICI.

Bonjour,

Pas besoin de t'enquiquiner à trouver la position du "+" ou du "-" et d'ajouter spécifiquement le nombre de "0" adéquat.

Il te suffit de tester si le premier caractère de ton PK initial est numérique. Si oui alors tu concatènes "000" et ton PK initial puis tu prends les 7 caractères de droite.

Dans la PJ inscris ton PK à tester en A1 et lance la macro avec le bouton. Le PK final s'inscrira en B1.

Teste et dis nous.

6creat-pk.xlsm (16.73 Ko)
Option Explicit
Sub test()

Dim pk_initial As String
Dim pk_final As String

Range("B1").Clear

pk_initial = Range("A1")

If IsNumeric(Left(pk_initial, 1)) Then

    pk_final = Right("000" & pk_initial, 7)

Else

    pk_final = pk_initial

End If

Range("B1") = pk_final

End Sub

Pour répondre à ta question quand même tu enregistres le contenu de la cellule M3 dans la variable ContenuCell mais ensuite dans la recherche du positionnement tu n'utilises pas cette variable. Tu utilises la recherche avec une nouvelle variable M3 qui ne reprend pas le contenu de la cellule.

Pour info complémentaire

Tu peux accéder rapidement au contenu d'une cellule en rentrant ses coordonnées entre crochets [M3] mais pas entre parenthèses (M3). Mais dans ce cas pas besoin de créer la variable ContenuCell. Enfin, pour compléter, tu déclares bien ContenuCell mais pas positionDuPlus.

Bonsoir BZB, Le Fil,

Pos = Instr(1,[M3], "+“) + Instr(1,[M3], “-")

Bien vu X Cellus. Il pourra traiter le positionnement du "+" et du "-" en une sule fois s'il décide de continuer avec cette méthode de repérage de ces caractères.

Bonjour et merci pour votre aide.

@Jean Paul :
Le M3 c'est la cellule sur laquelle j'effectuais le test.
Effectivement le test fonctionne en passant par la variable (ta version) mais je me demande pourquoi en mettant directement (M3) dans le instr ça ne fonctionne pas.
Serait-ce parce qu'il ne considère pas la valeur de la cellule comme une chaîne de caractère par défaut ?

@Alex et X Cellus
ça fonctionne à merveille, j'ai plus qu'à piger et à intégrer à mon script global.

Bonne semaine à vous trois

Bonjour à tous,

Une autre écriture : = IIf(IsNumeric(Left(x, 1)), Right("0000000" & x, 7), x)

je me demande pourquoi en mettant directement (M3) dans le instr ça ne fonctionne pas

PCQ (M3) ou M3 sans les parenthèses revient au même et qu'il n'interprète pas cela comme une adresse de cellule mais comme une variable. Et comme tu ne donnes pas de valeur en amont à M3 bein elle ne contient rien.

Une écriture simplifiée pour accéder à une cellule de la feuille active peut se définir avec des crochets. [M3] accèdera bien au contenu de la cellule M3 de la feuille active.

Un peu de syntaxe :

ThisWorkbook.Sheets("nom_feuille").Range("adresse_cellule") est une syntaxe complète et correcte pour accéder à une cellule précise de n'importe quelle feuille de ton classeur (même les feuilles ou les cellules masquées). Cela t'évite de faire des Select ou des Activate dans ton code et te fais gagner du temps puisque du coup le code n'affiche pas la feuille au premier plan. Ta feuille active reste la même.

Dérivés pas propre mais fonctionnel (sauf cas particulier) ThisWorkbook.Sheets("nom_feuille").[adresse_cellule]

Si tu ne mets que Range("adresse_cellule") ou [adresse_cellule] tu accèdes uniquement à la cellule en question de la feuille active.

PS Attention aux ". Pas dans les crochets.

Rechercher des sujets similaires à "instr probleme base"