Déterminer la position d'une lettre dans une suite de chiffre

Bonjour à toutes et tous.

Me voilà avec une question qui m'embête.

J'aimerai déterminer la position d'une lettre dans une suite de chiffre.

Exemple :

  • 67B : réponse = 3
  • 1A2 : réponse = 2

etc etc.

j'ai testé un tas de chose, avec cherche(), stxt(), code(), T(), ... mais je ne m'en sors pas.

Je voyais quelque chose avec code(), car les chiffres de 0 à 9 ont un code allant de 48 à 57, alors que la lettre A en majuscule ne commence qu'à 65...mais bon, le problème c'est que je travaille toujours sur la suite entière de caractère, ce qui ne fait pas avancer...

Merci beaucoup !

bonjour,

une solution avec une fonction matricielle (à valider avec ctrl-maj-entree)

=MIN(SI(STXT(A1;LIGNE(A1:A100);1)>="A";LIGNE(A1:A100);999))

Merci pour ta réponse et ta proposition.

Ça semble fonctionner, sauf pour les cas où la lettre est en premier (je n'avais pas précisé) (résultat 999), mais les cas sont très rares, voire inexistants, donc ce n'est pas grave.

Peux-tu m'expliquer cette formule? et le gain qu'elle apporte lorsque validée en formule matricielle?

Bonjour JB25,H2so4,

Proposition de formule fait pour un groupe de 3 caractères dont une lettre.

=SI(CODE(A1)>64;GAUCHE(A1;1);SI(CODE(DROITE(A1;2))>64;STXT(A1;2;1);DROITE(A1;1)))

Bonne continuation.

Suite,

Correction: Forrmule pour la position de la lettre et non le ressorti Lettre.

=SI(CODE(A1)>64;1;SI(CODE(DROITE(A1;2))>64;2;3))

Bonjour,

Et en VBA, cela peut donner quelque chose comme ça.

Sub Verification_caractere()

    Dim I As Integer
    Dim char As Variant
    Dim dernligne As Long
    Dim x As Long

Application.ScreenUpdating = False

    dernligne = Cells(10000, 1).End(xlUp).Row
    For x = 1 To dernligne
        Cells(x, 1).Activate
        For I = 1 To Len(activecell)

            char = Mid(activecell, I, 1)

                If char >= 65 Then activecell.Offset(0, 2) = I
        Next I

    Next x

Application.ScreenUpdating = True
End Sub

N'étant pas spécialiste mais désirant m'améliorer, si certains voient des choses à améliorer, je suis preneur !

Suite,

Correction: Forrmule pour la position de la lettre et non le ressorti Lettre.

=SI(CODE(A1)>64;1;SI(CODE(DROITE(A1;2))>64;2;3))

Merci.

J'avais modifié mon code, pour jusqu'à 4 caractères :

=SI(CODE(A1)>64;1;SI(CODE(STXT(A1;2;1))>64;2;SI(CODE(STXT(A1;3;1))>64;3;SI(CODE(STXT(A1;4;1))>64;4;SI(CODE(STXT(A1;5;1))>64;5;"")))))

Mais c'est le même que toi.

Pour le VBA, je ne maitrise pas du tout du tout, donc je laisse les pros répondre.

Pour la formule matricielle, je me doute que c'est puissant, or je ne la comprend pas.

Je validerai ce sujet d'ici 1 ou 2 jours, de manière à le faire vivre le temps d'épuiser les idées.

Merci à vous.

Bonjour,

Une autre proposition avec formules.

Pour la compréhension des formules :

Ruban, Formules, Vérification des formules, Evaluer la formule.

Cdlt.

7jb25.xlsx (10.22 Ko)
annotation 2020 06 09 163225

Bonjour Jean-Éric,

Je profite de ton passage par ici pour abuser un peu. Je ne suis pas content de devoir activer la cellule à chaque fois, mais je ne voyais pas comment faire autrement car il faut ensuite écrire la valeur dans une autre cellule de la même ligne.

Dans la logique, quelle solution serait mieux que ça ? Stocker tout ça dans un tableau virtuel ? Comment améliorer ce bout de code ?

dernligne = Cells(10000, 1).End(xlUp).Row
    For x = 1 To dernligne
        Cells(x, 1).Activate
        For I = 1 To Len(activecell)

            char = Mid(activecell, I, 1)

                If char >= 65 Then activecell.Offset(0, 2) = I
        Next I

Par avance un immense merci !

bonjour,

Peux-tu m'expliquer cette formule? et le gain qu'elle apporte lorsque validée en formule matricielle?

en effet elle fonctionne sans validation matricielle, je suppose que c'est nécessaire pour certaines versions précédentes.

la formule :

=MIN(SI(STXT(A1;LIGNE(A1:A100);1)>="A";LIGNE(A1:A100);999))

ligne(A1:A100) génére un vecteur avec tous les nombres de 1 à 100 que je vais utiliser dans la fonction STXT pour prendre successivement le 1er, puis le 2eme puis le 3ème, puis ... jusqu'à 100 caractères tant qu'il y en a, je compare chacun de ces caractères au caractère "A", si plus grand égal, je mets dans le vecteur réponse la position de ce caractère, sinon je mets 999), lorsque le vecteur est complété, je prends la valeur minimum trouvé dans ce vecteur résultat, ce qui correspond à la position du premier caractère alphabétique trouvé.

