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 № 1Jeś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:
4
jest długościąL1-
+ 1 (skąd chcemy pobrać ciąg znaków- 8 to [3 + 5], która jest długością
L1-
i-0000
- 7 to [3 + 4], która jest długością
L1-
i-000