Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Макрос для копирования отдельного листа из папки в одну общую книгу

Автор Kolobok27, 10.08.2021, 09:51:36

« назад - далее »

Kolobok27

Добрый день!
Есть одна книга excel, в которую будут собираться ежедневные суточные рапорты, каждый из которых представляет из себя отдельный лист excel. Нужен макрос, который будет подтягивать поступающие рапорты.
Имя каждого нового листа - "15 -СБМ суточный рапорт". В каждом последующем рапорте в имени меняться будет только цифра, типа: 15, 16, 17, 18 и т.д.
Основная книга имеет название "Анализ по БР"
(файлы примеры во вложении)
Основная книга и поступающие рапорты хранятся строго в одной попке
Если это технически возможно, прошу вас помочь!
Private Sub Test()
Dim iPath$, iFileName$
iPath = ThisWorkbook.Path & ""
iFileName = Dir(iPath & "15 -СБМ суточный рапорт.xls")

Application.ScreenUpdating = False
Do Until iFileName = ""
If iFileName <> ThisWorkbook.Name Then
ThisWorkbook.Sheets.Add , , , iPath & iFileName
End If
iFileName = Dir
Loop
Application.ScreenUpdating = True
End Sub

[admin]Коды оформляйте тегами VBCode. п.п. 4.25 Правил форума[/admin]

Есть такой код, который частично выполняет задачу. НО:
1) приходится менять имя файла в коде, чтобы он тянул нужный.. можно что-то сделать, чтобы макрос просто тянул каждый новый лист из папки ежесуточно?
2) Подтянутый лист вставляется в начало книги.. Как сделать так, чтобы лист вставлялся в конец?

Дмитрий Щербаков(The_Prist)

Цитата: Kolobok27 от 10.08.2021, 09:51:36просто тянул каждый новый лист
А как понять, какой новый? С номерами внутри месяца еще можно попробовать, а переход от месяца к месяцу? Вот сегодня, допустим 31 августа, завтра будет вставлен новый лист. Какой у него будет номер? 32 или 1?

Цитата: Kolobok27 от 10.08.2021, 09:51:36Подтянутый лист вставляется в начало книги.. Как сделать так, чтобы лист вставлялся в конец?
ThisWorkbook.Sheets.Add , ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count), , iPath & iFileName

P.S. Коды оформляйте тегами VBCode. п.п. 4.25 Правил форума
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Kolobok27

#2
Цитата: Дмитрий Щербаков(The_Prist) от 10.08.2021, 09:58:47
А как понять, какой новый?[/url]
[admin]Не цитируйте сообщения полностью - достаточно выделить нужную фразу и нажать ЦИТИРОВАТЬ. п.п. 4.18 Правил форума[/admin]


Во вложении пример, как называются листы, которые поступают ежедневно. Каждый день поступает только 1 рапорт. На начало поступления листов нумерация начинается с 1, максимальный предел 30, так как работа, по которым поступают рапорты, не может длиться более 30 дней. Но если вдруг такое случится, то номера не привязаны к дате, а лишь к последовательности дней выполнения работ, поэтому продолжится 31, 32, 33 и т.д.

В примере 2 я показал, как это выглядит внутри листа. Каждый файл идентичен, меняется только порядковый номер

Дмитрий Щербаков(The_Prist)

1. Не цитируйте сообщения полностью - достаточно выделить нужную фразу и нажать ЦИТИРОВАТЬ. п.п. 4.18 Правил форума
2.
Цитата: Kolobok27 от 10.08.2021, 10:44:23В примере 2 я показал, как это выглядит внутри листа
И на что в итоге-то опираться на определение последнего рапорта? На имя листа вроде "15 -СБМ суточный рапорт" или на текст в ячейке А2?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Kolobok27

Цитата: Дмитрий Щербаков(The_Prist) от 10.08.2021, 11:19:33
2. И на что в итоге-то опираться на определение последнего рапорта? На имя листа вроде "15 -СБМ суточный рапорт" или на текст в ячейке А2?

Тут оба варианта приемлемы, либо через названия файла, либо через текст в ячейке. Что проще реализовать?

Дмитрий Щербаков(The_Prist)

Цитата: Kolobok27 от 10.08.2021, 11:52:14либо через названия файла
тут для начала определяться надо, что есть что...То лист, то файл...Вы опишите задачу так, чтобы было сразу понятно другим. У Вас что исходно есть? Книга с листами рапортов, из которых лист с максимальным номером - нужный нам? Или несколько книг в папке и каждая книга содержит только один лист - рапорт и нужно найти эту самую книгу с листом, где номер рапорта максимальный?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Kolobok27

У меня изначально есть книга excel (во вложении "Анализ по БР"), каждый день поступает лист excel в папку, где хранится книга и собираются ежедневно поступающие листы. Название листов с первого дня начинается с "1 -СБМ суточный рапорт", каждый день номер в название увеличивается на +1 (как на фото во вложении). Мне бы хотелось сделать макрос, который бы, при активации, подтягивал новый поступивший лист из папки в книгу.
По идеи мне это нужно для следующего плана работы: оператор запускает утром компьютер, заходит в книгу, активирует макрос и ему подтягивается новый лист, который уже находится в папке.

Дмитрий Щербаков(The_Prist)

Ох и объяснения у Вас :) Давайте проясним термины:
книга Excel - это отдельный файл, который может содержать от одного до n листов. Книги хранятся в папках.
Лист Excel - это часть книги(т.е. файла), который не может жить самостоятельно - он всегда внутри книги.
Вроде как понял, что работаем все же с файлами(то бишь книгами). Код может быть таким:
Sub GetLastFile()
    Dim sFolder As String, sFiles As String, sResFile$
    Dim wb As Workbook
    Dim v, vMax&
    'определение пути к папке с файлами
    sFolder = ThisWorkbook.Path
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    'отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        v = Val(sFiles)
        If v > vMax Then
            vMax = v
            sResFile = sFiles
        End If
        sFiles = Dir
    Loop
    Set wb = Application.Workbooks.Open(sFolder & sResFile)
    wb.Sheets(1).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    wb.Close 0
    Application.ScreenUpdating = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Яндекс.Метрика Рейтинг@Mail.ru