Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Обьединение данных нескольких файлов в один и подсчёт суммы - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Обьединение данных нескольких файлов в один и подсчёт суммы
DrMini Дата: Понедельник, 03.07.2023, 10:42 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
Здравствуйте форумчане и гости форума.
Один раз в месяц выгружаю файлы в один каталог (в примере прикрепил 3 файла. Их не более 30 каждый месяц).
Потом приходится открывать каждый файл и копировать в общую таблицу в итоговом файле за месяц Итог и суммировать общую сумму за месяц.
Помогите с макросом для ускорения обработки файлов.
Принцип такой:
Открываю файл Итог (имя файла может быть любым)
Тапаю на кнопку Выбрать каталог и указываю на каталог с выгруженными файлами.
Получаю результат как в файле Итог
К сообщению приложен файл: TEST.zip (33.7 Kb)


Сообщение отредактировал DrMini - Понедельник, 03.07.2023, 10:54
 
Ответить
СообщениеЗдравствуйте форумчане и гости форума.
Один раз в месяц выгружаю файлы в один каталог (в примере прикрепил 3 файла. Их не более 30 каждый месяц).
Потом приходится открывать каждый файл и копировать в общую таблицу в итоговом файле за месяц Итог и суммировать общую сумму за месяц.
Помогите с макросом для ускорения обработки файлов.
Принцип такой:
Открываю файл Итог (имя файла может быть любым)
Тапаю на кнопку Выбрать каталог и указываю на каталог с выгруженными файлами.
Получаю результат как в файле Итог

Автор - DrMini
Дата добавления - 03.07.2023 в 10:42
msi2102 Дата: Понедельник, 03.07.2023, 11:02 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 415
Репутация: 129 ±
Замечаний: 0% ±

Excel 2007
Я думаю эта задачку лучше решать через PQ
 
Ответить
СообщениеЯ думаю эта задачку лучше решать через PQ

Автор - msi2102
Дата добавления - 03.07.2023 в 11:02
DrMini Дата: Понедельник, 03.07.2023, 11:05 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
лучше решать через PQ

Никогда с этим не сталкивался. Только читал и смотрел примеры.
Если не трудно то может попробуете сделать на PQ, а я протестирую, как работать будет.
Увидел ссылку на видео. Спасибо. После обеда посмотрю.


Сообщение отредактировал DrMini - Понедельник, 03.07.2023, 11:07
 
Ответить
Сообщение
лучше решать через PQ

Никогда с этим не сталкивался. Только читал и смотрел примеры.
Если не трудно то может попробуете сделать на PQ, а я протестирую, как работать будет.
Увидел ссылку на видео. Спасибо. После обеда посмотрю.

Автор - DrMini
Дата добавления - 03.07.2023 в 11:05
Hugo Дата: Понедельник, 03.07.2023, 11:18 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3662
Репутация: 786 ±
Замечаний: 0% ±

365
Да можно и макросом, непонятно только зачем промежуточные суммы без привязки к источникам этих сумм.
Собирайте всё в одну таблицу, внизу можно общую сумму прописать или формулой, или числом.
Ну и в процессе наверное не будет лишним проверить даты по первой или второй строке источника, вдруг там что лишнее в каталоге.
Диалог и перебор файлов АИ подскажет, например https://chat.openai.com/share/a013a014-06a2-48b0-8927-be232a60b589


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Понедельник, 03.07.2023, 11:25
 
Ответить
СообщениеДа можно и макросом, непонятно только зачем промежуточные суммы без привязки к источникам этих сумм.
Собирайте всё в одну таблицу, внизу можно общую сумму прописать или формулой, или числом.
Ну и в процессе наверное не будет лишним проверить даты по первой или второй строке источника, вдруг там что лишнее в каталоге.
Диалог и перебор файлов АИ подскажет, например https://chat.openai.com/share/a013a014-06a2-48b0-8927-be232a60b589

Автор - Hugo
Дата добавления - 03.07.2023 в 11:18
DrMini Дата: Понедельник, 03.07.2023, 11:25 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
зачем промежуточные суммы без привязки к источникам этих сумм

Нужны суммы за день для более удобного поиска если "пропал" платёж.
внизу можно общую сумму прописать или формулой, или числом.

