Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2013, 08:53   #1
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию много книг - один макрос

Всем снова здравствуйте!
каждый день формируется несколько файлов *xls
каждая книга содержит макрос,который формирует таблицу и копирует ее в буфер.
после закрытия месяца, мне приходится собирать с 80 книг эту таблицу в одну. т.е.
-открываю книгу результат.
-открываю каждую из 80 книг
-жму на макрос RunMe()
-перехожу в книгу результат
-ставлю дату(содержится в заголовке)
-ctrl+V.
-след книга.
это порядком поднадоело...поэтому нужна помощь местных гуру -__-

з.ы. возможно тема избитая-преизбитая....но поиск положительных результатов не дал(
в архиве файл результат и один из 80 файлов. макрос RunMe() делает то что нужно...

натолкните на чего-нить ;-)
Вложения
Тип файла: zip файлы.zip (157.6 Кб, 9 просмотров)
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 04.12.2013 в 09:06.
SaLoKiN вне форума Ответить с цитированием
Старый 04.12.2013, 09:11   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Что требуется? Собрать данные в один файл?
Тогда можете приспособить этот макрос для своей задачи:
http://excelvba.ru/code/CombineFiles

Цитата:
каждая книга содержит макрос,который формирует таблицу и копирует ее в буфер
неправильный подход
если файлов много - не надо в них плодить одинаковые макросы
весь код должен быть в одном файле - тогда будет намного проще
EducatedFool вне форума Ответить с цитированием
Старый 04.12.2013, 09:23   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Создаете один макрос в личной книге для формирования таблицы, сохранения ее в отдельную книгу и заполнения итоговой книги. Или используете надстройку из предыдущего поста.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 04.12.2013, 09:27   #4
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

EducatedFool
как всегда все шикарно =)

Код:
  ' ==== переносим данные в наш файл (shb - кодовое имя листа, куда помещаем данные)
           shb.Range("a" & shb.Rows.Count).End(xlUp).Offset(1).Resize(, ra.Rows.Count).Value = _
            Application.WorksheetFunction.Transpose(ra.Value)
по идее мне просто нужно где-то здесь запускать макрос открытой книги и помещать результат в shb.
верно?

Цитата:
неправильный подход
если файлов много - не надо в них плодить одинаковые макросы
весь код должен быть в одном файле - тогда будет намного проще
так получилось потому что, раньше я открывал каждый файл. и выполнял в нем макрос.
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 04.12.2013 в 10:05.
SaLoKiN вне форума Ответить с цитированием
Старый 04.12.2013, 11:29   #5
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

вот че придумал, прикручу свою функцию, у которой будет возвращаемый параметр(кол-во строк).
ток вот чего:
по книге гуляем, массивы грузим,считаем. а на выгрузке не дает.
это связано с тем что файл открыт только для чтения?
если так, то возможно ли из функции возвращать массив?
Код:
Function RunMe(ByVal WB As Workbook) As Integer

Dim i As Long, S As Long, j As Long, iLastRow As Long, ii As Long
Dim a, b
Dim y As Integer, y1 As Integer

Application.ScreenUpdating = False

'загрузить массив а значениями А3 J96
With WB.Sheets("НТК 1 ")
iLastRow = .Cells(1, 1).End(xlDown).Row 'до первой пустой строки в А или ставь 98
a = .Range(.Cells(3, 1), .Cells(iLastRow, 12)) ' загрузили массив А3 J96
End With
' создали массив  B для результата
ReDim b(1 To UBound(a, 1), 1 To 12)

j = 1
For ii = 99 To 144 'грубая прявязка к адресу
'подгрузили условия
    With WB.Sheets("НТК 1 ")
        compared1 = .Cells(ii, 4) ' marshrut
        compared2 = .Cells(ii, 6) ' nomer avto
        compared4 = 1 ' svoi mashini zzz = PrinadAvto(72)
    End With
'начинаем поиск
    For i = 1 To UBound(a) '96
        If a(i, 8) = compared1 Then
            If PrinadAvto(a(i, 11), WB) = compared4 Then
                b(j, 1) = compared2 'nomer avto
' убрал копирование, чтбы не мешало смотреть
                 j = j + 1
            End If
        End If
    Next
Next
'после след строки выходит из процедуры. а нужна сортировка.  что делать?
WB.Worksheets("для l5").Range(Cells(3, 1), Cells(j + 2, 10)) = b

WB.Worksheets("для l5").Sort.SortFields.Clear
WB.Worksheets("для l5").Sort.SortFields.Add Key:=Range(Cells(3, 1), Cells(j + 1, 1)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'A
    WB.Worksheets("для l5").Sort.SortFields.Add Key:=Range(Cells(3, 3), Cells(j + 1, 3)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'C
    WB.Worksheets("для l5").Sort.SortFields.Add Key:=Range(Cells(3, 9), Cells(j + 1, 9)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'I
    With WB.Worksheets("для l5").Sort
        .SetRange Range(Cells(3, 1), Cells(j + 1, 10)) 'A I
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
RunMe = j + 2 ' вернул кол-во строк
    
   
  ' Range(Cells(3, 1), Cells(j + 1, 9)).Select
   ' Range(Cells(3, 1), Cells(j + 1, 9)).Copy
    
    
    'ThisWorkbook.ActiveSheet.Range(Cells(3, 1), Cells(j + 2, 10))

'MsgBox "ep baby"
        
End Function
вызываю вот так
Код:
Sub LoadDataFromWorkbooks()
....
yo = RunMe(WB)
            MsgBox yo
UPD
установил у открываемого файла ReanOnly=FALSE.
результат тот-же...
доходит до строчки с выгрузкой и выбрасывает из функции. хелп?
поймал ошибку:
Application-defined or object-defined error
судя по всему я опять обращаюсь не к тому диапазону
WB.Worksheets("для l5").Range(Cells(3, 1), Cells(j + 2, 10)) = b
>Range опять куда попало у мя лезет?
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 04.12.2013 в 11:48.
SaLoKiN вне форума Ответить с цитированием
Старый 04.12.2013, 11:52   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Код:
WB.Worksheets("для l5").Range(Cells(3, 1), Cells(j + 2, 10)) = b
Обычная ошибка. Чьи Cells?

А вообще совершенно простая задача - цикл по файлам, каждый открываем, берём данные в массив, файл закрываем, определяем в сводном место выгрузки, выгружаем массив, открываем следующий файл и т.д...
Можно делать без массива, копированием диапазона.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.12.2013 в 11:55.
Hugo121 вне форума Ответить с цитированием
Старый 04.12.2013, 11:54   #7
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
Обычная ошибка
точки надо?
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 04.12.2013, 11:59   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Можно точки, чтоб буквы сэкономить:

Код:
with WB.Worksheets("для l5")
.Range(.Cells(3, 1), .Cells(j + 2, 10)) = b
end with
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 04.12.2013, 12:02   #9
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

блин какой раз на эти грабли натыкаюсь!
пора бы мне уже запомнить это) спасибо!
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение книг, с помещением данных на один лист Галина6663 Microsoft Office Excel 1 11.04.2012 16:22
много csv в один xls и обработка Dexter_M Microsoft Office Excel 26 23.09.2011 11:04
Один пакет много серверов IdTCPServer Horus92 Работа с сетью в Delphi 3 18.10.2010 12:28
вставка данных из разных книг в один лист Aigulasan Microsoft Office Excel 3 26.03.2010 22:17
много потоков и один stringlist m.a.x.i.m Общие вопросы Delphi 1 09.01.2010 22:41