tu peux voir le déroulement de la formule via le menu formule (évaluer formule)

pour répondre à ta question JoyeuxNoel, voici une manière de faire

Sub Verification_caractere()

    Dim I As Integer
    Dim char As Variant, a As Variant
    Dim dernligne As Long
    Dim x As Long

    Application.ScreenUpdating = False

    dernligne = Cells(10000, 1).End(xlUp).Row
    For x = 1 To dernligne
        a = Cells(x, 1)
        For I = 1 To Len(a)

            char = Mid(a, I, 1)

            If char >= "A" Then Cells(x, 3) = I: Exit For
        Next I

    Next x

    Application.ScreenUpdating = True
End Sub

impressionnant....c'est puissant dit donc !

Je me demande comment on se forme aux formules matricielles..?

J'avoue maitriser pas mal de fonctions natives, mais là...chapeau.

Merci aussi à Jean-Eric pour ta proposition.

Je regarde ça demain, là je quitte le taf.

A+ !

bonjour

une contribution matricielle

7jb25.xlsx (8.73 Ko)

cordialement

Re,

Bonjour à tous,

Une autre façon de faire en VBA.

Avec Do While...Loop

Cdlt.

7joyeuxnoel.xlsm (18.78 Ko)
Public Sub JoyeuxNoel()
Dim lastRow As Long, rng As Range, Cell As Range, n As Long, Found As Boolean, x
    With ActiveSheet
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set rng = .Cells(2, 1).Resize(lastRow - 1)
        For Each Cell In rng
            n = 1: Found = False
            Do While n <= Len(Cell) And Found = False
                x = VBA.Mid(Cell, n, 1)
                If VBA.Asc(x) >= 65 And VBA.Asc(x) <= 90 Then
                    Found = True
                    Cell.Offset(, 1).Value = n
                End If
                n = n + 1
            Loop
        Next Cell
    End With
End Sub

Merci beaucoup pour cette réponse Jean-Éric.

Je vais essayer de m'inspirer le plus possible de cette logique pour épurer un peu mes codes.

n = 1: Found = False

Les : font un peu comme un AND ici ?

Je n'ai pas trouvé trop d'aide sur leur utilisation

Re,

@JoyeuxNoel

Tu as un autre exemple de h2so4 !...

Quelle est la question ?

Cdlt.

Re,

Effectivement, j'avais vu la réponse de h2so4 directement, mais je pense que la partie VBA a été rajoutée après car je ne l'avais pas remarquée. (ou je suis passé totalement à côté)

Ma question était :

n = 1: Found = False

Tu attribues la valeur 1 à la variable n mais ensuite, à quoi servent les ":" ?

Du coup maintenant que j'ai vu Et ta réponse, ET celle de h2so4, je peux vous remercier tous les deux car j'y vois plus clair (sauf pour les ":" )

Re,

Cela équivaut à :

n = 1
Found = False

Bonjour à tous,

Super Jean-Éric, merci pour la réponse.

J'avais bien l'impression que ça ne changeait rien à part l'esthétique, mais je n'arrivais pas à en être sûr.

bonjour

une contribution matricielle

jb25.xlsx

cordialement

Merci pour cette solution, qui me semble parfaite.

Pas évident de construire ce genre de formule, qui fait appelle à des fonctions natives, mais dont l'utilisation diffère un peu.

Je vais essayer de bien tout comprendre avec l'analyse de la formule.

Bonjour,

Une autre approche VBA, via une fonction personnalisée, que l'on pourra utiliser dans la feuille de calcul...

Fonction :

Public Function ChercheAlpha(C As Range) As Integer
Dim toto, ind As Integer
    ChercheAlpha = 0                                    'valeur par défaut
    toto = Split(StrConv(C.Value, vbUnicode), Chr(0))   'découpe la chaîne caractère / caractère
    For ind = LBound(toto) To UBound(toto)              'boucle sur tous les caractères
        If Not IsNumeric(toto(ind)) Then                'si caractère non numérique
            ChercheAlpha = ind + 1                      'retour
            Exit For                                    'sortie
        End If
    Next
End Function

Appel de cette fonction dans une feuille :

en B1, saisir : =ChercheAlpha(A1)

Cette formule peut-être étirée comme toute autre...

Une petite adaptation de la proposition de Jean-Eric, avec le Do While...

Remplacer :

x = VBA.Mid(Cell, n, 1)

Par :

x = UCase(Mid(Cell, n, 1))
Rechercher des sujets similaires à "determiner position lettre suite chiffre"