Согласен.
Нужна итоговая сумма всего за месяц для проверки.
наверное не будет лишним проверить даты по первой или второй строке источника

Было бы не плохо но не критично.
 
Ответить
Сообщение
зачем промежуточные суммы без привязки к источникам этих сумм

Нужны суммы за день для более удобного поиска если "пропал" платёж.
внизу можно общую сумму прописать или формулой, или числом.

Согласен.
Нужна итоговая сумма всего за месяц для проверки.
наверное не будет лишним проверить даты по первой или второй строке источника

Было бы не плохо но не критично.

Автор - DrMini
Дата добавления - 03.07.2023 в 11:25
DrMini Дата: Понедельник, 03.07.2023, 11:28 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
Диалог и перебор файлов АИ подскажет, например https://chat.openai.com/share/a013a014-06a2-48b0-8927-be232a60b589

Я с VBA вообще ни, как.
С формулами кое как, но с VBA полный ноль.
 
Ответить
Сообщение
Диалог и перебор файлов АИ подскажет, например https://chat.openai.com/share/a013a014-06a2-48b0-8927-be232a60b589

Я с VBA вообще ни, как.
С формулами кое как, но с VBA полный ноль.

Автор - DrMini
Дата добавления - 03.07.2023 в 11:28
Hugo Дата: Понедельник, 03.07.2023, 11:30 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3662
Репутация: 786 ±
Замечаний: 0% ±

365
Тогда суммы за день без проверки можно и оставлять, а общую макросом просто всё что выше суммируем и делим на 2. Без проверки, верим 1С


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеТогда суммы за день без проверки можно и оставлять, а общую макросом просто всё что выше суммируем и делим на 2. Без проверки, верим 1С

Автор - Hugo
Дата добавления - 03.07.2023 в 11:30
DrMini Дата: Понедельник, 03.07.2023, 11:34 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
суммы за день без проверки можно и оставлять

Да.
просто всё что выше суммируем и делим на 2. Без проверки, верим 1С

Так и поступим.
yes
 
Ответить
Сообщение
суммы за день без проверки можно и оставлять

Да.
просто всё что выше суммируем и делим на 2. Без проверки, верим 1С

Так и поступим.
yes

Автор - DrMini
Дата добавления - 03.07.2023 в 11:34
jun Дата: Понедельник, 03.07.2023, 11:42 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

DrMini, здравствуйте!
Ниже вариант макросом. Я создал лист с именем tmp и на него загружал данные. Имя можно поменять на нужное Вам.
Предполагается, что строки на сводном листе с 1 по 5 заполнены.
Макрос работает так:
жмете кнопку на листе tmp, выбираете папку с данными для загрузки.
[vba]
Код
Sub получить_данные()
Dim fDialog As FileDialog, StrFile As String, titleFlag As Boolean, SUpdating
Dim wb As Workbook, arr(), data, title As Variant, summDict As Object, lr As Long, i As Long, j As Long
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
    .AllowMultiSelect = False
    .title = "Выберите папку для загрузки данных"
    .Show
