如何规范化范围中列出的文件名

时间:2012-06-27 19:34:48

标签: excel vba excel-vba format excel-2010

我在电子表格中有一个“Smith,J。010112.pdf”形式的文件名列表。但是,它们的格式为“010112.pdf”,“01.01.12.pdf”和“1.01.2012.pdf”。我怎么能把它们改成一种格式“010112.pdf”?

6 个答案:

答案 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命令和公式的简单四步法的屏幕截图,如对回答帖子的评论中所建议的(稍作修改)......

enter image description here

答案 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