将项目添加到collections的最佳方法

我在C列中列出了按数字顺序(已sorting)的文件名。 我从循环所有文件所在的文件夹开始,并将其添加到临时集合中。

Do While file <> "" l = Left(file, 3) Length = Len(file) If (l = "C") And Length = 13 Then tempCol.Add file Debug.Print file Else GoTo none End If none: 'goto next file file = Dir Loop 

然后循环遍历C列的长度,并将每行(保存文件名)与temp集合中的项目进行比较。 如果在temp集合中findfilename,我将它添加到一个单独的集合(fCol)。

 For i = 17 To cccount cc = wsSum.Cells(i, 3).value For Each e In tempCol If "C" & cc = e Then fCol.Add e Debug.Print e End If Next e Next i 

这一切都很好,除了我觉得可以在一个循环/集合中完成。 我应该能够检查文件夹中是否存在列C中的文件名,然后将其添加到集合中。

有一个轻微的曲线球。 最后的集合必须进行sorting。 在循环中testing项目添加的好方法是什么? 或者我应该单独做这件事?

文件名以“C”或“S”开始,我需要按数字sorting。 所以它应该结束

S60100.XLSM C60100.XLSM S60270.XLSM C60270.XLSM C60275.XLSM S60275.XLSM S60280.XLSM C60280.XLSM S60285.XLSM C60285.XLSM S60290.XLSM C60290.XLSM C60295.XLSM S60295.XLSM C60300.XLSM S60500.XLSM C60500。 XLSM C60501.XLSM C60503.XLSM

编辑:我的错。 应该提到C列中的文件名只有数字! 我知道,很抱歉遗憾的是:/

编辑2:添加图片的样子 在这里输入图像说明

改用ArrayList 。 一个ArrayList对象有一个.Contains()方法(如果你需要的话)和一个.Sort()方法。

 Sub MacroMan() Dim arrayList As Object Dim WS As Object Dim tempFile As String Const searchFolder As String = "C:\Users\MacroMan\Folder\" '// Note trailing '\' Set arrayList = CreateObject("System.Collections.ArrayList") Set WS = CreateObject("WScript.Shell") For Each tempFile In Filter(Split(WS.Exec("CMD /C DIR """ & _ searchFolder & "*.*"" /B /A:-D").StdOut.ReadAll, vbCrLf), ".") If UCase(tempFile) Like "[CS][0-9][0-9][0-9][0-9][0-9][\.]XLSM" Then If Evaluate("=NOT(ISERROR(MATCH(" & Mid(tempFile, 2, 5) & ",C:C,0)))") Then arrayList.Add tempFile End If End If Next arrayList.Sort '// Print results ------- For Each x In arrayList Debug.Print CStr(x) Next '// --------------------- End Sub 

请改用数组。 然后你可以很容易地分类。 另外,数组比连续引用工作表范围要快得多。

这种方法的关键方面:

[1]定义你的列范围,创build一个这样大小的数组,把数据范围放到一个数组中。

[2]嵌套循环然后照顾其余的。 对于每个文件名,通过你的arrayColumnList循环(也可以使用vlookup),直到它find一个匹配,或不。 MAtches进入最后的arrays。

 Sub ArrayList() Dim i As Long, j As Long, k As Long Dim arrList As Variant arrList = Array() Dim lngFinalRow As Long Dim lngColumnNumber As Long '/ Used to define the range of your column data Dim strLeftCharacter As String Dim lngFileLength As Long Dim lngFilesFound As Long Dim arrColumnData As Variant arrColumnData = Array() Dim rngColumnData As Range '/ set rngColumnData = Range( etc.) ReDim arrColumnData(1 To rngColumnData.Rows.Count, 1 To 1) arrColumnData = rngColumnData '/ At this point you need to convert your numbers to strings with the filename Character. Like this: '/ for i = Lbound(array,1) to ubound(array,1) '/ array(i, 1) = "C" & Cstr(array(i,1)) '/ next i Dim bMatchFound As Boolean '/ define dir filepath lngFilesFound = 0 Do Until file = "" strLeftCharacter = Left(file, 1) '/ Don't know why you were using 3 when you're only checking for the first character? lngFileLength = Len(file) If strLeftCharacter = "C" And lngFileLength = 13 _ Then bMatchFound = False i = LBound(arrColumnData, 1) Do While bMatchFound = False And i <= UBound(arrColumnData, 1) If arrColumnData(i, 1) = file Then bMatchFound = True i = i + 1 Loop If bMatchFound = True _ Then lngFilesFound = lngFilesFound + 1 ReDim preserve arrList(1 To lngFilesFound) arrList(lngFilesFound) = file Debug.Print file End If End If file = Dir Loop End Sub 

这将给你一个一维(IE列表)数组与您的文件名。 您可以使用Googlesearchfind简单的数组sorting子目录。

如果您使用此初始代码的修改,则不需要第二个集合:

 Sub UsingOnlyOneCollection() Do While file <> "" l = Left(file, 3) Length = Len(file) If (l = "C") And Length = 13 Then If Evaluate("IFERROR(MATCH(""" & file & """,C:C,),)") Then '<--- I added this tempCol.Add file Debug.Print file End If Else GoTo none End If none: 'goto next file file = Dir Loop End Sub