2016-09-08 3 views
0

У меня есть электронная таблица с большим количеством путей к файлам в них. Я использую следующую формулу, чтобы заменить последнее вхождение «\» в каждой ячейке столбца. Как я могу изменить это на макрос, поэтому мне не нужно вставлять и перетаскивать каждый столбец.Заменить Последнее появление символа

=SUBSTITUTE(K2,"\","?",LEN(K2)-LEN(SUBSTITUTE(K2,"\",""))) 

Я попытался записать макрос, и это работает, но только на одной клетке, и только, если активная ячейка находится в колонке O

Sub Macro4() 
ActiveCell.FormulaR1C1 = _ 
    "=SUBSTITUTE(RC[-4],""\"",""?"",LEN(RC[-4])-LEN(SUBSTITUTE(RC[-4],""\"","""")))" 
Range("O2").Select 
End Sub 

Мне нужно, чтобы это поместить значение в столбце O начиная с O2 для каждого непустого K, начинающегося с K2, независимо от того, что представляет собой активная ячейка.

+0

Почему бы не определить диапазон, и сделать цикл для каждой ячейки? – Tyeler

+0

Найти последнюю строку в K поместите ее в переменную типа 'lstRw', тогда вы можете просто:« Диапазон («O2: O» и lstrw) .FormulaR1C1 = _ »= SUBSTITUTE (RC [-4]," "\ "", ""? "", LEN (RC [-4]) - LEN (SUBSTITUTE (RC [-4], "" \ "", "" ""))) "' для того, чтобы найти последнюю строку см. здесь: http://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba –

+1

Спасибо, дайте ему попробовать и опубликовать мои результаты. – Nolemonkey

ответ

1

Вот альтернативный подход:

Sub LastSlash() 
    Dim N As Long, i As Long, rng As Range, r As Range 
    Dim rc As Long, L As Long, j As Long 

    rc = Rows.Count 
    Set rng = Intersect(ActiveSheet.UsedRange, Range("K2:K" & rc)) 
    N = Cells(rc, "K").End(xlUp).Row 

    For Each r In rng 
     s = r.Value 
     L = Len(s) 
     If InStr(1, s, "\") > 0 Then 
      For j = L To 1 Step -1 
       If Mid(s, j, 1) = "\" Then 
        Mid(s, j, 1) = "?" 
        Exit For 
       End If 
      Next j 
     End If 
     r.Offset(0, 4).Value = s 
    Next r 
End Sub 

enter image description here

+0

Вы можете сократить это немного - измените переменную 'L' на' L = InStrRev (s, "\") ', замените блок' If ... End If' на 'If L> 0 Then Mid (s, L, 1) = "?" ' –

+0

@ DarrenBartrup-Cook Спасибо, но я боюсь, что ** L ** найдет ** первый * * косая черта, а не ** последняя ** косая черта ............ –

+0

Это работало как шарм. Спасибо! – Nolemonkey

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