Страницы: 1
RSS
Помогите встроить макрос в Excel
 
Есть файл отчета. Прямо в нем написали VBA Project (вызывается из меню Сервис/Макрос/Редактор Visual Basic/F5) для обработки. Функционирует нормально, но есть проблема. Данные отчета меняются каждую неделю, и для их отработки мне приходится вручную копировать текст из нового отчета в старый и там уже отрабатывать, что не есть удобно. Плюс результаты отработки он сохраняет в том же файле где и сам отчет, правда в другом листе. Тоесть контролирующим органам мне придется отдавать файл вместе с кодом макроса, что не есть желательно. Собственно вопрос. Как сделать так, чтобы Excel помнила этот код (скажем строка в меню или кнопка на панели инструментов) и отрабатывала текущий отчет без копирования напрямую?    
Код записан не в Модулях, а в Формах. Пробовал делать экспорт и вставить в пустую книгу - не вышло. Поскольку в исходном файле макрос отработанные данные переносил в Лист2, а в чистой книге ясное дело Листа2 нету...    
Извините если такой вопрос ранее уже задавался.
 
Да таких вопросов на Форуме полно. Без примера которые. Вариант решения: в отдельной книге размещаем тот самый проект, что у Вас имеется. При вызове макроса выбираем книгу, которую нужно обработать. Результат сохраняем в другой книге, где будут только данные. И органам всегда отдаём этот файл.
 
Да и правда не подумал приложить код. Исправляюсь.    
 
Поскольку это первая моя любовь с VBA хотел бы задать еще несколько вопросов в догонку.  
1. . Если человек вышел на работу сегодня, а ушел завтра (такое бывает) цикл отрабатывается с минусом. Не могу понять как нормально это отработать.  
2. Сложно ли неверные проходы (вход без выхода или выход без входа)вынести в отдельный лист в этом же файле скажем в виде:  
               Вход                 Выход  
Алексеенко 30.11.2009 10:25:06     хххххххххх  
Петренко      ххххххх           01.12.2009 19:51:48  
Сейчас они просто удаляются из обработки  
3. Можно ли в окно запуска автоматически подставлятьь первую и последнюю дату прямо из оотчета. Сейчас они набиваются вручную. Как сделать так чтобы это окно автоматически закрывалось после завершения?  
4. Время в виде дроби сделано для суммирования с помощью функции Итоги. Потом полученное по формуле переводится в часы и минуты. Автоматизировать я не сумел.  
5. Нет ли в коде явных ляпов и несуразностей который бросаются в глаза? :)  
Заранее спасибо за помощь.  
 
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
Евгений, посмотрел на Ваш файл (его кстати модераторы удалят, Вы правила не читали).  
Возникло несколько вопросов:  
1. К Вам поступает отдельный файл выгрузка и системы контроля доступа с данными как на лист1?  
2. Вам необходимо сохранить обработанный отчет/только данные/ в отдельной книге?  
3. Почему у Вас не суммируется время за одни сутки?  
4. Что за формат времени и почему он у Вас такой/ ведь запись 2,567 - это уже двое суток + какое-то время для Ехс.
 
1. К Вам поступает отдельный файл выгрузка и системы контроля доступа с данными как на лист1?  
Да  
 
2. Вам необходимо сохранить обработанный отчет/только данные/ в отдельной книге?  
Лучше в отдельном файле  
 
3. Почему у Вас не суммируется время за одни сутки?  
Потому что Excel не понимает время больше 24 часов. Если при сложении нескольких временных интервалов сумма получилась больше 24 часов, то Excel обнулит ее и начнет суммировать опять с нуля. А так оно считается нормально.  
 
4. Что за формат времени и почему он у Вас такой/ ведь запись 2,567 - это уже двое суток + какое-то время для Ехс.  
2,567 это 2 целых часа + 0,567часа.
 
Файл перезалил.
 
По п.1 (что время в минус считается).  
 
