1
votes

Ajouter un espace entre deux mots une fois

J'ai complété le code pour supprimer toutes les données devant une chaîne, ajouter du texte (avec un espace) à l'avant et le stocker dans la cellule.

Cependant, chaque fois que j'exécute la macro (pour vérifier si les modifications que j'ai apportées fonctionnent par exemple), un nouvel espace est ajouté entre les mots.

Le code qui supprime tout ce qui se trouve avant le nom et ajoute la chaîne requise. J'ai appelé une fonction InStr et stocké la valeur en entier pos. Notez que ceci est dans une boucle sur une plage spécifique.

If pos > 0 Then
    modString = Right(cell, Len(cell) - InStr(cell, pos) - 2)
    'Removes anything before the channel name and places it in the last column
    cellValue.Offset(0, 2) = modString
   
    'Aligns the last column text to the right
    cellValue.Offset(0, 2).HorizontalAlignment = xlRight
    
    cellValue.Offset(0, 2).Font.Size = 8
    
    'Add "DA" to the front of the channel name in the rightmost column
    If StartsWith(cell, "DA ") = True Then
        cellValue.Replace cell, "DA" & modString
    Else
        cellValue.Replace cell, "DA " & modString
    End If
End If

Un "DA" supplémentaire n'est pas ajouté et je n'ai fait aucune autre fonction pour ajouter des espaces n'importe où. L'espace supplémentaire n'est pas ajouté si l'ajout de "DA" est remplacé par "DA".

Je préférerais ne pas ajouter une autre fonction / sous / quelque chose quelque part pour rechercher et supprimer les espaces supplémentaires. P >

Ce qu'est la chaîne ET ce qui se trouve devant la chaîne est inconnu. Cela peut être des nombres, des caractères, des espaces ou exactement ce que je veux que ce soit. Par exemple, cela pourrait être «Q-Quincey», «BA Bob», «DA White», etc. la meilleure façon.


Solution que vous m'avez tous aidé à trouver:

If pos > 0 Then
    'Removes anything before the channel name
    cellValue.Offset(0, 2) = Right(cell, Len(cell) - InStr(cell, pos) - 2)

    'Add "DA" to the front of the channel name
    cellValue.Offset(0, 0) = "DA " & Right(cell, Len(cell) - InStr(cell, pos) - 2)

    'Aligns the text to the right
    cellValue.Offset(0, 2).HorizontalAlignment = xlRight
End If


9 commentaires

Je ne comprends pas InStr (cell, pos)


Ne devrait-il pas être Right (cell, Len (cell) - pos - 2) ?


Droite (cellule, Len (cellule) - InStr (cellule, pos) - 2) est celle que j'ai trouvée lors d'une recherche en ligne.


Pourquoi mettez-vous une valeur dans un objet de plage de décalage? Je pense que Range.Replace pourrait vous aider aussi. Utilisez un caractère générique dans votre recherche.


Chaque cellule de la boucle peut ne pas avoir la même chose que je dois retirer et remplacer. Cela peut être "Q-Quincey" ou "QA Quincey", ou toute autre permutation. Je pensais que rechercher "Quincey" et modifier la cellule au besoin serait la meilleure façon.


Donc tout ce qui se trouve devant "Quincey" doit être remplacé par "DA"?


J'ai essayé de modifier le commentaire précédent, cela ne fonctionnait pas. J'ai essayé de changer InStr (cellule, pos) en (-pos-2), en (cellule, cellule) et dans les deux cas, la chaîne que je voulais conserver a été coupée.


@JvdV Correct. Ce qui se trouve devant "Quincey" est inconnu. Cela peut être des nombres, des caractères, des espaces ou exactement ce que je veux que ce soit. Dois-je modifier mon message pour refléter cela?


@BrownishMonster vous aviez raison. Je ne suis pas sûr de ce qui s'est passé. Ma noobness probablement. Merci!


3 Réponses :


0
votes

Peut-être que c'est quelque chose avec lequel vous pouvez travailler:


Exemple de données:

< a href = "https://i.stack.imgur.com/wdQ4T.png" rel = "nofollow noreferrer"> entrez la description de l'image ici


Exemple de code:

< pre> XXX

Résultat:

 entrez la description de l'image ici


