/ / Usuwanie niechcianych znaków z komórek z przodu iz tyłu w VBA (excel) - regex, excel, vba, excel-vba, vbscript

Usuwanie niechcianych znaków z komórek z przodu iz tyłu w VBA (excel) - regex, excel, vba, excel-vba, vbscript

Jestem bardzo początkującym programistą i chociaż istnieje kilka podobnych pytań do moich, które zostały zadane, nie mogę sprawić, by działały zgodnie z moimi potrzebami.

Chcę mieć możliwość kopiowania nieprzetworzonych danychkolumna A, uruchom makro i powinno usunąć niechciane znaki zarówno przed jak i po danych, które chcę zachować, w wyniku czego komórka zawiera tylko te dane, które chcę. Chcę również, aby przechodziła przez wszystkie komórki znajdujące się w kolumnie, mając na uwadze, że niektóre komórki mogą być puste.

Dane, które chcę zachować, są w tym formacie: L1-somedata-0000

Tekst -somedata zmieni się, ale - eterstrona zawsze będzie tam, L1 będzie czasem L2, a 0000 (które mogą być dowolnymi 4 liczbami) będzie czasami dowolnymi 3 liczbami. również może być kilka wierszy w kolumnie, które nie mają żadnych użytecznych danych, powinny one zostać usunięte. W końcu, niektóre komórki nie będą zawierać żadnych niepożądanych danych, powinny one pozostać takie same.

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

Położyłem swój kod, który mam do tej pory, wszystko, co robi, to przechodzenie przez każdą komórkę, jeśli pasuje do niej, po prostu usuwa tekst, który chcę zachować, a także te, które chcę usunąć!

Naprawdę mam nadzieję, że wszystko to robi! Każda pomoc będzie doceniana.

Chris

Odpowiedzi:

3 dla odpowiedzi № 1

Jeśli "-" są częścią danych wejściowych, możesz użyć funkcji RegExp Replace, takiej jak:

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

lub:

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

Zamiast .Replace możesz również użyć Submatch:

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

Jeśli potrzebujesz funkcji, przekaż Regexp do funkcji; i pamiętaj, że zwracana wartość musi być przypisana do nazwy funkcji (removeData <> ExtractSDI).

Kolejna możliwość dla drugiej specyfikacji ("-" nie jest częścią pożądanej wydajności):

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

AKTUALIZACJA:

Aby poradzić sobie z "-" osadzonym w pożądanym wyniku i pokazać, w jaki sposób to podejście może być użyte w / jako formuła:

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

W zależności od Twoich danych może być konieczna zmiana .Pattern

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

aby pozwolić (*) / zabraniać (+) pustych głów lub ogonów. Użyj Dokumenty pracować poprzez / rozumieć wzorce.


1 dla odpowiedzi nr 2

Nie potrzebujesz do tego VBA, jeśli dane to np. Col A, wstaw tę formułę do komórki B1 i skopiuj ją.

=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),""))

Wyjaśnienie:

  1. 4 jest długością L1- + 1 (skąd chcemy pobrać ciąg znaków
  2. 8 to [3 + 5], która jest długością L1- i -0000
  3. 7 to [3 + 4], która jest długością L1- i -000

wprowadź opis obrazu tutaj