我在电子表格中有一个“Smith,J。010112.pdf”形式的文件名列表。但是,它们的格式为“010112.pdf”,“01.01.12.pdf”和“1.01.2012.pdf”。我怎么能把它们改成一种格式“010112.pdf”?
答案 0 :(得分:26)
我个人讨厌使用工作表函数可以工作的VBA,所以我已经找到了一种方法来处理工作表函数。虽然你可以将这一切都塞进一个单元格中,但我已经将它分解为单独列中的许多独立步骤,这样你就可以逐步了解它是如何工作的。
为简单起见,我假设你的文件名是A1
B1 = LEN(A1)
确定文件名的长度
C1 = SUBSTITUTE(A1,“”,“”)
用空格替换空格
D1 = LEN(C1)
如果用空格
E1 = B1-D1
确定有多少空格
F1 = SUBSTITUTE(A1,“”,CHAR(8),E1)
使用文件名中不能出现的特殊字符替换最后一个空格
G1 = SEARCH(CHAR(8),F1)
找到特殊字符。现在我们知道最后一个空格在哪里
H1 = LEFT(A1,G1-1)
剥离最后一个空格之前的所有内容
I1 = MID(A1,G1 + 1,255)
剥离最后一个空格后的所有内容
J1 = FIND(“。”,I1)
找到第一个点
K1 = FIND(“。”,I1,J1 + 1)
找到第二个点
L1 = FIND(“。”,I1,K1 + 1)
找到第三个点
M1 = MID(I1,1,J1-1)
找到第一个号码
N1 = MID(I1,J1 + 1,K1-J1-1)
找到第二个号码
O1 = MID(I1,K1 + 1,L1-K1-1)
找到第三个号码
P1 = TEXT(M1,“00”)
填充第一个号码
Q1 = TEXT(N1,“00”)
填充第二个号码
R1 = TEXT(O1,“00”)
填充第三个数字
S1 = IF(ISERR(K1),M1,P1& Q1& R1)
将数字放在一起
T1 = H1&“”& S1&“。pdf”
把它们放在一起
这有点乱,因为Excel在20多年内没有添加一个新的字符串操作函数,所以应该很容易(比如“查找最后一个空格”)需要严格的诡计。
答案 1 :(得分:7)
以下是基于Excel命令和公式的简单四步法的屏幕截图,如对回答帖子的评论中所建议的(稍作修改)......
答案 2 :(得分:6)
以下此功能有效。我假设日期是ddmmyy
格式,但如果它是mmddyy
则适当调整 - 我无法从您的示例中看出来。
Function FormatThis(str As String) As String
Dim strDate As String
Dim iDateStart As Long
Dim iDateEnd As Long
Dim temp As Variant
' Pick out the date part
iDateStart = GetFirstNumPosition(str, False)
iDateEnd = GetFirstNumPosition(str, True)
strDate = Mid(str, iDateStart, iDateEnd - iDateStart + 1)
If InStr(strDate, ".") <> 0 Then
' Deal with the dot delimiters in the date
temp = Split(strDate, ".")
strDate = Format(DateSerial( _
CInt(temp(2)), CInt(temp(1)), CInt(temp(0))), "ddmmyy")
Else
' No dot delimiters... assume date is already formatted as ddmmyy
' Do nothing
End If
' Piece it together
FormatThis = Left(str, iDateStart - 1) _
& strDate & Right(str, Len(str) - iDateEnd)
End Function
这使用以下辅助函数:
Function GetFirstNumPosition(str As String, startFromRight As Boolean) As Long
Dim i As Long
Dim startIndex As Long
Dim endIndex As Long
Dim indexStep As Integer
If startFromRight Then
startIndex = Len(str)
endIndex = 1
indexStep = -1
Else
startIndex = 1
endIndex = Len(str)
indexStep = 1
End If
For i = startIndex To endIndex Step indexStep
If Mid(str, i, 1) Like "[0-9]" Then
GetFirstNumPosition = i
Exit For
End If
Next i
End Function
测试:
Sub tester()
MsgBox FormatThis("Smith, J. 01.03.12.pdf")
MsgBox FormatThis("Smith, J. 010312.pdf")
MsgBox FormatThis("Smith, J. 1.03.12.pdf")
MsgBox FormatThis("Smith, J. 1.3.12.pdf")
End Sub
他们全都返回"Smith, J. 010312.pdf"
。
答案 3 :(得分:2)
您不需要VBA。首先用“。”替换“。”s:
=SUBSTITUTE(A1,".","")
这会将“.PDF”改为“PDF”,所以让我们把它放回去:
=SUBSTITUTE(SUBSTITUTE(A1,".",""),"pdf",".pdf")
答案 4 :(得分:1)
正如@ Jean-FrançoisCorbett所提到的,这对"Smith, J. 1.01.12.pdf"
不起作用。我没有完全改写,而是推荐他的解决方案!
Option Explicit
Function ExtractNumerals(Original As String) As String
'Pass everything up to and including ".pdf", then concatenate the result of this function with ".pdf".
'This will not return the ".pdf" if passed, which is generally not my ideal solution, but it's a simpler form that still should get the job done.
'If you have varying extensions, then look at the code of the test sub as a guide for how to compensate for the truncation this function creates.
Dim i As Integer
Dim bFoundFirstNum As Boolean
For i = 1 To Len(Original)
If IsNumeric(Mid(Original, i, 1)) Then
bFoundFirstNum = True
ExtractNumerals = ExtractNumerals & Mid(Original, i, 1)
ElseIf Not bFoundFirstNum Then
ExtractNumerals = ExtractNumerals & Mid(Original, i, 1)
End If
Next i
End Function
我将它用作测试用例,但未正确覆盖所有示例:
Sub test()
MsgBox ExtractNumerals("Smith, J. 010112.pdf") & ".pdf"
End Sub
答案 5 :(得分:1)
得到了什么?将数据存入文本文件,
awk -F'.' '{ if(/[0-9]+\.[0-9]+\.[0-9]+/) printf("%s., %02d%02d%02d.pdf\n", $1, $2, $3, length($4) > 2 ? substr($4,3,2) : $4); else print $0; }' your_text_file
假设数据与您描述的完全一致,例如,
Smith,J。010112.pdf
Mit,H。01.02.12.pdf
Excel,M。8.1.1989.pdf
Lec,X。06.28.2012.pdf