/ / Suppression de caractères indésirables de cellules situées devant et derrière des cellules dans VBA (excel) - regex, excel, vba, excel-vba, vbscript

Suppression des caractères indésirables des cellules en façade et derrière les cellules de VBA (Excel) - regex, excel, vba, excel-vba, vbscript

Je suis très novice en programmation et bien que plusieurs questions similaires aient été posées, je ne peux pas sembler les faire fonctionner pour mes besoins.

Ce que je veux, c'est pouvoir copier des données brutes danscolonne A, appuyez sur Exécuter sur la macro et il devrait supprimer tous les caractères non souhaités avant et après les données que je souhaite conserver, ce qui entraîne la création d’une cellule contenant uniquement les données souhaitées. Je souhaite également qu'il parcourt toutes les cellules de la colonne, en gardant à l'esprit que certaines cellules peuvent être vides.

Les données que je veux conserver sont dans ce format: L1-somedata-0000

Le texte -somedata- va changer mais le - ethercôté sera toujours là, le L1 sera parfois L2, et le 0000 (qui pourrait être n'importe quels 4 nombres) sera parfois 3 n'importe quels nombres. De plus, il peut y avoir des lignes dans la colonne qui ne contiennent pas de données utiles. Celles-ci doivent être supprimées. Enfin, certaines cellules ne contiendront aucune donnée indésirable, elles devraient rester les mêmes.

Sub Test()
Dim c As Range
For Each c In Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
c = removeData(c.text)
Next
End Sub

Function removeData(ByVal txt As String) As String
Dim result As String
Dim allMatches As Object
Dim RE As Object

Set RE = CreateObject("vbscript.regexp")

RE.Pattern = "(L1-somedata-d{4}|d{3})"
RE.Global = True
RE.IgnoreCase = True
Set allMatches = RE.Execute(text)

If allMatches.Count <> 0 Then
result = allMatches.Item(0).submatches.Item(0)
End If

ExtractSDI = result

End Function

J’ai mis le code que j’ai eu jusqu’à présent, tout ce qu’il fait est de parcourir chaque cellule. Si elle correspond, elle supprime simplement le texte que je veux conserver ainsi que les éléments que je veux supprimer!

J'espère vraiment que tout cela fait sens! Toute aide sera très appréciée.

Chris

Réponses:

3 pour la réponse № 1

Si les "-" font partie des données d'entrée, vous pouvez utiliser un RegExp Replace comme:

>> Set r1 = New RegExp
>> r1.Pattern = "^[^-]+(-[^-]+-).*"
>> WScript.Echo r1.Replace("L2-A-1234", "$1")
>>
-A-

ou:

>> Set r1 = New RegExp
>> r1.Pattern = "^[^-]+-([^-]+).*"
>> WScript.Echo r1.Replace("L2-B-123", "$1")
>>
B

Au lieu de .Replace, vous pouvez également utiliser des sous-correspondances:

>> WScript.Echo r1.Execute("Don"t care-wanted-")(0).SubMatches(0)
>>
wanted

Si vous avez besoin d’une fonction, passez l’expression rationnelle dans la fonction; et rappelez-vous que la valeur de retour doit être affectée au nom de la fonction (removeData <> ExtractSDI).

Une autre possibilité pour la deuxième spécification ("-" ne fait pas partie de la sortie souhaitée):

>> WScript.Echo Split("Whatever-Wanted-Ignore", "-")(1)
>>
Wanted

METTRE À JOUR:

Pour traiter "-" intégré dans la sortie désirée et montrer comment cette approche peut être utilisée dans / sous forme de formule:

Option Explicit

" needs Ref to RegExp

Dim rX As RegExp

Function cleanSDI(s)
If rX Is Nothing Then
Set rX = New RegExp
rX.Pattern = "^([^-]*-)(.+)(-.*)$"
End If
cleanSDI = rX.Replace(s, "$2")
End Function

Selon vos données, vous devrez peut-être modifier le .Pattern en

rX.Pattern = "^([^-]+-)(.+)(-.+)$"

autoriser (*) / interdire (+) les têtes ou queues vides. Utilisez le Docs travailler à travers / comprendre les modèles.


1 pour la réponse № 2

Vous n’avez pas besoin de VBA pour cela. Si les données sont dans le Col A, mettez cette formule dans la cellule B1 et copiez-la.

=IF(AND(MID(A1,3,1)="-",MID(RIGHT(A1,5),1,1)="-"),MID(A1,4,LEN(A1)-8),IF(AND(MID(A1,3,1)="-",MID(RIGHT(A1,4),1,1)="-"),MID(A1,4,LEN(A1)-7),""))

Explication:

  1. 4 est la longueur de L1- + 1 (d'où nous voulons récupérer la chaîne
  2. 8 est [3 + 5] qui est la longueur de L1- et -0000
  3. 7 est [3 + 4] qui est la longueur de L1- et -000

entrer la description de l'image ici