我有一个从文件夹中读取文件名的宏。问题是当文件名串联时,如A1,A2 ...... A200.pdf,如下图所示:
然后在Excel中读取A1,A10,A100,A101 ...... A109,A11,A110 ..... A119,A20,如下图所示:
如何对Excel进行排序以使Excel中的值与文件夹文件名相同,或者我可以在Excel中对其进行排序?
答案 0 :(得分:2)
您可以使用帮助列在Excel中对此进行排序。创建一个新列并计算“= LEN(A1)”中文件名的长度。然后使用两级排序来对文件名进行排序。数据 - >排序:使用第一级中的长度和第二级中的文件名。
答案 1 :(得分:1)
这是因为在这两种情况下(Windows资源管理器和Excel)Refer to this article中有不同的排序算法,如果你想了解的话。
要解决您的问题,其中一种方法是仅拉出不同单元格(例如B列)中文件名的数字部分,然后根据这些数字进行排序。
如果我可以假设文件名的模式是AXXX.pdf,即一个字母A,则为数字,文件扩展名为4个字符。您可以使用此功能
= VALUE(MID(A1,2,LEN(A1)-5))
这可以通过从字符串之间拉出一些字符来实现。根据假设,数字从第二个位置开始,这就是为什么第二个参数是2.然后决定你拉出多少个字符,你知道所有字符除了' A' (1个字符)和' .pdf' (4个字符)编号。因此,取整个名称的长度减少5个字符。你得到了你可以分类的编号部分。
答案 2 :(得分:1)
另一种选择,您可以使用RegEx
对象提取数字数字"捕获"在文件名中。
Option Explicit
Sub SortFileNames()
Dim i As Long
With Sheets("Sheet1") ' replaces "Sheet1| with your sheet's name
For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
.Range("B" & i).Value = RetractNumberwithRegex(.Range("A" & i)) ' call the Regex function
Next i
End With
End Sub
'========================================================================
Function RetractNumberwithRegex(Rng As Range) As String
' function uses the Regex object to substract the Numeric values inside
Dim Reg1 As Object
Dim Matches As Object
Set Reg1 = CreateObject("vbscript.regexp")
With Reg1
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "[0-9]{1,20}" ' any size numeric string (up to 20 digits length)
End With
Set Matches = Reg1.Execute(Rng.Value2)
If Matches.Count <> 0 Then
RetractNumberwithRegex = Matches.Item(0)
End If
End Function
答案 3 :(得分:0)
最好的方法是将Excel列表中的文件名更改为前导零。而不是A19,将文件称为A019,它将正确排序。在辅助列中使用此公式转换文件名。
=Left($A2, 1) & Right("000" & Mid($A2, 2, 3), 3)
请注意,3个零和3个字符串长度都相互关联。要创建4位数的固定长度数,只需使用4个零,并将两个字符串长度增加到4。
将公式从第2行复制到结尾。复制帮助器列,粘贴Values
到位,当一切都很完美时,用帮助器替换原始列。
为了容纳数字后面的固定位数,可以调整上述公式。下面的公式将容纳4个额外字符,这些字符跟随数字,例如&#34; .pdf&#34; (包括期间)。
=Left($A2, 1) & Right("000" & Mid($A2, 2, 7), 7)