непроверенные, но это должно быть в порядке
Sub MyTrim()
' avoid Trim because it is a built-in function!
Dim c As Range, wb As Worksheet
For Each wb In ActiveWorkbook.WorkSheets
For Each c In wb.Range("B5", wb.Range("B" & wb.Rows.Count).End(xlUp))
c.Value = Left(c.Value, Len(c.Value) - 10)
c.Value = Right(c.Value, Len(c.Value) - 7)
Next c
For Each c In wb.Range("C5", wb.Range("C" & wb.Rows.Count).End(xlUp))
c.Value = Left(c.Value, Len(c.Value) - 16)
Next c
Next wb
End Sub
EDIT (на основе второго комментарий ниже)
выше кода (также оригинал размещен) работает только тогда, когда второй аргумент Left
и Right
неотрицателен. Если есть отрицательный аргумент, возникает ошибка, такая как описанная вами. Я не уверен, что именно вы хотели бы извлечь, но, скорее всего Left
и Right
не делать то, что вы хотели бы их сделать ..
Пример:
если c.Value = "a string somewhat long"
затем
Left(c.Value), Len(c.value)-10)="a string som"
а затем
Right(c.Value, Len(c.Value)-7) = "g som"
Right
часть действует на "a string som"
.
Вы можете фактически остановить код непосредственно перед его терпит неудачу, и проверить, если он делает то, что вы хотите, следующим образом:
выше линии c.Value = Left(c.Value, Len(c.Value) - 10)
добавьте строку debug.Assert Len(c.Value) >= 10
и выше линии c.Value = Right(c.Value, Len(c.Value) - 7)
добавить строку debug.Assert Len(c.Value) >= 7
Вы можете думать об этом как о выражении, которое говорит: «Убедитесь, что длина e string не менее 10 и остановится, если это неверно. Это остановит выполнение кода, если это неверно. Затем вы можете перейти в окно Immediate (либо Ctrl + G, либо View-> Immediate Window) и введите ? c.Value
. Это отобразит значение c
. Наконец, когда код останавливается, линия, на которой он останавливается, отмечена желтым цветом. Если вы хотите выполнить следующую строку кода, нажмите F8
. Каждый раз, когда вы нажимаете F8
, выполняется одна строка кода.
В качестве последнего наблюдения, если вы измените c.Value = Left(c.Value, Len(c.Value) - 10)
с
c.Value = Left(c.Value, IIf(Len(c.Value) - 10 >= 0, Len(c.Value) - 10, 0))
код не через ошибку .. Но в тех случаях, было бы бросить ошибку раньше, теперь он устранит весь слово (т. е. вернуть пустую строку). Я не уверен, хотя это желаемое поведение ... но дайте мне знать! :)
Вы имеете в виду * только для активной рабочей таблицы * :) –