2013-09-26 3 views
3

Я супер новый VBA, но я работал с ним много прошедших пару дней. У меня много книг с аналогичной структурой, которые имеют более 50 листов. Я продолжаю зависеть от того, что мой Excel Macro не распространяется на всю книгу.Расширение кода VBA для удаления символов для определенных ячеек для всей рабочей книги

Мне нужно удалить символы слева и справа от двух столбцов со строковыми значениями. Вот код:

Sub Trim() 

Dim c As Range 

For Each c In Range("B5", Range("B" & 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 Range("C5", Range("C" & Rows.Count).End(xlUp)) 
c.Value = Left(c.Value, Len(c.Value) - 16) 

Next c 

End Sub 

Это делает то, что я хочу, но только для моей активной книги. Я пробовал несколько вещей, чтобы попытаться связать его со всеми листами, но я не добился успеха.

Я очень благодарен за помощь!

+1

Вы имеете в виду * только для активной рабочей таблицы * :) –

ответ

0

непроверенные, но это должно быть в порядке

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))

код не через ошибку .. Но в тех случаях, было бы бросить ошибку раньше, теперь он устранит весь слово (т. е. вернуть пустую строку). Я не уверен, хотя это желаемое поведение ... но дайте мне знать! :)

+0

Спасибо, но - я действительно пробовал этот точный код, и по какой-то причине он не работает. –

+1

Вы вызываете другую книгу из той, где находится подпрограмма? Вы используете wb везде (I.e., все строки, диапазон и т. Д. Должны быть добавлены .wb). Что именно происходит? Выдает ли ошибка? – Ioannis

+0

На самом деле я не заметил, что мой ответ идентичен. Мы оба повторно используем один и тот же код из OP. Поэтому трудно быть НЕ идентичным. В любом случае я удалил свой ответ, если это заставляет вас обижаться – sam092

0

Excel действительно лучше работает как инструмент рабочей книги с формулами.

С риском не совсем ответить на вопрос, как насчет создания новой книги с формулами, которые извлекают требуемую информацию из оригинальных книг. Затем, используя формулу, такие как

=LEFT(INDIRECT("[Workbook]Sheet1!B1"), LEN(INDIRECT("[Workbook]Sheet1!B1"))-7) 

где вся формула ссылка может быть вычислено в строке аргумента, вы извлечь любую клетку, а затем обработать ее по мере необходимости.

В качестве полностью описательного решения, хотя производительность может быть аналогична решению VBA, оно не требует знания другого языка и гораздо проще отлаживать.

Смежные вопросы