Страницы: 1
RSS
Как открывать файлы поочередно по возрастанию имени?
 
Помогите, как заставить открывать файлы поочередно по возростанию имени?[spoiler][/spoiler]
задача кода такова - открыть файл с именем П-1-КБ2.xls, перенести данные в файл КБ3.xls, закрыть П-1-КБ2.xls, открыть следующий файл П-2-КБ2.xls и по кругу.
проблема в том, что excel открывает файлы не по очереди а хаотично - П-1-КБ2.xls, П-100-КБ2.xls, П-101-КБ2.xls, П-2-КБ2.xls, П-200-КБ2.xls, П-3-КБ2.xls.
вот код и папку с файлами прикрепил. Помогите, уже мозги кипят, а понять как так получилось не могу.
я только учусь, не судите строго.
Код
Sub КБ3()
    Application.ScreenUpdating = False

    Set wb1 = Application.ActiveWorkbook
    
    Dim i As Integer
    i = 1
    
    Dim sFolder As String, sFiles As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    
    sFiles = Dir(sFolder & "*КБ2.xls")
    
    Do While sFiles <> ""
        Workbooks.Open sFolder & sFiles
        Set wb2 = Application.ActiveWorkbook
        
            wb1.Sheets(1).Cells(i, 1) = wb2.Sheets(1).Cells(1, 1)
            wb1.Sheets(1).Cells(i, 2) = wb2.Sheets(1).Cells(1, 2)
            
            i = i + 1
            
            wb2.Activate
        ActiveWorkbook.Close False
        sFiles = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
папку с файлами прикрепил
 
Не хаотично, а в соответствии с порядком сортировки файлов средствами Windows.
Не нравится - создайте свой список, и открывайте из него.
Изменено: RAN - 27.04.2016 22:41:15
 
подтолкните, хоть в какую сторону смотреть. где почитать как создавать списки?
 
Цитата
Zenya написал: хоть в какую сторону смотреть.
Переименовать файлы. Вместо П-1-КБ2.xls дать имя П-001-КБ2.xls.
В принципе, если структура имен одинакова, то можно этим же макросом.
 
Решение в лоб:  в первый столбец имена файлов, потом их сортировка по алфавиту, потом их открытие и выборка данных
Код
Sub КБ3()
    Application.ScreenUpdating = False

    Set wb1 = Application.ActiveWorkbook
    
    Dim i As Integer
    i = 1
    
    Dim sFolder As String, sFiles As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    
    sFiles = Dir(sFolder & "*КБ2.xls")
    
    Do While sFiles <> ""
        Sheets(1).Cells(i, 1) = sFiles
        i = i + 1
        sFiles = Dir
    Loop
    ii = i - 1
    Range("A1:A" & ii).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom

    For i = 1 To ii
        sFiles = wb1.Sheets(1).Cells(i, 1)
        Workbooks.Open sFolder & sFiles
        Set wb2 = Application.ActiveWorkbook
            wb1.Sheets(1).Cells(i, 2) = wb2.Sheets(1).Cells(1, 1)
            wb1.Sheets(1).Cells(i, 3) = wb2.Sheets(1).Cells(1, 2)
            wb2.Activate
        ActiveWorkbook.Close False
    Next
    
    
    Application.ScreenUpdating = True
End Sub
Не стреляйте в тапера - он играет как может.
 
попробуйте вывести список названий файлов в массив, или на лист (кодом естественно или вручную) запустить сортировку а потом уже делать манипуляции согласно по списку
у меня простая версия Экселя, в ней нет кнопки "Прочитать мысли и сгенерировать файл пример"
 
готовое решение не решило проблему так как сортирует макрос опять не в том порядке, или я не понял как применять.
а вот переименование интересно.
а если структура имени сложнее -  11-П-1-КБ2.xls в одной папке, а в следующей 23-П-1-КБ2.xls, переименование сработает в обеих случаях?
Изменено: Zenya - 27.04.2016 23:28:07
 
Zenya,макрос сортирует именно по возрастанию, но как сказал Михаил С., дело в структуре имени, т.е если симена разного формата, то получится порядок 1,11,100,2,25,26,3,4... поэтому в именах файлов цифры нужно дополнить незначащими нулями - тогда сортировка сработает правильно
Не стреляйте в тапера - он играет как может.
 
Файлы открываются в алфавитном порядке. А по алфавиту П-100 меньше, чем П-2, но больше, чем П-002; вот и думайте, как вам переименовывать файлы.
Если  порядок открытия определяется после буквы П, то большой разницы нет.  
 
Можно попробовать расставить файлы по порядку как нужно, выделить все--Переименовать--Дать имя например "П-1-КБ2" или "КБ2-П-", а числа от 1 и далее присвоятся в порядке очередности. Получится П-1-КБ2(1).....П-1-КБ2 (100)  или КБ2-П- (1)......КБ2-П- (100).  Тогда программа будет забирать по порядку.
Изменено: gling - 27.04.2016 23:50:57
 
