#excel #vba #substring
#excel #vba #подстрока
Вопрос:
В моей электронной таблице в настоящее время есть столбец C со строками данных, которые имеют такую структуру ниже:
123 - abc - xyz
Я хочу, чтобы мой код VBA удалял все данные перед первым, включая -, чтобы столбец C выглядел следующим образом:
abc - xyz
Мой текущий код удаляет оба «-»
Sub TrimCell()
Dim i As String
Dim k As String
i = "-"
k = ""
Columns("C").Replace what:=i, replacement:=k, lookat:=xlPart,
MatchCase:=False
End Sub
Функция Excel, которую я имею для этого =REPLACE(C1,1,FIND("-",C1),"")
. Это работает, но я хочу что-то в VBA.
Комментарии:
1. Используйте InStr, чтобы найти первое вхождение ‘-‘, а затем верните все после этого, используя Mid.
Ответ №1:
Это будет работать в столбце C:
Sub my_sub()
Dim c As Range
For Each c In Intersect(ActiveSheet.UsedRange, ActiveSheet.Range("C:C"))
c = Trim(Mid(c, InStr(c, "-") 1))
Next
End Sub
Ответ №2:
Вы хотите найти местоположение первого «-»
location = instr(1, cells(iRow,3), "-", vbTextCompare)
Используя тот факт, что instr возвращает только первую запись…
Затем обрежьте ячейку вправо, используя это местоположение
if location > 0 then
'Found a "-" within this cell
cells(iRow,3) = right(cells(iRow,3), len(cells(iRow,3)-location)
end if
Очевидно, что iRows — это просто мой итератор по строкам в ваших данных. Определите это так, как вы хотите.
Ответ №3:
Вы могли бы расставить точки за один раз, используя Evaluate .
With Range("C1", Range("C" amp; Rows.Count).End(xlUp))
.Value = Evaluate("MID(" amp; .Address amp; ", FIND(""-"", " amp; .Address amp; ") 1, LEN(" amp; .Address amp; "))")
End With
Ответ №4:
Пожалуйста, попробуйте следующую функцию:
Function replaceFirstGroup(x As String) As String
Dim arr
arr = Split(x, " - ")
arr(0) = "###$"
replaceFirstGroup = Join(Filter(arr, "###$", False), " - ")
End Function
Его можно вызвать / протестировать таким образом:
Sub testReplaceFirstGroup()
Dim x As String
x = "123 - abc - xyz"
MsgBox replaceFirstGroup(x)
End Sub
Чтобы обработать столбец C: C, используя вышеуказанную функцию, пожалуйста, используйте следующий код. Это должно быть очень быстро, используя массив, работая в памяти и сразу отбрасывая результат обработки:
Sub ProcessCCColumn()
Dim sh As Worksheet, lastR As Long, arr, i As Long
Set sh = ActiveSheet
lastR = sh.Range("C" amp; sh.rows.count).End(xlUp).row
arr = sh.Range("C2:C" amp; lastR).value
For i = 1 To UBound(arr)
arr(i, 1) = replaceFirstGroup(CStr(arr(i, 1)))
Next i
sh.Range("C2").Resize(UBound(arr), 1).value = arr
End Sub