8
votes

Comment renverser uniquement le texte après une virgule dans une chaîne

J'explète du texte entre les parens dans la barre de titre de la fenêtre active. Cette partie fonctionne bien (grâce à une aide que j'ai reçue ici auparavant!). Maintenant, je veux créer deux macros distinctes - une qui ne renvoie que le prénom et l'autre qui ne renvoie que le nom de famille.

Ma barre de titre de la fenêtre active ressemble à ceci comme ceci: p>

du texte à gauche (henderson, tom) du texte à droite (Il n'y a pas d'espace après la virgule) p>

Le nom de famille Macro fonctionne parfaitement. Il ressemble à ceci: p>

Sub a1FirstName()
    'Extract first name of patient from title bar (between parens)
    Dim strPatientName As String
    Dim OpenPosition As Integer '(open paren marker)
    Dim closeposition As Integer '(close paren marker)
    OpenPosition = InStr(ActiveDocument.ActiveWindow.Caption, "(")
    closeposition = InStr(ActiveDocument.ActiveWindow.Caption, ")")
    strPatientName = Mid(ActiveDocument.ActiveWindow.Caption, _
        OpenPosition + 1, closeposition - OpenPosition - 1)
    Dim c As Long
    c = InStr(strPatientName, ",")
    strPatientName = Right(strPatientName, c - 1)
    Selection.TypeText strPatientName
End Sub


0 commentaires

3 Réponses :


2
votes

Modifier, il semble que je ne comprenais pas bien la première fois. Tentative 2:

Vous voulez tout supprimer à droite de la virgule. P>

Debug.Print Mid(Mystring, InStr(Mystring, "," + 1))


1 commentaires

Soyez prudent dans votre dernier exemple, car s'il n'y a pas de virgule dans la chaîne, elle renvoie la chaîne totale au lieu d'un vide (ce qui serait plus sain d'esprit).



9
votes

Vous pouvez utiliser split () pour créer un tableau hors des parties séparées par la virgule du texte, puis accédez à la première ou à la deuxième partie: xxx


1 commentaires

Très complet. Vous pouvez également vous échapper avec l'utilisation de Split exclusivement au lieu de Instr et moyen . C'est un peu moins tolérant à un manquant ) ou ( cependant.



3
votes

On dirait que tout le monde se trouve sur divisé pour obtenir la première / seconde partie du nom. Vous pouvez également utiliser divisé pour vous débarrasser des parenthèses. Cela fonctionne si vous savez que vous voulez seulement (et toujours) avoir un seul ( et ) .

code donne l'idée principale. Vous pouvez utiliser Split pour avoir la partie de la chaîne qui n'inclut pas le ( ou ) et ensuite à nouveau d'obtenir de chaque côté du , . xxx

Le code ci-dessus présente un deux divisée et un Option de trois divisées . La principale différence est que la variété fractionnée utilise le même code pour supposer les parenthèses et le seul changement est le côté du , à saisir. Les deux options de division profitent du fait que la division sur une virgule supprime une parenthèses gratuitement. Les indices il y a un peu plus compliqué.


4 commentaires

J'utiliserais STIT pour la virgule, mais simplement enlever les supports que j'utiliserais remplacer: nom_last = remplacer (remplacer (STR, ") (1)", "") "," ) et nom_first = remplacer (remplacer (STRAT (STR, ") (0),") "", "") "," ("") Votre option 3 divisées vous donnera des problèmes s'il n'ya pas de support


@Dandonoghue, je suis d'accord avec un seul personnage à enlever, Split est un peu surpeuplé. Remplacer est plus évident ce que vous essayez de faire. J'ai déjà utilisé ce modèle avant de décaper moins trivial et cela fonctionne bien. Dans ce cas, il battrait Remplacer s'il y avait un autre texte en dehors des supports. Si cela n'est pas probable, remplacer serait un bon moyen d'y aller.


@Dandonoghue, remplacer a également l'avantage d'échouer bien si rien n'est trouvé. Certainement bien pour la référence future. Merci.


Vous avez raison, cela revient aux données principales, plutôt que de remplacer, nous pourrions même utiliser le milieu combiné avec la len de la chaîne moins 2 si nous sommes garantis qu'il y a toujours un support de départ et de fin et rien d'autre, la méthode Split Donnez une capacité peu plus dynamique si le jeu d'enregistrement le nécessite.