Лучший способ добавить элементы в коллекцию

У меня есть в столбце C, список имен файлов в численном порядке (уже отсортировано). Я начинаю с того, что перебираю папку, в которой находятся файлы, и добавляет их в коллекцию temp.

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, я добавляю его в отдельную коллекцию (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 в папке, а затем добавить его в коллекцию.

Есть один небольшой криволинейный шар. Окончательная коллекция должна быть отсортирована. Каков хороший способ проверить добавление элементов во время цикла, чтобы отсортировать его по мере его поступления? Или я должен сделать это на отдельном шаге?

Имена файлов начинаются с «C» или «S», и мне нужно отсортировать их по числу. Так что это должно закончиться так:

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 имеет метод .Sort() (если он вам нужен) и метод .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] Определите диапазон столбцов, создайте массив этого размера, поместите диапазон данных в массив.

[2] Вложенная петля затем заботится обо всем остальном. Для каждого имени файла пройдите через свой массивColumnList (также можно использовать vlookup), пока он не найдет совпадение, или нет. MAtches идут в конечном массиве.

 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) массив с вашими именами файлов. Вы можете найти простые подсистемы сортировки массивов с поиском google.

Вам не понадобится вторая коллекция, если вы используете эту модификацию своего исходного кода:

 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 
  • Excel VBA Как Excel сортирует повторяющиеся значения?
  • Множественная сортировка с VBA
  • Сортировка по текстовому значению в VBA
  • Excel сортирует странную логику
  • Копирование значений из диапазона с добавлением заголовка и сортировка по размеру в Excel с помощью vba
  • Как сортировать значения строк в excel и отображать соответствующие имена столбцов в другом месте?
  • Сортировка листа excel путем динамического определения столбца ключа
  • Назначение номеров партий, специфичных для значения в excel, когда значения не всегда известны заранее
  • Сортировка столбцов с пробелами в Excel / Google Таблицах
  • Как отсортировать таблицу, используя подсписку критериев в excel
  • Добавление в строковый массив в алфавитном порядке
  • Interesting Posts

    как читать файл excel в Google App Engine

    Как вставить строку слева от цифр в Excel

    Excel VBA FormatCondiitons для нескольких условий

    Форматирование выводимых файлов Excel из Access с помощью VBA?

    Получение ошибки при попытке экспортировать таблицу в Excel из Angular 2, ERROR TypeError: __WEBPACK_IMPORTED_MODULE_4_file_saver__ не является функцией

    Объединение листов в один лист по горизонтали

    импортирование нескольких текстовых файлов в отдельные листы Excel в 1 книге Excel с использованием VBA

    вызовите RegQueryDWordValue, чтобы получить офисную версию Excel с помощью inno Setup installer

    Импорт Excel с Coldfusion – получение странного формата даты mm \ / dd \ / yyyy

    Excel для объединения книг, Runtime Error 1004

    Путь не распознается с переменными папками-VLOOKUP

    Экспорт Excel в SQL с помощью VBA

    Чтение и запись данных для Excel с помощью POI – Удаление исходных данных из Excel после записи новых данных

    Как игнорировать предупреждение «Несогласованная формула» в сгенерированном файле .xlsx с помощью python xlsxwriter?

    Поиск кода vba, который отключит синхронизацию OneDrive

    Давайте будем гением компьютера.