End With
Set summDict = CreateObject("Scripting.Dictionary"): summDict.Add "Итого", 0
StrFile = Dir(fDialog.SelectedItems(1) & "\*")
titleFlag = False
j = 1
SUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False
Do While Len(StrFile) > 0
    Set wb = Application.Workbooks.Open(fDialog.SelectedItems(1) & "\" & StrFile)
    If titleFlag = False Then title = wb.Worksheets(1).Cells(1, 1).CurrentRegion.Rows(6)
    With wb.Worksheets(1)
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        data = .Range(.Cells(7, 1), .Cells(lr, 3))
    End With
    wb.Close False
    For i = LBound(data, 1) To UBound(data, 1)
        ReDim Preserve arr(1 To 3, 1 To j)
        arr(1, j) = data(i, 1)
        arr(2, j) = data(i, 2)
        arr(3, j) = CDbl(data(i, 3))
        If LCase(arr(1, j)) = LCase("Итого") Then summDict("Итого") = summDict("Итого") + CDbl(arr(3, j))
        j = j + 1
    Next i
    StrFile = Dir
Loop
Application.ScreenUpdating = SUpdating
' выгрузка на лист
With Worksheets("tmp") ' tmp понменять на нужное имя листа (в Вашем примере Вариант 1)
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    If lr > 5 Then .Range(.Cells(6, 1), .Cells(lr, 3)).Clear: lr = 5
    .Cells(lr + 1, 1).Resize(1, UBound(title, 2)) = title
    lr = lr + 2
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            .Cells(lr, j) = arr(j, i)
        Next j
        lr = lr + 1
    Next i
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Cells(lr + 1, 1) = "Итого"
    .Cells(lr + 1, 3) = summDict("Итого")
    Call formatTable(.Name)
End With
End Sub
Private Sub formatTable(shName As String)
Dim rng As Range, sRow As Long, lr  As Long
With Worksheets(shName)
    Set rng = .Cells.Find("Итого")
    .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    sRow = rng.Row
    Do
        Set rng = .Cells.FindNext(rng)
        .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    Loop While rng.Row <> sRow
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    With .Range(Cells(6, 1), .Cells(lr, 3))
        .Borders.LineStyle = -4142
        .Borders.Color = 8765644
        .Columns(3).NumberFormat = "0.00"
    End With
End With
End Sub
[/vba]
К сообщению приложен файл: itog.xlsb (27.2 Kb)
 
Ответить
СообщениеDrMini, здравствуйте!
Ниже вариант макросом. Я создал лист с именем tmp и на него загружал данные. Имя можно поменять на нужное Вам.
Предполагается, что строки на сводном листе с 1 по 5 заполнены.
Макрос работает так:
жмете кнопку на листе tmp, выбираете папку с данными для загрузки.
[vba]
Код
Sub получить_данные()
Dim fDialog As FileDialog, StrFile As String, titleFlag As Boolean, SUpdating
Dim wb As Workbook, arr(), data, title As Variant, summDict As Object, lr As Long, i As Long, j As Long
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
    .AllowMultiSelect = False
    .title = "Выберите папку для загрузки данных"
    .Show
End With
Set summDict = CreateObject("Scripting.Dictionary"): summDict.Add "Итого", 0
StrFile = Dir(fDialog.SelectedItems(1) & "\*")
titleFlag = False
j = 1
SUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False
Do While Len(StrFile) > 0
    Set wb = Application.Workbooks.Open(fDialog.SelectedItems(1) & "\" & StrFile)
    If titleFlag = False Then title = wb.Worksheets(1).Cells(1, 1).CurrentRegion.Rows(6)
    With wb.Worksheets(1)
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        data = .Range(.Cells(7, 1), .Cells(lr, 3))
    End With
    wb.Close False
    For i = LBound(data, 1) To UBound(data, 1)
        ReDim Preserve arr(1 To 3, 1 To j)
        arr(1, j) = data(i, 1)
        arr(2, j) = data(i, 2)
        arr(3, j) = CDbl(data(i, 3))
        If LCase(arr(1, j)) = LCase("Итого") Then summDict("Итого") = summDict("Итого") + CDbl(arr(3, j))
        j = j + 1
    Next i
    StrFile = Dir
Loop
Application.ScreenUpdating = SUpdating
' выгрузка на лист
With Worksheets("tmp") ' tmp понменять на нужное имя листа (в Вашем примере Вариант 1)
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    If lr > 5 Then .Range(.Cells(6, 1), .Cells(lr, 3)).Clear: lr = 5
    .Cells(lr + 1, 1).Resize(1, UBound(title, 2)) = title
    lr = lr + 2
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            .Cells(lr, j) = arr(j, i)
        Next j
        lr = lr + 1
    Next i
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Cells(lr + 1, 1) = "Итого"
    .Cells(lr + 1, 3) = summDict("Итого")
    Call formatTable(.Name)
End With
End Sub
Private Sub formatTable(shName As String)
Dim rng As Range, sRow As Long, lr  As Long
With Worksheets(shName)
    Set rng = .Cells.Find("Итого")
    .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    sRow = rng.Row
    Do
        Set rng = .Cells.FindNext(rng)
        .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    Loop While rng.Row <> sRow
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    With .Range(Cells(6, 1), .Cells(lr, 3))
        .Borders.LineStyle = -4142
        .Borders.Color = 8765644
        .Columns(3).NumberFormat = "0.00"
    End With
End With
End Sub
[/vba]

Автор - jun
Дата добавления - 03.07.2023 в 11:42
DrMini Дата: Понедельник, 03.07.2023, 11:53 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
Ниже вариант макросом.

Именно то, что нужно.
Огромное спасибо.
 
Ответить
Сообщение
Ниже вариант макросом.

Именно то, что нужно.
Огромное спасибо.

Автор - DrMini
Дата добавления - 03.07.2023 в 11:53
Hugo Дата: Понедельник, 03.07.2023, 11:54 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3662
Репутация: 786 ±
Замечаний: 0% ±

365
Написал без проверки дат, но случайно не сохранил ((


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНаписал без проверки дат, но случайно не сохранил ((

Автор - Hugo
Дата добавления - 03.07.2023 в 11:54
DrMini Дата: Понедельник, 03.07.2023, 11:57 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
но случайно не сохранил

Ничего страшного. Бывает.
:)
 
Ответить
Сообщение
но случайно не сохранил

Ничего страшного. Бывает.
:)

Автор - DrMini
Дата добавления - 03.07.2023 в 11:57
Hugo Дата: Понедельник, 03.07.2023, 12:15 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3662
Репутация: 786 ±
Замечаний: 0% ±

365
Мой ленивый вариант - доработал написанное АИ (Восстановил).
Без проверки файлов на даты.
К сообщению приложен файл: 8033164.xlsb (17.3 Kb)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеМой ленивый вариант - доработал написанное АИ (Восстановил).
Без проверки файлов на даты.

Автор - Hugo
Дата добавления - 03.07.2023 в 12:15
jun Дата: Понедельник, 03.07.2023, 12:17 | Сообщение № 14
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

Мой вариант тоже не проверяет файлы на даты.
 
Ответить
СообщениеМой вариант тоже не проверяет файлы на даты.

Автор - jun
Дата добавления - 03.07.2023 в 12:17
Hugo Дата: Понедельник, 03.07.2023, 12:28 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3662
Репутация: 786 ±
Замечаний: 0% ±

365
Код с проверкой на месяц по заголовкам в файлах
[vba]
Код

Option Explicit

Sub ProcessFilesInDirectory()
    Dim folderPath As String
    Dim fileName As String
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim mnth$, tst$, iLastrow&
    
    ' Выбор каталога
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выберите каталог"
        If .Show = -1 Then
            folderPath = .SelectedItems(1) & Application.PathSeparator
        Else
            Exit Sub
        End If
    End With
    
    Set ws = ActiveSheet
    mnth = Trim(Mid(ws.Cells(2, 1), 16))
    
    Application.ScreenUpdating = False
    
    ' Открытие каждого файла в каталоге и выполнение обработки
    fileName = Dir(folderPath & "*.*")
    Do While fileName <> ""
        ' Игнорировать системные файлы, например, "." и ".."
        If Left(fileName, 1) <> "." Then
        iLastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
        Application.StatusBar = "Обработка файла " & fileName
            Set wb = Workbooks.Open(folderPath & fileName)
            tst = Choose(Mid(wb.ActiveSheet.Cells(2, 1), 19, 2), "январь", "февраль", "март", _
            "апрель", "май", "июнь", "июль", "август", _
            "сентябрь", "октябрь", "ноябрь", "декабрь")
            If LCase(mnth$) = tst Then
                wb.ActiveSheet.UsedRange.Offset(6).Copy ws.Cells(iLastrow, 1)
            End If
            wb.Close SaveChanges:=False ' Закрыть файл без сохранения изменений
            Set wb = Nothing
        End If
        
        fileName = Dir ' Переход к следующему файлу
    Loop
    
    iLastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    ws.Rows(iLastrow).Copy ws.Cells(iLastrow + 1, 1)
    ws.Cells(iLastrow + 1, 3).FormulaR1C1 = "=SUM(R[-" & iLastrow - 6 & "]C:R[-1]C)/2"
    
    Application.StatusBar = False
    Application.ScreenUpdating = True
    
    MsgBox "Обработка файлов завершена."
End Sub

[/vba]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеКод с проверкой на месяц по заголовкам в файлах
[vba]
Код

Option Explicit

Sub ProcessFilesInDirectory()
    Dim folderPath As String
    Dim fileName As String
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim mnth$, tst$, iLastrow&
    
    ' Выбор каталога
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выберите каталог"
        If .Show = -1 Then
            folderPath = .SelectedItems(1) & Application.PathSeparator
        Else
            Exit Sub
        End If
    End With
    
    Set ws = ActiveSheet
    mnth = Trim(Mid(ws.Cells(2, 1), 16))
    
    Application.ScreenUpdating = False
    
    ' Открытие каждого файла в каталоге и выполнение обработки
    fileName = Dir(folderPath & "*.*")
    Do While fileName <> ""
        ' Игнорировать системные файлы, например, "." и ".."
        If Left(fileName, 1) <> "." Then
        iLastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
        Application.StatusBar = "Обработка файла " & fileName
            Set wb = Workbooks.Open(folderPath & fileName)
            tst = Choose(Mid(wb.ActiveSheet.Cells(2, 1), 19, 2), "январь", "февраль", "март", _
            "апрель", "май", "июнь", "июль", "август", _
            "сентябрь", "октябрь", "ноябрь", "декабрь")
            If LCase(mnth$) = tst Then
                wb.ActiveSheet.UsedRange.Offset(6).Copy ws.Cells(iLastrow, 1)
            End If
            wb.Close SaveChanges:=False ' Закрыть файл без сохранения изменений
            Set wb = Nothing
        End If
        
        fileName = Dir ' Переход к следующему файлу
    Loop
    
    iLastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    ws.Rows(iLastrow).Copy ws.Cells(iLastrow + 1, 1)
    ws.Cells(iLastrow + 1, 3).FormulaR1C1 = "=SUM(R[-" & iLastrow - 6 & "]C:R[-1]C)/2"
    
    Application.StatusBar = False
    Application.ScreenUpdating = True
    
    MsgBox "Обработка файлов завершена."
End Sub

[/vba]

Автор - Hugo
Дата добавления - 03.07.2023 в 12:28
Hugo Дата: Понедельник, 03.07.2023, 12:37 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3662
Репутация: 786 ±
Замечаний: 0% ±

365
Время работы кодов конечно не сравнить...
Но я зато внизу визуализирую процесс :)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеВремя работы кодов конечно не сравнить...
Но я зато внизу визуализирую процесс :)

Автор - Hugo
Дата добавления - 03.07.2023 в 12:37
jun Дата: Понедельник, 03.07.2023, 12:54 | Сообщение № 17
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

Вариант с проверкой на даты.
Сравнивается дата из файла, в который происходит выгрузка (основной), из ячейки А2 (ВАЖНО перед месяцем должно стоять двоеточие!) и первой строкой каждого открываемого файла для загрузки.
Код:
[vba]
Код
Sub получить_данные()
Dim fDialog As FileDialog, StrFile As String, titleFlag As Boolean, SUpdating, tmpSht As Worksheet
Dim wb As Workbook, arr(), data, title As Variant, summDict As Object, lr As Long, i As Long, j As Long
Dim monthCriteria As String
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
    .AllowMultiSelect = False
    .title = "Выберите папку для загрузки данных"
    .Show
End With
Set tmpSht = ThisWorkbook.Worksheets("tmp") ' tmp поменять на нужное имя листа (в Вашем примере Вариант 1)
Set summDict = CreateObject("Scripting.Dictionary"): summDict.Add "Итого", 0
StrFile = Dir(fDialog.SelectedItems(1) & "\*")
titleFlag = False
j = 1
SUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False
Do While Len(StrFile) > 0
    Set wb = Application.Workbooks.Open(fDialog.SelectedItems(1) & "\" & StrFile)
    If titleFlag = False Then title = wb.Worksheets(1).Cells(1, 1).CurrentRegion.Rows(6)
    monthCriteria = Trim(Split(tmpSht.Cells(2, 1), ":")(1))
    With wb.Worksheets(1)
        If Not date_check(.Cells(1, 1), monthCriteria) Then wb.Close False: GoTo label
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        data = .Range(.Cells(7, 1), .Cells(lr, 3))
    End With
    wb.Close False
    For i = LBound(data, 1) To UBound(data, 1)
        ReDim Preserve arr(1 To 3, 1 To j)
        arr(1, j) = data(i, 1)
        arr(2, j) = data(i, 2)
        arr(3, j) = CDbl(data(i, 3))
        If LCase(arr(1, j)) = LCase("Итого") Then summDict("Итого") = summDict("Итого") + CDbl(arr(3, j))
        j = j + 1
    Next i
label:
    StrFile = Dir
Loop
Application.ScreenUpdating = SUpdating
' выгрузка на лист
With tmpSht
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    If lr > 5 Then .Range(.Cells(6, 1), .Cells(lr, 3)).Clear: lr = 5
    .Cells(lr + 1, 1).Resize(1, UBound(title, 2)) = title
    lr = lr + 2
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            .Cells(lr, j) = arr(j, i)
        Next j
        lr = lr + 1
    Next i
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Cells(lr + 1, 1) = "Итого"
    .Cells(lr + 1, 3) = summDict("Итого")
    Call formatTable(.Name)
End With
End Sub
Private Sub formatTable(shName As String)
Dim rng As Range, sRow As Long, lr  As Long
With Worksheets(shName)
    Set rng = .Cells.Find("Итого")
    .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    sRow = rng.Row
    Do
        Set rng = .Cells.FindNext(rng)
        .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    Loop While rng.Row <> sRow
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    With .Range(Cells(6, 1), .Cells(lr, 3))
        .Borders.LineStyle = -4142
        .Borders.Color = 8765644
        .Columns(3).NumberFormat = "0.00"
    End With
End With
End Sub
Private Function date_check(cell_with_date As String, current_date As String) As Boolean
' функция проверки корректности текущего месяца (записанного в 2 строке первого столбца листа с результатом == cell_with_date) и даты в открываемом файле для загрузки (ячейка А1) == current_date
date_check = False
    With CreateObject("VBscript.Regexp")
        .Global = False: .MultiLine = False: .Pattern = "\d{2}\.\d{2}\.\d{4}"
        If .test(cell_with_date) Then
            If MonthName(Month(.Execute(cell_with_date)(0))) = current_date Then date_check = True: Exit Function
        End If
    End With
End Function
[/vba]
К сообщению приложен файл: c_proverkoj_na_daty.xlsb (28.9 Kb)


Сообщение отредактировал jun - Понедельник, 03.07.2023, 12:54
 
Ответить
СообщениеВариант с проверкой на даты.
Сравнивается дата из файла, в который происходит выгрузка (основной), из ячейки А2 (ВАЖНО перед месяцем должно стоять двоеточие!) и первой строкой каждого открываемого файла для загрузки.
Код:
[vba]
Код
Sub получить_данные()
Dim fDialog As FileDialog, StrFile As String, titleFlag As Boolean, SUpdating, tmpSht As Worksheet
Dim wb As Workbook, arr(), data, title As Variant, summDict As Object, lr As Long, i As Long, j As Long
Dim monthCriteria As String
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)
With fDialog
    .AllowMultiSelect = False
    .title = "Выберите папку для загрузки данных"
    .Show
End With
Set tmpSht = ThisWorkbook.Worksheets("tmp") ' tmp поменять на нужное имя листа (в Вашем примере Вариант 1)
Set summDict = CreateObject("Scripting.Dictionary"): summDict.Add "Итого", 0
StrFile = Dir(fDialog.SelectedItems(1) & "\*")
titleFlag = False
j = 1
SUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False
Do While Len(StrFile) > 0
    Set wb = Application.Workbooks.Open(fDialog.SelectedItems(1) & "\" & StrFile)
    If titleFlag = False Then title = wb.Worksheets(1).Cells(1, 1).CurrentRegion.Rows(6)
    monthCriteria = Trim(Split(tmpSht.Cells(2, 1), ":")(1))
    With wb.Worksheets(1)
        If Not date_check(.Cells(1, 1), monthCriteria) Then wb.Close False: GoTo label
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        data = .Range(.Cells(7, 1), .Cells(lr, 3))
    End With
    wb.Close False
    For i = LBound(data, 1) To UBound(data, 1)
        ReDim Preserve arr(1 To 3, 1 To j)
        arr(1, j) = data(i, 1)
        arr(2, j) = data(i, 2)
        arr(3, j) = CDbl(data(i, 3))
        If LCase(arr(1, j)) = LCase("Итого") Then summDict("Итого") = summDict("Итого") + CDbl(arr(3, j))
        j = j + 1
    Next i
label:
    StrFile = Dir
Loop
Application.ScreenUpdating = SUpdating
' выгрузка на лист
With tmpSht
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    If lr > 5 Then .Range(.Cells(6, 1), .Cells(lr, 3)).Clear: lr = 5
    .Cells(lr + 1, 1).Resize(1, UBound(title, 2)) = title
    lr = lr + 2
    For i = LBound(arr, 2) To UBound(arr, 2)
        For j = LBound(arr, 1) To UBound(arr, 1)
            .Cells(lr, j) = arr(j, i)
        Next j
        lr = lr + 1
    Next i
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Cells(lr + 1, 1) = "Итого"
    .Cells(lr + 1, 3) = summDict("Итого")
    Call formatTable(.Name)
End With
End Sub
Private Sub formatTable(shName As String)
Dim rng As Range, sRow As Long, lr  As Long
With Worksheets(shName)
    Set rng = .Cells.Find("Итого")
    .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    sRow = rng.Row
    Do
        Set rng = .Cells.FindNext(rng)
        .Range(rng, rng.Offset(0, 2)).Interior.ColorIndex = 19
    Loop While rng.Row <> sRow
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    With .Range(Cells(6, 1), .Cells(lr, 3))
        .Borders.LineStyle = -4142
        .Borders.Color = 8765644
        .Columns(3).NumberFormat = "0.00"
    End With
End With
End Sub
Private Function date_check(cell_with_date As String, current_date As String) As Boolean
' функция проверки корректности текущего месяца (записанного в 2 строке первого столбца листа с результатом == cell_with_date) и даты в открываемом файле для загрузки (ячейка А1) == current_date
date_check = False
    With CreateObject("VBscript.Regexp")
        .Global = False: .MultiLine = False: .Pattern = "\d{2}\.\d{2}\.\d{4}"
        If .test(cell_with_date) Then
            If MonthName(Month(.Execute(cell_with_date)(0))) = current_date Then date_check = True: Exit Function
        End If
    End With
End Function
[/vba]

Автор - jun
Дата добавления - 03.07.2023 в 12:54
DrMini Дата: Понедельник, 03.07.2023, 13:31 | Сообщение № 18
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
Ещё раз БООЛЬШОЕ СПАСИБО Hugo, и jun,
Очень помогли.
Сейчас уже сдал за месяц в исполнении VBA из Сообщения №9.
Чуть позже посмотрю остальные варианты.
Ещё раз спасибо.
 
Ответить
СообщениеЕщё раз БООЛЬШОЕ СПАСИБО Hugo, и jun,
Очень помогли.
Сейчас уже сдал за месяц в исполнении VBA из Сообщения №9.
Чуть позже посмотрю остальные варианты.
Ещё раз спасибо.

Автор - DrMini
Дата добавления - 03.07.2023 в 13:31
jun Дата: Понедельник, 03.07.2023, 13:43 | Сообщение № 19
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация: 43 ±
Замечаний: 0% ±

DrMini, если будете использовать код из сообщения 17, то макрос будет работать только, если в файле ИТОГ в ячейку А2 стоит 1 месяц. За несколько месяцев макрос работать не будет (см картинку)
К сообщению приложен файл: 7581564.png (7.9 Kb)
 
Ответить
СообщениеDrMini, если будете использовать код из сообщения 17, то макрос будет работать только, если в файле ИТОГ в ячейку А2 стоит 1 месяц. За несколько месяцев макрос работать не будет (см картинку)

Автор - jun
Дата добавления - 03.07.2023 в 13:43
DrMini Дата: Понедельник, 03.07.2023, 14:04 | Сообщение № 20
Группа: Друзья
Ранг: Старожил
Сообщений: 1852
Репутация: 264 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
За несколько месяцев макрос работать не будет

Нужен только один месяц.
Спасибо за подсказку.
 
Ответить
Сообщение
За несколько месяцев макрос работать не будет

Нужен только один месяц.
Спасибо за подсказку.

Автор - DrMini
Дата добавления - 03.07.2023 в 14:04
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!