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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2011, 17:04   #1
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию много csv в один xls и обработка

Доброго времени суток.
Столкнулся с такой проблемой: у меня есть данные, которые находятся в 140 файлах .csv которые надо переписать в один файл .xls. данные везде однотипные и структура файлов одна и та же: шапка под ней данные. После объединения в один файл необходимо посчитать сумму за месяцам (даны суточные данные потребления).
Поюзал поиск, не нашел вроде ничего подобного, если проморгал, то прошу прощения.
Стоит MS office 2007.
Был бы рад помощи.
Вложения
Тип файла: zip files.zip (5.0 Кб, 18 просмотров)
Dexter_M вне форума Ответить с цитированием
Старый 14.09.2011, 17:24   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вероятно так может получиться, если на каждый месяц свой файл - скриптом vbs ну или макросом работаем с файлами как с текстом (т.е.csv).
Будем собирать сразу суммы.
1 считаем количество файлов
Код:
msgbox CreateObject("Scripting.FileSystemObject").GetFolder("C:\Temp\csv\").Files.count
2 создаём массив на 3 колонки, высотой по количеству файлов (или если пропустить п.1, то на 1000, но лучше не пропускать)
3
Код:
For Each AFile In CreateObject("Scripting.FileSystemObject").GetFolder("C:\Temp\csv\").Files
читаем и считаем, результат сразу кладём в массив.
4 выгружаем массив.

Такой вариант подходит?
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 14.09.2011 в 17:27.
Hugo121 вне форума Ответить с цитированием
Старый 14.09.2011, 17:32   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Поюзал поиск, не нашел вроде ничего подобного
Плохо искали...
http://excelvba.ru/code/DATfolder2Array
EducatedFool вне форума Ответить с цитированием
Старый 14.09.2011, 17:49   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А вот вам тот же макрос, только заточенный под ваши файлы:



Суммы подсчитаете на отдельном листе, при помощи простейшей сводной таблицы или формул.

Последний раз редактировалось EducatedFool; 14.09.2011 в 19:44.
EducatedFool вне форума Ответить с цитированием
Старый 15.09.2011, 09:07   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Не дождался ответа на вопрос, ну да ладно, сделал такой вариант.
Рассчитано, что имеем каждый csv на свой месяц.
Код:
'Sub tt()

   ' FSO Constants
   Const ForReading = 1
   Const TristateUseDefault = -2
   Const PathToFolder = "C:\tmp\csv\"

' Instantiate the object
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set obj = objFSO.GetFolder(PathToFolder).Files

ReDim outarr(obj.Count, 2)

outarr(0, 0) = "Дата"
outarr(0, 1) = "Генерация, МВт*ч"
outarr(0, 2) = "Потребление, МВт*ч"

For Each AFile In obj
    ' open the text file read only
    Set objTS = objFSO.OpenTextFile(AFile, ForReading, False, TristateUseDefault)
       arr = Split(objTS.ReadAll(), Chr(10))
       objTS.Close
    Set objTS = Nothing
    
    ii = ii + 1
    outarr(ii, 0) = Mid(Split(arr(1), ";")(0), 4)
        For i = 1 To UBound(arr)
            If Len(arr(i)) Then
            outarr(ii, 1) = outarr(ii, 1) + --Split(arr(i), ";")(1)
            outarr(ii, 2) = outarr(ii, 2) + --Split(arr(i), ";")(2)
            End If
        Next
Next

Set objExcel = CreateObject("Excel.Application"):  objExcel.Workbooks.Add
objExcel.Cells(1, 1).Resize(UBound(outarr) + 1, 3) = outarr
objExcel.Range("A:C").EntireColumn.AutoFit
objExcel.Visible = True
  
Set objExcel = Nothing
Set obj = Nothing
Set objFSO = Nothing

'End Sub
Этот текст сохранить как *.vbs и запустить.
Можно использовать и как макрос, если раскомментировать первую и последнюю строки, ну и тогда ещё можно объявить переменные.
Возможно, перед выгрузкой можно задать текстовый формат первому столбцу, чтобы месяц выгружался вида 01-2000, а не янв.00 - как сейчас у меня происходит на автомате.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 15.09.2011, 09:37   #6
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Уважаемые EducatedFool и Hugo121, спасибо огромное! без вас наверно помер бы...
Еще раз извиняюсь за создание лишней темы...
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 10:14   #7
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А вот вам тот же макрос, только заточенный под ваши файлы:

В Вашем примере начиная с 1151 строки изменился формат даты.
После применения его к моим файлам получилось, что до 12 числа каждого месяца формат выглядит, как ММ.ДД.ГГГГ, а с 13 до конца месяца ДД-ММ-ГГГГ.

Покопался, нотак и не понял, с чем это связано...

P.S.: Приношу извинения за назойливость и необразованность в данном вопросе.
Вложения
Тип файла: zip file.zip (112.9 Кб, 18 просмотров)
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 10:30   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Свазано с тем, что в году 12 месяцев
Т.е. неправильно дата определяется.
Можно подлечить так:

.Columns(1).NumberFormat = "@"

Код:
    With sh
        .UsedRange.ClearContents
        ColumnsNamesCount = UBound(ColumnsNames) - LBound(ColumnsNames) + 1
        .Range("a1").Resize(, ColumnsNamesCount).Value = ColumnsNames
        .Range("a1").Resize(, ColumnsNamesCount).Interior.ColorIndex = 15
        .Columns(1).NumberFormat = "@"
        .Range("a2").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
        '.UsedRange.EntireColumn.AutoFit
    End With
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 15.09.2011, 11:16   #9
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Свазано с тем, что в году 12 месяцев
Т.е. неправильно дата определяется.
Можно подлечить так:

.Columns(1).NumberFormat = "@"
Еще раз огромное спасибо, теперь все отлично работает!
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 11:21   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну а мой скрипт как? Пригодился? Результаты сошлись?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авто экспорт из XLS в CSV kir1381 Microsoft Office Excel 6 10.11.2011 00:47
Перенос с xls в csv Fart Microsoft Office Excel 7 24.10.2011 23:11
Вопрос к специалистам: много файлов csv в xls foridi Microsoft Office Excel 1 02.08.2010 05:35
Копирование данных из csv в xls Lenin21 Microsoft Office Excel 0 06.11.2008 21:10
Поиск *.csv и *.xls файлов Len@ Microsoft Office Excel 18 28.07.2008 22:31