2015-03-20 3 views
0

Мне нужно удалить последние последние два символа всех ячеек, найденных на листе с именем Target с именем столбца Order (столбец BD).Удалите последние два символа в ячейке

Этот макрос ниже выглядел бы в строке 1 Рабочий лист Цель слова orders. Затем он удалил бы последние два символа (строки).

Однако, поскольку я новичок и получил эти макросы из двух разных источников, я, вероятно, испортил назначение переменных.

Sub RemoveOrdersTT() 
    Dim ws As Worksheet 
    Dim rng As Range 
    Dim lastCol As Long 
    Dim i As Long 

    Set ws = Worksheets("Target") 
    With ws 
    lastCol = .UsedRange.Columns.Count 
     For i = 1 To lastCol 
     If InStr(1, UCase(.Cells(1, i).Value), "Orders") > 0 Then 
     .Cells(1, i).Value = Left(.Cells(1, i).Value, Len(.Cells(1, i).Value) - 2) 
     End If 
     Next i 
    End With 
End Sub 

код, который будет смотреть на листе Target и столбец BD, начиная со строки 2 или исправления в мой код будет высоко ценится.

+0

Я боюсь, последние [два символа в ячейке] (HTTPS: //www.youtube.com/watch?v=wrPaVWAkJZU) уже удалены от нас. – pnuts

+0

Я не уверен, что вы имеете в виду. В столбце BD «Заказы» каждый номер заказа будет иметь TT в конце (например, строка 2: 123TT, строка 3: 345TT). Я пытаюсь удалить TT. – user4581436

+0

Извините, я не имел в виду, что мой комментарий выше, чтобы его воспринимали всерьез - это ссылка на знаменитую пару комиков и не имеет никакого отношения к вашему вопросу, кроме совпадения формулировок. – pnuts

ответ

1

Изменение внутренней, если:

If InStr(1, UCase(.Cells(1, i).Value), "ORDER") > 0 Then 
    .cells(1,i).value = left(.cells(1,i).value, Len(.cells(1,i).value) -2) 
End If 
  1. InStr требует 3 параметров (плюс некоторые дополнительные из них), вы пропали без вести первый PARM рассказывал ему, где начать смотреть
  2. В If заявлении, InStr вернет позицию или 0, поэтому достаточно провести тестирование для > 0, нет необходимости в <>, хотя это будет работать, просто не нужно
  3. Удалить 2-й вызов UCase() в if сама заявка, нет необходимости в UCase фиксированной строке, просто укажите ее в верхнем регистре.
  4. Не нужно возиться с попыткой создания другого объекта диапазона и его изменения, у вас уже есть необходимая ячейка.

также:

Предполагая, что ваши данные прямоугольной (т.е. не имеют каких-либо столбцов без заголовков, которые вы не хотите, чтобы искали):

LastCol = .UsedRange.Columns.Count 

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

Полный код

Sub RemoveOrdersTT() 
    Dim ws As Worksheet 
    Dim rng As Range 
    Dim lastCol As Long 
    Dim i As Long 
    Dim r as long 

    Set ws = Worksheets("Target") 
    With ws 
    lastCol = .UsedRange.Columns.Count 
     For i = 1 To lastCol 
     If InStr(1, UCase(.Cells(1, i).Value), "Orders") > 0 Then 
     for r = 2 to .usedRange.Rows.Count 
      .Cells(r, i).Value = Left(.Cells(r, i).Value, Len(.Cells(r,i).Value) - 2) 
     next 
     End If 
     Next i 
    End With 
End Sub 

бы добавить внутреннюю петлю For r... на самом деле получить его, чтобы пересечь строки в этом столбце

+0

Я опубликовал изменения, предложенные вами в исходном сообщении. Я запустил этот код, и он однажды снял два символа из имени столбца (найденного в строке 1). Он не удалял ничего из клеток под ним. Я снова попробовал код и ничего не сделал. – user4581436

+0

Я получаю Invalid вызов или аргумент процедуры в строке 14 или '.Cells (r, i) .Value = Left (.Cells (r, i) .Value, Len (.Cells (r, i) .Value) - 2) '. Однако это работает! Какие-либо предложения.Я собирался поставить 'On Error Resume Next', но я не уверен, что это то, что нам нужно. – user4581436