Время Excel умеет правильно отображать. Нужно поставить формат числа  [ч]:мм:сс;@ , тогда время 28:40:32 тоже будет отображаться правильно.
И вместо строчки    
.Cells(i, 5) = (TimeValue(a) - TimeValue(b)) * 86400 / 60 / 60  
напишите просто  
.Cells(i, 5) = TimeValue(a) - TimeValue(b)  
Тогда время будет вычитаться с учетом даты. И отображаться правильно.  
 
П.3-б. Чтобы окно в конце скрывалось, нужно в конец кода добавить  
Me.Hide
 
Спасибо за советы.  
Но считает все равно с минусом... правда теперь забивает ячейку ###  
 
По остальным вопросам есть идеи? :)
 
Евгений, конечно есть.  
Дату в текст боксы можно через формулы MIN() MAX() поднимать (хотя не понимаю зачем, да и идею с формой тоже). Сделать выбор файла источника данных при запуске макроса, после обработки - сохранить отчет в новую книгу (файл) без всяких лишних.  
Но есть одно НО. Не понимаю что Вам нужно в итоге, чего хотите достичь и для чего:((( А метод перебора решений - не мой...  
В общем, когда не понимаю что надо в итоге - не могу помочь.  
ЗЫ на алгоритме обработки засыпался....  
 
Option Explicit  
 
'---------------------------------------------------------------------------------------  
' Procedure : SobratxList по мотивам решения от Pavel55  
' DateTime  : 25.11.2009 21:48  
' Author    : Igor  
' Purpose   : http://www.planetaexcel.ru/forum.php?thread_id=11554  
           'for azz123  
'---------------------------------------------------------------------------------------  
'  
Sub SobratxList()  
 
   Dim BazaWb As Workbook      'файл для сбора данных  
   Dim BazaSht As Worksheet    'лист в файле для сбора данных  
   Dim SelectedItem As String  'имя файла выбранного в диалоге  
   Dim oAwb As String          'имя открытой книги  
 
   Dim repDate As Integer      'дата отчета  
   Dim iList As Worksheet      'поочередно просматриваемый лист с данными  
   Dim iCol As Integer         'номер столбца для найденой ячейки/даты  
   Dim kRow As Long         'строка в которой внесена дата  
   Dim insertRow As Integer    'строка для вставки  
   Dim kol As Long          'количество строк для копирования/вставки  
 
 
'включаем свой обработчик ошибок (если что-то пойдёт не так во время работы макроса)  
   On Error GoTo ErrHandler  
 
   With Application  
       'отлючаем обновление экрана - это убыстрит работу макроса  
       .ScreenUpdating = False  
       'включаем ручной пересчёт формул - это убыстрит работу макроса  
       .Calculation = xlManual  
       'отключаем отображения окон на панели задач на время выполнения макроса  
       .ShowWindowsInTaskbar = False  
       'присваиваем переменной BazaWb ссылку на общий файл  
       Set BazaWb = ActiveWorkbook  
       'присваиваем переменной BazaSht ссылку на активный лист в общем файле  
       Set BazaSht = BazaWb.ActiveSheet  
       'очищаем диапазон данных для ввода  
       BazaSht.Range("a2:h" & BazaSht.Cells(Rows.Count, 1).End(xlUp).Row + 1).ClearContents  
 
       'вызываем диалог выбора папки с файлами отчёта  
       With Application.FileDialog(msoFileDialogFilePicker)  
           .Title = "Выберите файл для отчета"    'надпись в окне диалога  
           'путь по умолчанию к папке /где расположен исходный файл  
           .InitialFileName = ThisWorkbook.Path & Application.PathSeparator & "*.xls*"  
           .AllowMultiSelect = False    'запрет выбора нескольких файлов  
           If .Show = False Then GoTo ErrHandler:  
           'For Each SelectedItem In .SelectedItems 'перебор файлов в папке  
           SelectedItem = .SelectedItems(1)    'при обработке нескольких - удалить  
           oAwb = Dir(SelectedItem, vbDirectory)  'запоминаем имя книги  
           Workbooks.OpenText SelectedItem         'открываем книгу  
           'операции с открытой книгой  
           With ActiveWorkbook  
..... можно обработать данные в исходной книге /Ваш макрос                
           End With  
 
           Workbooks(oAwb).Close False    'закрываем книгу без сохранения  
           'Next SelectedItem  
       End With  
 
 
       'включаем автоматический пересчёт формул, который отключили в начале макроса  
       .Calculation = xlAutomatic  
       'включаем отображения окон на панели задач, которое отключали в начали макроса  
       .ShowWindowsInTaskbar = True  
       'включаем обновление экрана, который отключили в начале макроса  
       .ScreenUpdating = True  
   End With  
 
   'вывод конечного сообщения  
   MsgBox "Информация собрана.", vbInformation, "Конец"  
 
   'на всякий случай отключаем все обработчики ошибок в данной процедуре  
   On Error GoTo 0  
   'конец процедуры  
   Exit Sub  
 
 
   'если во время макроса произошла какая-либо непредвиденная ошибка  
ErrHandler:  
   'включаем отключённые ранее функции Excel  
   With Application  
       .Calculation = xlAutomatic  
       .ShowWindowsInTaskbar = True  
       .ScreenUpdating = True  
   End With  
   'сообщение об ошибке  
   MsgBox "Произошла непредвиденная ошибка!" & Chr(10) & Err.Number & " (" & _  
          Err.Description & ") " & Chr(10) & _  
          "А хто его знает что Вы наделали!", 48, "Ошибка"  
End Sub
 
{quote}{login=Igor67}{date=03.01.2010 05:33}{thema=}{post}Но есть одно НО. Не понимаю что Вам нужно в итоге, чего хотите достичь и для чего:((( А метод перебора решений - не мой...  
В общем, когда не понимаю что надо в итоге - не могу помочь.  
ЗЫ на алгоритме обработки засыпался.... End Sub{/post}{/quote}  
 
Здравствуйте. Спасибо за ответ.  
В итоге нужно получить, сколько человек проработал в каждый из дней заданного промежутка, ну а потом по сумме дней за весь промежуток (обычно неделю). Форма нужна была чтобы в итоговом отчете было видно, какой примежуток рассматривается. По другому придумать не сумел.
 
Посмотрите вариант в файле, проверьте правильность формирования отчета.  
Нажмите на кнопку - выберите исходный файл и на листе результат проверьте...
 
{quote}{login=Igor67}{date=04.01.2010 02:36}{thema=}{post}Посмотрите вариант в файле, проверьте правильность формирования отчета.  
Нажмите на кнопку - выберите исходный файл и на листе результат проверьте...{/post}{/quote}  
 
Громадное спасибо за помощь!  
Макрос работает, но время он по прежнему суммирует неверно. Когда набегает больше 24 часов Эксель начинает новые сутки и сбрасывает время на 0. Можно ли это както решить?  
Можно ли задать в макросе задачу подсчета времени за весь промежуток по каждому из сотрудников чтобы не делать подсчеты вручную. Это аналог кнопки Данные/Итоги?
 
Сверил результаты вашего макроса и моего старого. Считает одинаково за исключением проблемы с часами. Добавил оба варианта ваш и свой. Красным отмечены суммы времени которые у вас посчитаны неверно (больше 24 отработки). мой вариант который через дробь эти суммы считает верно. для перевода дроби в нормальный вид я писал формулу  
=ЦЕЛОЕ(E5)&" ч " & ЦЕЛОЕ((E5-ЦЕЛОЕ(E5))*60) & " мин " & ОКРУГЛ(60*((E5-ЦЕЛОЕ(E5))*60-ЦЕЛОЕ((E5-ЦЕЛОЕ(E5))*60));0) & " сек"  
может вам она пригодится.
 
Евгений, в моем примере не может быть ни одного значения больше 24 часов. данные считаются построчно за 1 сутки.    
Держите вариант с подсчетом итога за период.    
ЗЫ и сколько можно говорить про форматы ячеек:((( Вы не слушаете и не пробуете:(((  
ЗЫ 2 для перевода в десятичный формат просто умножьте значение на 24...  
И у меня кажется все....
 
Вот теперь то, что доктор прописал. Огромное спасибо вам за помощь, Игорь. С наступающими праздниками.
Страницы: 1
Читают тему
Наверх