Приветствую. Имеется книга с поступлением заказов. на каждом листе кол-во пишется руками в столбце А в первом приложенном файле, далее автоматически проставляется дата в столбец В. Поступает файл(второй приложенный) в котором есть такие же листы но другие записи. Листы могут быть все или не все. Чаще всего 1-2. Возможно ли: При поступление нового (второго) файла в автоматическом режиме, добавление кол-ва записей(рядов без первого) в столбец С первого файла(в соответствии с листами) с вводом даты в столбец D и дальнейшими подсчетами как в примере на первом листе в первом файле? Если это нужно может: файл с учетом находится в папке "Учет", в папке поступления в которую поступают файлы с записями. Правка: к сожалению забыл сделать соответствие. сейчас в первом файле кол-во записей не совпадает с кол-вом что есть в файле поступления.цифры произвольные.
Приветствую. Имеется книга с поступлением заказов. на каждом листе кол-во пишется руками в столбце А в первом приложенном файле, далее автоматически проставляется дата в столбец В. Поступает файл(второй приложенный) в котором есть такие же листы но другие записи. Листы могут быть все или не все. Чаще всего 1-2. Возможно ли: При поступление нового (второго) файла в автоматическом режиме, добавление кол-ва записей(рядов без первого) в столбец С первого файла(в соответствии с листами) с вводом даты в столбец D и дальнейшими подсчетами как в примере на первом листе в первом файле? Если это нужно может: файл с учетом находится в папке "Учет", в папке поступления в которую поступают файлы с записями. Правка: к сожалению забыл сделать соответствие. сейчас в первом файле кол-во записей не совпадает с кол-вом что есть в файле поступления.цифры произвольные.Vetali
Доброго! Попробую еще раз, возможно меня не поняли.. Имеется файл Uchet в папке Folder1. В папку Folder2 приходят разные файлы с листами как и в файле Uchet, на которых есть записи, в нашем примере приложенные pers и pers1. Файл Uchet сканирует листы поступивших файлов в папку Folder2, и записывает в своих соответствующих листах в колонке С кол-во записей(рядов без первого). Листов в поступивших файлах может быть от 1-го до всех как в файле Uchet. В случае что сумма записей в колонке С равно числу из колонки "Заказано" появляется надпись о закрытии заказа как в приложенном примере. Далее вручную вводится опять цифра в столбец "Заказано" и файл ждет новых поступлений файлов в папке Folder2 для дальнейшей обработки. прикладываю исправленные файлы для примера:
Доброго! Попробую еще раз, возможно меня не поняли.. Имеется файл Uchet в папке Folder1. В папку Folder2 приходят разные файлы с листами как и в файле Uchet, на которых есть записи, в нашем примере приложенные pers и pers1. Файл Uchet сканирует листы поступивших файлов в папку Folder2, и записывает в своих соответствующих листах в колонке С кол-во записей(рядов без первого). Листов в поступивших файлах может быть от 1-го до всех как в файле Uchet. В случае что сумма записей в колонке С равно числу из колонки "Заказано" появляется надпись о закрытии заказа как в приложенном примере. Далее вручную вводится опять цифра в столбец "Заказано" и файл ждет новых поступлений файлов в папке Folder2 для дальнейшей обработки. прикладываю исправленные файлы для примера:Vetali
Посмотрите что получилось. Содержание архива. Две папки New, Old и файл Uchet_new.xls В папке New два файла pers1.xls и pers2.xls Папка Old пустая. Алгоритм работы макроса. Циклом последовательно открываются файлы в папке New Два цикла один по файлу Uchet, а второй по файлу pers проходят по листам двух книг, сравнивая имена листов. Если имена совпали, то производится определение количества записей в pers и запись результата в Uchet. После завершения работы с листами макрос закрывает pers1, переносится в папку Old и открывает pers2. Алгоритм повторяется. Перед завершением макрос сохраняет файл Uchet (строка закомментирована) В файле Uchet два макроса. Первый в модуле "Эта книга", второй в "Модуле1"
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("A2:A100")) Is Nothing Then Target.Offset(0, 1) = Date End Sub
[/vba][vba]
Код
Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long Sub Macros() Dim xlUchet As Excel.Workbook Dim xlPers As Excel.Workbook Dim SheetUchet As Worksheet Dim SheetPers As Worksheet Dim Path_New As String, Path_Old As String Path_New = ThisWorkbook.Path & "\New\" Path_Old = ThisWorkbook.Path & "\Old\" Set xlUchet = ActiveWorkbook XlsPath = Path_New & "*.xls" 'Установка пути к файлам. Application.ScreenUpdating = False Application.EnableEvents = False XlsName = Dir(XlsPath) 'Читает первый файл. Do While XlsName <> "" ' Start the loop. Set xlPers = Workbooks.Open(Path_New & XlsName) xlUchet.Activate '----------------------------- For Each SheetUchet In xlUchet.Sheets With SheetUchet rA = .Range("A" & .Rows.Count).End(xlUp).Row rC = .Range("C" & .Rows.Count).End(xlUp).Row iRow = IIf(rA > rC, rA, rC + 1) For Each SheetPers In xlPers.Sheets If .Name = SheetPers.Name Then rN = SheetPers.Range("A" & SheetPers.Rows.Count).End(xlUp).Row - 1 .Range("C" & iRow) = rN .Range("D" & iRow) = Date Ost = IIf(rA > rC, .Range("A" & iRow), .Range("F" & iRow - 1)) If Ost - rN > 0 Then .Range("F" & iRow) = Ost - rN Else .Range("F" & iRow) = 0 .Range("A" & iRow + 1) = "заказ закрыт" .Range("B" & iRow + 1) = Date .Range("C" & iRow + 1) = .Range("A" & rA) + rN - Ost .Range("D" & iRow + 1) = Date .Range("E" & iRow + 1) = rN - Ost End If End If Next End With Next '----------------------------- xlPers.Close MoveFile Path_New & XlsName, Path_Old & XlsName XlsName = Dir 'перейти к следующему файлу. Loop Application.EnableEvents = True Application.ScreenUpdating = True 'xlUchet.Save 'чтобы файл автоматически записывался снять одинарный апостроф в начале End Sub
[/vba]
PS. В макросах объявлены не все переменные. Это лучше исправить, но на работу макроса это не сказывается. См. Файл.
Посмотрите что получилось. Содержание архива. Две папки New, Old и файл Uchet_new.xls В папке New два файла pers1.xls и pers2.xls Папка Old пустая. Алгоритм работы макроса. Циклом последовательно открываются файлы в папке New Два цикла один по файлу Uchet, а второй по файлу pers проходят по листам двух книг, сравнивая имена листов. Если имена совпали, то производится определение количества записей в pers и запись результата в Uchet. После завершения работы с листами макрос закрывает pers1, переносится в папку Old и открывает pers2. Алгоритм повторяется. Перед завершением макрос сохраняет файл Uchet (строка закомментирована) В файле Uchet два макроса. Первый в модуле "Эта книга", второй в "Модуле1"
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("A2:A100")) Is Nothing Then Target.Offset(0, 1) = Date End Sub
[/vba][vba]
Код
Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long Sub Macros() Dim xlUchet As Excel.Workbook Dim xlPers As Excel.Workbook Dim SheetUchet As Worksheet Dim SheetPers As Worksheet Dim Path_New As String, Path_Old As String Path_New = ThisWorkbook.Path & "\New\" Path_Old = ThisWorkbook.Path & "\Old\" Set xlUchet = ActiveWorkbook XlsPath = Path_New & "*.xls" 'Установка пути к файлам. Application.ScreenUpdating = False Application.EnableEvents = False XlsName = Dir(XlsPath) 'Читает первый файл. Do While XlsName <> "" ' Start the loop. Set xlPers = Workbooks.Open(Path_New & XlsName) xlUchet.Activate '----------------------------- For Each SheetUchet In xlUchet.Sheets With SheetUchet rA = .Range("A" & .Rows.Count).End(xlUp).Row rC = .Range("C" & .Rows.Count).End(xlUp).Row iRow = IIf(rA > rC, rA, rC + 1) For Each SheetPers In xlPers.Sheets If .Name = SheetPers.Name Then rN = SheetPers.Range("A" & SheetPers.Rows.Count).End(xlUp).Row - 1 .Range("C" & iRow) = rN .Range("D" & iRow) = Date Ost = IIf(rA > rC, .Range("A" & iRow), .Range("F" & iRow - 1)) If Ost - rN > 0 Then .Range("F" & iRow) = Ost - rN Else .Range("F" & iRow) = 0 .Range("A" & iRow + 1) = "заказ закрыт" .Range("B" & iRow + 1) = Date .Range("C" & iRow + 1) = .Range("A" & rA) + rN - Ost .Range("D" & iRow + 1) = Date .Range("E" & iRow + 1) = rN - Ost End If End If Next End With Next '----------------------------- xlPers.Close MoveFile Path_New & XlsName, Path_Old & XlsName XlsName = Dir 'перейти к следующему файлу. Loop Application.EnableEvents = True Application.ScreenUpdating = True 'xlUchet.Save 'чтобы файл автоматически записывался снять одинарный апостроф в начале End Sub
[/vba]
PS. В макросах объявлены не все переменные. Это лучше исправить, но на работу макроса это не сказывается. См. Файл.AlexM
Алексей, большое спасибо. Есть пара вопросов: Я открываю файл Uchet_new запускаю макрос и все верно считается. Возможен ли автоматический запуск макроса при открытии книги? После счетов и строки"заказ закрыт" оставляю одну чистую строку для разделения и ввожу новую цифру заказа. Далее в папку олд помещаю файлы pers3 и pers4 счеты не производятся...или я что-то не правильно делаю. Объясните пожалуйста.
Алексей, большое спасибо. Есть пара вопросов: Я открываю файл Uchet_new запускаю макрос и все верно считается. Возможен ли автоматический запуск макроса при открытии книги? После счетов и строки"заказ закрыт" оставляю одну чистую строку для разделения и ввожу новую цифру заказа. Далее в папку олд помещаю файлы pers3 и pers4 счеты не производятся...или я что-то не правильно делаю. Объясните пожалуйста.Vetali
Новые файлы надо класть в папку New, а макрос после обработки перенесет их в Old Чтобы макрос запускался при открытии книги, то в модуль "Эта книга" проекта VBA надо вставить код [vba]
Код
Private Sub Workbook_Open() Macros End Sub
[/vba] Обработка файлов идет в последовательности, как будто они отсортированы в папке New по именам. Т.е. обрабатывается pers3, а потом pers4.
Новые файлы надо класть в папку New, а макрос после обработки перенесет их в Old Чтобы макрос запускался при открытии книги, то в модуль "Эта книга" проекта VBA надо вставить код [vba]
Код
Private Sub Workbook_Open() Macros End Sub
[/vba] Обработка файлов идет в последовательности, как будто они отсортированы в папке New по именам. Т.е. обрабатывается pers3, а потом pers4.AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
Понял. С автозапуском получилось отлично. В папку new помещаю файлы pers3 по pers6 по сути размноженные pers1 и pers2, запускаю файл Uchet_new, и сразу выскакивает ошибка и отrрывается файл pers3:
подсчеты прекращаются но после нажатия кнопки end они запускаются но только pers1 и pers2. далее я ввожу следующую цифру заказа, дата не проставляется и не могу понять какие счеты идут после закрытия и нового открытия файла учета. из папки new в папку old записываются только pers1 и pers2.
Понял. С автозапуском получилось отлично. В папку new помещаю файлы pers3 по pers6 по сути размноженные pers1 и pers2, запускаю файл Uchet_new, и сразу выскакивает ошибка и отrрывается файл pers3:
подсчеты прекращаются но после нажатия кнопки end они запускаются но только pers1 и pers2. далее я ввожу следующую цифру заказа, дата не проставляется и не могу понять какие счеты идут после закрытия и нового открытия файла учета. из папки new в папку old записываются только pers1 и pers2.Vetali
Предполагаю, что ошибка происходит потому, что на листе "Энергогарант" файла Uchet нет заказа, а в файле данные есть. Наверно такого не должно быть. Есть ли смысл делать защиту от этой ошибки?
Предполагаю, что ошибка происходит потому, что на листе "Энергогарант" файла Uchet нет заказа, а в файле данные есть. Наверно такого не должно быть. Есть ли смысл делать защиту от этой ошибки?AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
Сообщение отредактировал AlexM - Воскресенье, 17.02.2013, 15:23
Ох. Извините, я ничего не понимаю. при каждом открытии файла учет, сейчас появляется по нескольку строк о том что заказ закрыт.один файл застрял в папке new и не переписывается в папку old. я даже не знаю как быть...может стоит остановить работу макроса после строчки заказ закрыт, до ввода новой цифры заказа,но как уследить за всеми листами, ведь если на каком-то из листов закроется заказ то макрос останавливается и приход новых записей считаться не будет и на других листах?
Ох. Извините, я ничего не понимаю. при каждом открытии файла учет, сейчас появляется по нескольку строк о том что заказ закрыт.один файл застрял в папке new и не переписывается в папку old. я даже не знаю как быть...может стоит остановить работу макроса после строчки заказ закрыт, до ввода новой цифры заказа,но как уследить за всеми листами, ведь если на каком-то из листов закроется заказ то макрос останавливается и приход новых записей считаться не будет и на других листах?Vetali
1. Я бы не делал автозапуска макроса. Логично сначала ввести данные новых заказов, а потом их обрабатывать 2. Сохранение файла Uchet в макросе я закомментировал не просто так. С сохранением в период отладки сложнее вернуться к начальному состоянию файла. Если делать защиту, то я пока не представляю так. Может быть так. После открытия pers определяем имена листов. Пробегаем по одноименным листам в Uchet и если хотя бы на одном не введен заказ после строки "Заказ закрыт", то переходим к следующему pers, а этот не переносим в папку Old. Если не получается восстановить рабочее состояние файлов скачайте еще раз архив из форума.
1. Я бы не делал автозапуска макроса. Логично сначала ввести данные новых заказов, а потом их обрабатывать 2. Сохранение файла Uchet в макросе я закомментировал не просто так. С сохранением в период отладки сложнее вернуться к начальному состоянию файла. Если делать защиту, то я пока не представляю так. Может быть так. После открытия pers определяем имена листов. Пробегаем по одноименным листам в Uchet и если хотя бы на одном не введен заказ после строки "Заказ закрыт", то переходим к следующему pers, а этот не переносим в папку Old. Если не получается восстановить рабочее состояние файлов скачайте еще раз архив из форума.AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
После пары тестов разобрался. Для правильной работы файла, нужно чтоб после закрытия заказа обязательно ввести цифру нового заказа иначе ошибка. Очень хорошо что файл не перемещается в олд, так как можно увидеть что не прошло и где нужно прописать новый заказ. Алексей вы очень хорошо и правильно все сделали! Пара вопросов по возможно или нет а то не могу предвидеть все сразу к сожалению. Можно ли в столбце G прописать название файла с возможность открытия его из которого были сделаны записи в данном ряду. Возможно ли уведомление в файле учета о том что на таком-то листе заказ закрыт?
После пары тестов разобрался. Для правильной работы файла, нужно чтоб после закрытия заказа обязательно ввести цифру нового заказа иначе ошибка. Очень хорошо что файл не перемещается в олд, так как можно увидеть что не прошло и где нужно прописать новый заказ. Алексей вы очень хорошо и правильно все сделали! Пара вопросов по возможно или нет а то не могу предвидеть все сразу к сожалению. Можно ли в столбце G прописать название файла с возможность открытия его из которого были сделаны записи в данном ряду. Возможно ли уведомление в файле учета о том что на таком-то листе заказ закрыт?Vetali
Попытался снова с 7-ю поступившими файлами в папку new. Если появляется ошибка к примеру из-за того что в листе энергогарант не введен новый заказ, то при повторном открытии файла учета, записи из не прошедших файлах в папку олд, с листа ромбы к примеру повторно записываются, и получается что одни и те же записи одного листа записываются столько раз сколько открывается файл. Отключу автозапуск макроса и протестирую заново.
Цитата (AlexM)
После открытия pers определяем имена листов. Пробегаем по одноименным листам в Uchet и если хотя бы на одном не введен заказ после строки "Заказ закрыт", то переходим к следующему pers, а этот не переносим в папку Old.
Да, наверно вы правы. И тогда наверно в таком случае, данные ни с одного листа не должны записываться в файле учет, иначе при повторном запуске макроса они запишутся дважды..
Попытался снова с 7-ю поступившими файлами в папку new. Если появляется ошибка к примеру из-за того что в листе энергогарант не введен новый заказ, то при повторном открытии файла учета, записи из не прошедших файлах в папку олд, с листа ромбы к примеру повторно записываются, и получается что одни и те же записи одного листа записываются столько раз сколько открывается файл. Отключу автозапуск макроса и протестирую заново.
Цитата (AlexM)
После открытия pers определяем имена листов. Пробегаем по одноименным листам в Uchet и если хотя бы на одном не введен заказ после строки "Заказ закрыт", то переходим к следующему pers, а этот не переносим в папку Old.
Да, наверно вы правы. И тогда наверно в таком случае, данные ни с одного листа не должны записываться в файле учет, иначе при повторном запуске макроса они запишутся дважды..Vetali
Сообщение отредактировал Vetali - Воскресенье, 17.02.2013, 16:55
Да, Алексей! Именно то что нужно было! Постараюсь в долгу не остаться. Скажите пожалуйста, правильно ли я понимаю, если мне нужно изменить названия папок я делаю это во всех строках кода где вижу названия new и old? Если после обработки и перемещения обработанных файлов в папку old, я их перемещу в подпапки в папке old, к примеру если создам папки по месяцам, эти файлы будут доступны из файла учет? Можно ли область от цифры заказа и до надписи заказ закрыт автоматически окрашивать в желтый послетого как заказ закрыватся?(не принципиально, могу сам руками)
Да, Алексей! Именно то что нужно было! Постараюсь в долгу не остаться. Скажите пожалуйста, правильно ли я понимаю, если мне нужно изменить названия папок я делаю это во всех строках кода где вижу названия new и old? Если после обработки и перемещения обработанных файлов в папку old, я их перемещу в подпапки в папке old, к примеру если создам папки по месяцам, эти файлы будут доступны из файла учет? Можно ли область от цифры заказа и до надписи заказ закрыт автоматически окрашивать в желтый послетого как заказ закрыватся?(не принципиально, могу сам руками)Vetali
[/vba] Вроде все. Остальные New и Old можно не менять. Если файлы из папки Old или как ее вы назовете, переместить в подпапки, то не будут работать ссылки на файлы. Путь к открываемым файлам по ссылкам указан в строке из модуля "Эта книга" С цветом чуть позже сделаю.
Насчитал только 4 строки. В модуле "Эта книга" одна строка [vba]
Код
Set Pers = Workbooks.Open(ActiveWorkbook.Path & "\Old\" & Target)
[/vba] Вроде все. Остальные New и Old можно не менять. Если файлы из папки Old или как ее вы назовете, переместить в подпапки, то не будут работать ссылки на файлы. Путь к открываемым файлам по ссылкам указан в строке из модуля "Эта книга" С цветом чуть позже сделаю.AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
Большое спасибо Алексей! Опять же, мысли приходят потом... Можно ли при вводе цифры нового заказа, в этой строчке, в столбце "персонализировано" вставить цифру которая осталась в колонке "сверх заказа" и считать и ее? Так как эта цифра в любом случае будет изыматься из следующего заказа(на практике). Мне еще кажется что если файл не перешел в папку old по причине отсутствия заказа на одном листе, то после ввода заказа на других листах, записи из этого файла считаются повторно...
Большое спасибо Алексей! Опять же, мысли приходят потом... Можно ли при вводе цифры нового заказа, в этой строчке, в столбце "персонализировано" вставить цифру которая осталась в колонке "сверх заказа" и считать и ее? Так как эта цифра в любом случае будет изыматься из следующего заказа(на практике). Мне еще кажется что если файл не перешел в папку old по причине отсутствия заказа на одном листе, то после ввода заказа на других листах, записи из этого файла считаются повторно...Vetali
Сообщение отредактировал Vetali - Воскресенье, 17.02.2013, 23:52
Как в файле тест? Вводим заказ 40 - проставляется дата - берется число из "сверх заказа" и помещается в "персонализировано" - ставится дата - ставится остаток. Это просто сделать по событию ввода нового заказа, но..... Если заказ равен или меньше значения "сверх заказа" то алгоритм сильно усложняется.
Как в файле тест? Вводим заказ 40 - проставляется дата - берется число из "сверх заказа" и помещается в "персонализировано" - ставится дата - ставится остаток. Это просто сделать по событию ввода нового заказа, но..... Если заказ равен или меньше значения "сверх заказа" то алгоритм сильно усложняется. AlexM
да как в файле тест. заказ всегда будет больше сверх заказа. только у меня не получилось почему-то...я удалил последнюю строчку и попытался ввести заказ самостоятельно но счеты не пошли. а форма да, такая как в вашем примере.
да как в файле тест. заказ всегда будет больше сверх заказа. только у меня не получилось почему-то...я удалил последнюю строчку и попытался ввести заказ самостоятельно но счеты не пошли. а форма да, такая как в вашем примере.Vetali
в файле тест макросов нет Еще вопрос. Новый заказ делается через одну пустую строку или может быть иначе? Если может быть иначе, то значение "сверх заказа" надо будет искать. Если всегда через строку, то искать не нужно.
в файле тест макросов нет Еще вопрос. Новый заказ делается через одну пустую строку или может быть иначе? Если может быть иначе, то значение "сверх заказа" надо будет искать. Если всегда через строку, то искать не нужно.AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
Сообщение отредактировал AlexM - Понедельник, 18.02.2013, 00:11