Barry有一个工作表,其中一列包含许多文件路径。他想要一种从每个路径中仅提取文件名(最后反斜杠右侧的部分)的方法。他想知道是否有一种无需使用“文本转列”功能的快速方法。

有几种不同的方法,具体取决于您是否要使用宏。

如果文件名长度相同,则只需使用RIGHT函数即可提取最后一个字符。 (此公式假定完整路径,文件名位于单元格A1中。)

=RIGHT(A1,11)

假定文件名始终为11个字符长,例如“ text001.txt”。如果每个实例中的文件名长度不同,则此方法将不起作用。相反,您可以尝试使用以下公式:

=MID(A1,FIND(CHAR(1),SUBSTITUTE(A1,"\",CHAR(1), LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))

请注意该公式两次使用SUBSTITUTE函数。在每种情况下,它都会用其他方式替换反斜杠(\)。第一次将它们全部替换为ASCII值1,第二次将其替换为空(空字符串),以便可以确定原始路径中有多少个反斜杠。 MID函数用于定位(在FIND和SUBSTITUTE函数的帮助下)路径中最后一个反斜杠的位置,并返回该点之后的所有内容。

如果您确定文件名的长度永远不会超过99个字符,则可以使用较短的公式:

=TRIM(RIGHT(SUBSTITUTE(A2,"\",REPT(" ",100)),99))

此公式将所有反斜杠替换为100个空格,从结果字符串中获取最右边的99个字符(该文件名将在其前面带有一串空格),然后修剪所有空格。

如果要使用宏,则可以创建一个宏,该宏将在路径中向后移动,直到找到最后一个反斜杠为止。然后,它在反斜杠之后返回所有内容。下面的示例从单元格B1开始,检查该单元格(单元格A1)右侧的所有内容,然后开始提取文件名。

|它将遍历A列中的所有单元格,并将文件名(如果有)放入B列。

Sub GetFileName1()

Dim Delimiter As String     Dim Target As String     Dim sFile As String     Dim J As Integer     Dim iDataLen As Integer

Delimiter = "\"

Range("B1").Select     Do While ActiveCell.Offset(0, -1).Value <> ""

Target = ActiveCell.Offset(0, -1).Value         iDataLen = Len(Target)

sFile = "Delimiter Not Found"

For J = iDataLen To 2 Step -1             If Mid(Target, J, 1) = Delimiter Then                 sFile = Right(Target, iDataLen - J)

Exit For             End If         Next J         ActiveCell.Formula = sFile         ActiveCell.Offset(1, 0).Select     Loop End Sub

您还可以使用更短版本的宏,前提是您可以使用拆分功能。 Excel 2000随附的VBA版本中引入了此功能,它将根据您指定的分隔符将字符串分开,并将零件填充到数组中。本示例显示了作为用户定义函数实现的解决方案。

Function GetFileName2(File_Path) As String     Dim Parts

Parts = Split(File_Path, Application.PathSeparator)

GetFileName2 = Parts(UBound(Parts))

End Function

在这种用法中,Split函数将分隔符用于运行Excel的系统的任何分隔符。结果数组的最后一个元素(由UBound函数确定)包含原始路径中位于最后一个路径分隔符右侧的部分,即文件名。要使用该功能,请将这样的公式放在单元格中:

=GetFileName2(A1)

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(7333)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: