Microsoft 365 Récupérer un bout de chaine (jusque l'apparition de : "-" )

Fabinou62

XLDnaute Occasionnel
Bonjour,

J'ai dans une cellule : mot1 - mot2
J'aimerais récupérer seulement le mot1, en VBA, il a une taille variable.
J'ai pensé à faire une boucle While.... mais je ne sais pas si il y a une meilleur façon de le faire :)

Merci d'avance :)
 
Solution
Bonjour Fabinou,
En PJ un essai, qui, à partir de mot1 - mot2 stocke mot1 et mot2
il faut utiliser le résultat de tableau.
VB:
Sub essai()
For indextab = 2 To 30
    If InStr(Cells(indextab, 11).Value, " - ") <> 0 Then
        'MsgBox (" -  détécté")
        Tableau = Split(Cells(indextab, 11), " - ") ' tableau commence à l'indice 0
        Cells(indextab, 13).Value = Tableau(0) ' premier mot
        Cells(indextab, 15).Value = Tableau(1) ' second mot
    End If
Next indextab
End Sub

Addon :
1.jpg

Fabinou62

XLDnaute Occasionnel
J'aurai une autre question, j'aimerais récupérer la partie droite de la chaîne (ici : mot2) pour la mettre dans une cellule, j'ai tester ca mais ca ne fonctionne pas :
VB:Copier dans le presse-papier
If InStr(Cells(indextab, 11).Value, " - ") <> 0 Then
MsgBox (" - détécté")
Tableau = Split(Cells(indextab, 11).Value, " - ")
Cells(indextab, 10).Value = Split(Cells(indextab, 11).Value, " - ")
Cells(indextab, 11).Select

For i = 0 To Tableau.GetUpperBound(0)
MsgBox(Tableau(i))
Next i

End If
indextab est une variable incrémentée par une boucle for
Mais il m'indique à chaque fois, objet requis :(

exusez moi si c'est indiqué 2 fois :)
 

Fabinou62

XLDnaute Occasionnel
J'ai fais des modifs et ca marche, merci quand même :)

Pour les curieux :

If InStr(Cells(indextab, 11).Value, " - ") <> 0 Then
Cells(indextab, 11).Select
MsgBox (" - détécté")
Tableau = Split(Cells(indextab, 11).Value, " - ")
Cells(indextab, 10).Value = Split(Cells(indextab, 11).Value, " - ")
Cells(indextab, 12).Value = Tableau(UBound(Tableau))

End If
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Fabinou,
En PJ un essai, qui, à partir de mot1 - mot2 stocke mot1 et mot2
il faut utiliser le résultat de tableau.
VB:
Sub essai()
For indextab = 2 To 30
    If InStr(Cells(indextab, 11).Value, " - ") <> 0 Then
        'MsgBox (" -  détécté")
        Tableau = Split(Cells(indextab, 11), " - ") ' tableau commence à l'indice 0
        Cells(indextab, 13).Value = Tableau(0) ' premier mot
        Cells(indextab, 15).Value = Tableau(1) ' second mot
    End If
Next indextab
End Sub

Addon :
1.jpg
 

Pièces jointes

  • Split.xlsm
    15.4 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
bonjour
perso je me dis que split pour split je vire instr
pourquoi tester instr pour splitter autant tester le ubound du split ca fait un code simple et plus facile a appréhender
VB:
    With Cells(indextab, 11)
        tableau = Split(.Value, " - ")
        If UBound(tableau) > 0 Then
            MsgBox (" - détécté")
            .Offset(, -1).Value = tableau(0)
            .Offset(, 1).Value = tableau(UBound(tableau))
        End If
    End With
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Patrick,
C'est la même chose.
J'ai conservé l' Instr de Fabinou, il évite le transfert de la cellule dans le tableau en cas d'absences de " - ";
ensuite lequel est le plus rapide ....
Avec deux mots surement pas de différence, avec des chaines plus complexes, je ne saurais me prononcer.

Addon :
Just for the fun ...
Avec 28000 chaines sans " - ", sur mon PC, avec Instr : 0.253s, sans Instr : 0.316 soit 25% plus rapide avec Instr
Avec 1000 chaines avec " - ", sur mon PC, avec Instr : 0.242s, sans Instr : 0.234 soit 3% plus rapide sans Instr
Donc l'optimum va dépendre du ratio de chaîne avec et sans séparateur.:)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 203
Messages
2 086 195
Membres
103 153
dernier inscrit
SamirN