Страницы: 1
RSS
Помогите оформить в коде, Задача прочитать файлы из папки и получить файл отчет содержащий часть имени файла и значения первых 2х строк из из этого файла.
 
Всем доброго дня. Примерно представляю как это сделать но не могу оформить в коде. Те описания которые нашел мне не сильно помогают т.к. используют обьекты о которых я мало что знаю.
Идея следующая:
на активном листе в ячейке (2,1) путь к папке с файлами
в этой папке создается файл с именем "отчет"
Цикл на чтение файлов из папки открываем
 В файл отчет пишется имя файла из папки (часть которая идет после символа _
     открываем файл имя которого написали
 Следующей строкой в отчет пишем первую Ячейку (1,1) из открытого файла
 Следующей строкой в отчет пишем первую Ячейку (1,2) из открытого файла
     закрываем открытый файл
 следующая строка в файле отчет пропускается
Переходим к следующему файлу в папке.
По окончании цикла чтения файлов в папке сохраняем файл "отчет"


Понимаю что опять написал сумбурно. Но оформить кодом быстро боюсь не смогу. Помогите люди добрые.
 
Добрый.Сделано в темную.
Скрытый текст
Изменено: doober - 17.11.2022 12:10:14
 
doober, Огромное спасибо. Все работает.
 
doober, А можно вопрос:
Если мне нужно выбрать только файлы название которых содержит определенный текст (например 11223333) в каком месте кода вносить изменения? Я просто не совсем разобрался с тем кодом который вы предложили. Как я понял там просто последовательно считываются файлы.
 
Код
If InStr(1, fil.Name, ".xls", vbTextCompare) > 0 And InStr(1, fil.Name, "_", vbTextCompare) > 0  And InStr(1, fil.Name, "11223333", vbTextCompare) > 0 Then
 
Попробовал самостоятельно покопать код. Получилось не очень. Ошибка next при отсутствии For. помогите понять что не так то. или по этому вопросу лучше новую тему открывать?
Код
Sub Кнопка3_Щелчок()

  Dim Sh As Worksheet, Path, tdate, ftdate, ft As String, Sh1 As Worksheet, Arr(1 To 3, 1 To 1)
    Set Sh = ActiveSheet
    Path = Sh.Range("B1")
    tdate = Sh.Range("F1")
    If tdate = "" Then ftdate = Date Else ftdate = tdate
    Set Sh = Workbooks.Add.Worksheets(1)
    Application.DisplayAlerts = False
    Sh.Parent.SaveAs Filename:=Path & "отчет " & ftdate & ".xlsx", FileFormat:= _
                     xlOpenXMLWorkbook, CreateBackup:=False
    If tdate <> "" Then ft = Left(tdate, 2) & Mid(tdate, 3, 2) & Right(tdate, 4)
    Application.DisplayAlerts = True
    Set Files = Get_files(Path)
    pz& = 1
    keys = Files.keys
    Application.ScreenUpdating = False
    For i = 0 To Files.Count - 1
        If InStr(Files.Name, ft) <> 0 Then
           Set Sh1 = Workbooks.Open(keys(i)).Worksheets(1)
           Arr(1, 1) = Files.Item(keys(i))
           Arr(2, 1) = Sh1.Cells(1, 1)
           Arr(3, 1) = Sh1.Cells(2, 1)
           Sh1.Parent.Close (False)
           Sh.Cells(pz, 1).Resize(3, 1) = Arr
           pz = pz + 4
    Next
    Sh.Parent.Save
    Application.ScreenUpdating = True
    Workbooks("отчет " & ftdate & ".xlsx").Close
 
End Sub
 
Function Get_files(ByVal Path As String)
 
    Set C_is = CreateObject("scripting.dictionary")
    Dim strFile As String
    With CreateObject("scripting.filesystemobject")
        Set curfold = .GetFolder(Path)
        If Not curfold Is Nothing Then
            For Each fil In curfold.Files
 
                If InStr(1, fil.Name, ".xls", vbTextCompare) > 0 And InStr(1, fil.Name, "_", vbTextCompare) > 0 Then
                    Z = Split(fil.Name, "_")
                    strFile = Z(UBound(Z))
                    C_is.Item(fil.Path) = strFile
                End If
            Next
 
        End If
    End With
    Set Get_files = C_is

End Function
 
Где закрытие этого ифа в строке 19?
Код
If InStr(Files.Name, ft) <> 0 Then
Скажи мне, кудесник, любимец ба’гов...
 
_Boroda_, Спасибо. помогло. но теперь работать перестало.
Похоже я все таки накосарезил в коде. И при отсутствии даты выборки  tdate = Sh.Range("F1") формируется пустой отчет :(
При наличии даты тоже отчет чистый. Похоже он просто не читает файлы. :(
Изменено: alex_j - 17.11.2022 15:40:31
 
Цитата
alex_j написал:
но теперь работать перестало.
Надо сначала в коде было разобраться.Найдите отличия
Код
Sub Кнопка3_Щелчок()

    Dim Sh As Worksheet, Path, tdate, ftdate, ft As String, Sh1 As Worksheet, Arr(1 To 3, 1 To 1)
    Set Sh = ActiveSheet
    Path = Sh.Range("B1")
    tdate = Sh.Range("F1")
    If tdate = "" Then ftdate = Date Else ftdate = tdate
    Set Sh = Workbooks.Add.Worksheets(1)
    Application.DisplayAlerts = False
    Sh.Parent.SaveAs Filename:=Path & "отчет " & ftdate & ".xlsx", FileFormat:= _
                     xlOpenXMLWorkbook, CreateBackup:=False
    If tdate <> "" Then ft = Left(tdate, 2) & Mid(tdate, 3, 2) & Right(tdate, 4)
    Application.DisplayAlerts = True
    Set Files = Get_files(Path)
    pz& = 1
    keys = Files.keys
    Application.ScreenUpdating = False
    For i = 0 To Files.Count - 1
        If InStr(1, keys(i), ft, vbTextCompare) > 0 Then
            Set Sh1 = Workbooks.Open(keys(i)).Worksheets(1)
            Arr(1, 1) = Files.Item(keys(i))
            Arr(2, 1) = Sh1.Cells(1, 1)
            Arr(3, 1) = Sh1.Cells(2, 1)
            Sh1.Parent.Close (False)
            Sh.Cells(pz, 1).Resize(3, 1) = Arr
            pz = pz + 4
        End If
    Next
    Sh.Parent.Save
    Application.ScreenUpdating = True
    Workbooks("отчет " & ftdate & ".xlsx").Close

End Sub
PS:А не проще так записать
Код
If tdate <> "" Then ft = Format(CDate(tdate), "ddMMyyyy")
Изменено: doober - 17.11.2022 16:38:30
 
doober, Огромное спасибо.

Я невнимательно читал изначальный код и вместо имени keys(i) пытался монстырить костыль в бесконечность.
Спасибо за идею с датой.
Страницы: 1
Наверх