2016-09-08 83 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'这样的变量,那么你可以简单地:'Range(“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 L> 0'代替你的'If ... End If'块然后Mid(s, L,1)=“?”' –

+0

@ DarrenBartrup-Cook谢谢...................但我担心** L **会找到**第一个* *斜线而不是**最后**斜线............ –

+0

这就像一个魅力。谢谢! – Nolemonkey

相关问题