4 commentaires

J'ai oublié de dire que je ne suis pas toujours à la recherche de "Quincey" et j'ai (encore) édité mon message pour le montrer. Dans chaque colonne, les lignes ont des noms différents (quincey, bob, white) et pour celles ciblées spécifiques, je veux ajouter "DA" à l'avant. Je vais continuer à me brancher. Merci pour votre suggestion!


@dkraemer, vous pouvez remplir un tableau avec les chaînes que vous recherchez et boucler ce tableau en utilisant la méthode exacte que j'ai démontrée ci-dessus


J'ai fini par le réparer avec un simple if / else dans la boucle. J'ai une fonction booléenne "startswith" qui vérifie la valeur passée par rapport à une valeur de préfixe passée. Je suppose que j'espérais qu'il me manquait quelque chose dans mon code, mais c'était 2 lignes supplémentaires et je suis satisfait.


Donc, ce problème est résolu? Si tel est le cas, n'hésitez pas à voter pour / marquer une réponse à partir d'ici qui, selon vous, a répondu à votre question.



0
votes

Si vous vouliez faire une boucle, vous devez supprimer certaines redondances dans votre code. Par exemple, se référer à cell.offset (0,0) n'a pas de sens.

Je définirais les cellules cibles sur une plage et modifierais simplement cette cellule sans placer les chaînes indésirables dans une autre cellule.

** MODIFIER:

J'essaierais quelque chose comme ça. **

nameiwant = "Quincy"
Set cell = Range("A1")
If InStr(cell, nameiwant) > 0 And Left(cell, 3) <> "DA " Then
    cell.Value = "DA " & nameiwant
End If


1 commentaires

Je n'étais pas très clair dans l'article original et j'ai ajouté une modification pour (espérons-le) rendre plus clair ce qui se passe. Je vois ce que vous dites sur le décalage (0, 0) cependant. Je l'ai fait parce que j'avais utilisé le décalage pour un autre code et l'avais copié / collé.



0
votes

Dans vos exemples, il semble que vous vouliez remplacer le premier "mot" de la chaîne par autre chose. Si tel est toujours le cas, la fonction suivante, qui utilise des expressions régulières, peut le faire:

DA Quincy
DA Bob
DA White

Le debug.print va ->

Option Explicit
Function replaceStart(str As String, replWith As String) As String
    Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = False
    .MultiLine = True
    .Pattern = "^\S+\W(?=\w)"
    replaceStart = .Replace(str, replWith)
End With
End Function

Sub test()
    Debug.Print replaceStart("Q-Quincy", "DA ")
    Debug.Print replaceStart("BA Bob", "DA ")
    Debug.Print replaceStart("DA White", "DA ")
End Sub


6 commentaires

Je ne sais pas si cela résout le problème. Parce que je ne sais pas avec certitude ce qui sera devant "Quincey, Bob, White", je ne peux pas faire une déclaration de remplacement direct. Les données changent en fonction de la manière dont l'utilisateur les spécifie. Je pourrais passer replaceStart la cellule actuelle et rechercher le mot désiré, puis remplacer tout ce qui N'EST PAS ce mot par "DA", mais je le fais déjà, en gros.


@Dkraemer Si vos exemples ne sont pas représentatifs de vos données réelles, l'élaboration d'une solution qui fonctionne sur vos données réelles peut ne pas être possible. Peut-être que si vous présentez de vrais exemples, les différentes solutions pourraient être modifiées pour fonctionner.


@Dkraemer Avec cette solution, peu importe ce qui se trouve devant "Quincey, Bob, White". Comme démontré, il remplace tout ce qui est devant par DA . Des exemples où cette approche ne fonctionne pas peuvent aider à affiner la solution. De plus, si vous devez enregistrer la phrase devant , cela peut également être fait facilement.


Merci. Je vais approfondir cela. J'essaye de rendre compte de chaque entrée possible; c'est peut-être déraisonnable? Par exemple, si c'était "wbijnqeidfjnwQuincey" ou quelque chose.


@Dkraemer vous aurez besoin soit d'une règle non ambiguë, soit d'une table de recherche pour résoudre le problème.


merci, je vais regarder dans la table de consultation. Toujours une opportunité d'apprendre quelque chose de nouveau.