Цитата
gling написал:
Получится П-1-КБ2(1).....П-1-КБ2 (100) и тогда программа будет забирать по порядку.
ИМХО, .П-1-КБ2 (100) все равно будет меньше (откроется раньше), чем .П-1-КБ2 (2)...
 
А я думаю раз программа сама присвоила порядковый номер, то распознает правильно. Хотя??? Такие вещи сам не делал, нужно пробовать. Не получится, тогда искать другой способ.
Предполагаю, что распознается так по тому что, числа в начале и внутри текста воспринимаются как текст, а в конце, воспринимаются как числа. Это заметно при протягивании текста с числом в конце.
Изменено: gling - 28.04.2016 00:05:20
 
решил проблему кратковременно по корявому, но без написания кода. переименовал файлы в total comander. но на будущее хочу таки сделать программно.
 
Попробуйте примерно так,( без переименовывания)
Код
Sub КБ3()
    Application.ScreenUpdating = False
    Set wb1 = Application.ActiveWorkbook
    Dim i As Integer
    i = 1
    Dim sFolder As String, sFiles As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    Dim Num&, ii&, Nam$

    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    
    sFiles = Dir(sFolder & "*КБ2.xls")

    With CreateObject("Scripting.Dictionary")
        Do While sFiles <> ""
            Num = CDbl(Split(sFiles, "-")(1))
            .Item(Num) = sFolder & sFiles
             sFiles = Dir
        Loop

       For ii = 1 To .Count
            Num = WorksheetFunction.Small(.keys, ii)
            Nam = .Item(Num)
            Workbooks.Open Nam
            Set wb2 = Application.ActiveWorkbook

                wb1.Sheets(1).Cells(i, 1) = wb2.Sheets(1).Cells(1, 1)
                wb1.Sheets(1).Cells(i, 2) = wb2.Sheets(1).Cells(1, 2)

                i = i + 1

                wb2.Activate
            ActiveWorkbook.Close False
        Next
    End With
    Application.ScreenUpdating = True
End Sub
 
Программно:
1. получить список файлов
2. создать двумерный массив, в один  столбец поместить этот список, во второй сгенерить имена в нужном для сортировки виде
3. отсортировать массив по этому сгенерированному столбцу
4. циклом по сортированному массиву открывать файлы.
 
еще как вариант не вынимать названия всех файов а проверять их наличие по порядку, но это будет долoще
Код
for x =1 to 1000
 файл = х & "-КБ2.xls*"
   On Error Resume Next
   Проверка  = Dir(fname) <> vbNullString
   If Err.Number <> 0 Then проверка = "существует"
   On Error GoTo 0
....и т.д.
Изменено: Фродо - 28.04.2016 09:25:58
у меня простая версия Экселя, в ней нет кнопки "Прочитать мысли и сгенерировать файл пример"
 
Получаете список файлов
Получение списка файлов в папке и подпапках средствами VBA
Умно сортируете
"Умная" сортировка диапазонов строк
 
Сортировка двумерного массива
Код
Sub tt()
    Dim a()
    a = Sheets(1).[a1].CurrentRegion.Value
    uSort a, 3
    Sheets(1).[e1].Resize(UBound(a, 1), UBound(a, 2)) = a
End Sub



Private Sub uSort(ByRef x(), n&)
' uSort a, 3 - сортировать массив по 3-му столбцу
    Dim v, u&, d&, f%, st&
    If IsArray(x) Then
        f = LBound(x): d = f
        For u = f + 1 To UBound(x)
            If x(u, n) < x(d, n) Then
                For st = LBound(x, 2) To UBound(x, 2)
                    v = x(d, st): x(d, st) = x(u, st): x(u, st) = v
                Next
                u = d - 1: d = u - 1: If u < f Then d = u: u = f
            End If
            d = d + 1
        Next
    End If
End Sub
 
интересная реализация
Изменено: Михаил И. - 08.04.2020 14:33:13
 
Такой вариант с сортировкой на листе
Код
Sub qwer()
Dim FSO As Object, oFile As Object
Dim wbOpen As Workbook, arr(), x As Integer
Set FSO = CreateObject("Scripting.FileSystemObject")
ReDim arr(1 To FSO.GetFolder(ThisWorkbook.Path & "\").Files.Count, 1 To 2)
For Each oFile In FSO.GetFolder(ThisWorkbook.Path & "\").Files
    If oFile.Name <> ThisWorkbook.Name Then
        x = x + 1
        arr(x, 1) = oFile.Path
        arr(x, 2) = Split(Split(FSO.GetFileName(oFile), "-КБ")(0), "П-")(1)
    End If
Next oFile
With Range("A1").Resize(x, 2)
    .Value = arr
    Erase arr
    .Sort Range("B1"), xlAscending
    arr = .Value
    .ClearContents
End With
For x = 1 To UBound(arr, 1)
    Set wbOpen = Workbooks.Open(arr(x, 1))
    '...
    wbOpen.Close False
Next x
End Sub
Изменено: Dmitriy XM - 04.04.2020 21:37:30
Страницы: 1
Наверх