Emm*_*myS 6 vba worksheet-function microsoft-excel
我是一名会多种语言的程序员,但不知为何我从未学过 Excel 宏或公式语言。我相信一定有一种简单的方法可以做到这一点,但我很难过。
我有一列文件名,如下所示:
/home/www/shoppermarketexpo/dot/uploads/10DOT_33A_1275_1308304857_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_15G_1184_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_5A_1450_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_18A_1341_1308325044_2.jpg
Run Code Online (Sandbox Code Playgroud)
我需要做的是只返回文件名,根据下划线分成几个部分。如果这需要多个步骤,我很好 - 即公式 1 返回一列10DOT_33A_1275_1308304857,然后公式 2 使用该结果返回第二列,10DOT_33A_1275依此类推。我希望有一个类似于 PHP 的爆炸的函数,您可以在其中获取一个字符串并根据分隔符(在本例中为下划线)返回一个数组。我猜这在公式中是不可能的;我对 VBA 没问题,尽管我使用的是 Mac 并且不知道它是否对我可用。
我知道 MID、LEFT 和 RIGHT,但所有这些都取决于您知道要返回的字符数,在这种情况下我不知道。它因行而异;唯一有效的标准是在下划线处将文件名拆分为多列。
这可能吗?
这是一个基于 VBA 的解决方案。请注意,像这样循环遍历单元格效率不高。如果您有很多行(比如超过 10,000 行),还有更好的方法
选择要处理的范围并运行此
Sub SplitText()
Dim rng As Range, rw As Range
Dim cl As Range
Dim i As Long, j As Long, k As Long
Dim str As String
If Not TypeName(Selection) = "Range" Then Exit Sub
Set rng = Selection
For Each rw In rng.Rows
str = rw.Cells(1, 1)
str = Mid(str, InStrRev(str, "/") + 1)
str = Left(str, InStr(str, "."))
j = InStr(str, "_")
k = 2
Do While j > 0
rw.Cells(1, k) = Left(str, j - 1)
str = Mid(str, j + 1)
j = InStr(str, "_")
k = k + 1
Loop
rw.Cells(1, k) = str
Next
End Sub
Run Code Online (Sandbox Code Playgroud)
这是一个基于公式的解决方案:
假设数据在A列,从第2行开始
,最多返回5条(可以调整以应对更多)
并且字符串不包含| 或@(如果有,请使用其他字符)
单元格 B2,获取文件名
=RIGHT(A2,LEN(A2)-FIND("|",SUBSTITUTE(A2,"/","|",LEN(A2)-LEN(SUBSTITUTE(A2,"/","")))))
单元格 C2,删除 .extension
=LEFT(B2,FIND(".",B2)-1)
单元格 D2:H2 作为数组公式,将连续项用 | 括起来 和 @
=SUBSTITUTE(SUBSTITUTE("_"&C2&"_","_","|",{1,2,3,4,5}),"_","@",{1,2,3,4,5})
单元格I2,然后将I2复制到J2:L2:结果
=IFERROR(MID(D2,FIND("|",D2)+1,FIND("@",D2)-FIND("|",D2)-1),"")
您可以使用“数据”菜单下的 Excel 的“文本到列”功能。
这将需要多次传递,但您可以在没有公式或 VBA 的情况下完成。
您可以指定自己的分隔符。所以你可以选择.分离扩展名,然后/拆分出目录结构。然后您可以选择_拆分文件名。

注意:您可以设置不同的列,以Text避免 Excel 将它们视为数字,或者设置其他列,Do not import (skip)以便将它们删除。