Удаление всех данных до первого ‘-‘ в столбце в VBA

#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