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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2010, 17:06   #1
mmvds
Новичок
Джуниор
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию Вытащить данные из нескольких файлов

Здравствуйте, подскажите пожалуйста, как решить такую проблему:
есть много файлов вида f_dd.mm.yyyy.csv (текстовый с разделителем ";") в них содержатся данные за дату dd.mm.yyyy по двум товарам A и B
например:
A;300
B;800
Как объединить все эти данные в одну таблицу, например с такой шапкой:
ДАТА А B
С экселем дружу не сильно, в голову приходит только макрос на открытие файла, копирование, вставка но опять же это придется записывать вручную для каждого файла его имя.
mmvds вне форума Ответить с цитированием
Старый 07.11.2010, 17:25   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от mmvds Посмотреть сообщение
С экселем дружу не сильно, в голову приходит только макрос на открытие файла
А мне пришла мысль,
-а не выложить ли парочку файлов CSV
строк по 20 каждый.Да бы тот,кто будет писать макрос не напрягался в создании файлов.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 07.11.2010, 17:39   #3
mmvds
Новичок
Джуниор
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

Добавил вложение с несколькими файлами, на самом деле их гораздо больше, но думаю для теста этого хватит
Вложения
Тип файла: rar AB.rar (495 байт, 12 просмотров)
mmvds вне форума Ответить с цитированием
Старый 07.11.2010, 17:51   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Объединить можно так:
copy /b f*.csv all.csv
Потом кодом переложить по колонкам, и добавить шапку.
Хотя дата так будет потеряна...
Ну как простой вариант.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 07.11.2010 в 17:56.
Hugo121 вне форума Ответить с цитированием
Старый 07.11.2010, 18:20   #5
mmvds
Новичок
Джуниор
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

Перерывов в датах нет, так что ничего не потеряется, единственная проблема, обработалось в таком порядке:
f_01.11.2010.csv
f_02.11.2010.csv
f_03.11.2010.csv
f_04.11.2010.csv
f_05.11.2010.csv
f_31.10.2010.csv
Т.е. файл за 31.10.2010 обработался последним
mmvds вне форума Ответить с цитированием
Старый 07.11.2010, 18:32   #6
mmvds
Новичок
Джуниор
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

в принципе можно объеденять по месяцам, т.е. copy /b f*10.2010.csv all.csv
Тогда остается одна проблема, как таблицу вида
A 1537
B 5634
A 3453
B 2834
A 734
B 910
A 1612
B 678
A 3431
B 2671
A 1634
B 2934
Перевести в таблицу с двумя столбцами
A B
mmvds вне форума Ответить с цитированием
Старый 07.11.2010, 20:30   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну перевести в два столбца не проблема, есть много вариантов.
Например, перебирать циклом, анализировать первый столбец и соответственно копировать в один или другой столбец.
Я бы сделал на массивах.
Евгений наверняка предложит на ADO.
Но всеж даты важны или не очень? Потому что перебирать файлы тоже можно, но код будет сложнее. Сложить всё в один файл и преобразовать его намного легче.

На массивах вот прикидка, вместо b12 нужно динамически границу определить, например
iLastrow = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
all = Range("a1:b" & iLastrow).Value


Код:
Sub AB()
Dim all(), a(), b()
all = [a1:b12].Value
ReDim a(1 To UBound(all), 1 To 1)
ReDim b(1 To UBound(all), 1 To 1)

For i = 1 To UBound(all)
Select Case all(i, 1)
Case "A"
aa = aa + 1
a(aa, 1) = all(i, 2)
Case "B"
bb = bb + 1
b(bb, 1) = all(i, 2)
End Select
Next
[c1] = "A"
[d1] = "B"
[C2].Resize(aa, 1).Value = a    'выгружаем результат
[D2].Resize(bb, 1).Value = b    'выгружаем результат
End Sub
Ну и бонусом пример перебора всех файлов папки, можно переделать на открытие всех csv, можно добавить анализ даты в имени... но лениво...

Код:
Sub summdata()
Dim FSO
Dim TheFolder, TheFiles, AFile
Application.ScreenUpdating = False
Set wb = ThisWorkbook
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TheFolder = FSO.GetFolder("C:\temp\svod\") 'Каталог, откуда суммировать
Set TheFiles = TheFolder.Files
For Each AFile In TheFiles
If UCase(FSO.GetExtensionName(AFile.Path)) = "XLS" Then
Set xls = Workbooks.Open(Filename:=AFile, ReadOnly:=True)
wb.Sheets(1).[aj2] = wb.Sheets(1).[aj2].Value + xls.Sheets(1).[aj2].Value
'сюда добавить аналогичные строки по другим ячейкам
xls.Close False
End If
Next
Application.ScreenUpdating = True
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 07.11.2010 в 20:57.
Hugo121 вне форума Ответить с цитированием
Старый 07.11.2010, 21:24   #8
mmvds
Новичок
Джуниор
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

Hugo121, Большое спасибо за помощь (проверьте вебмани)
Сделал так:
1) По месяцам:
PHP код:
copy /b f*01.2010.csv 01.csv
copy 
/b f*02.2010.csv 02.csv
copy 
/b f*03.2010.csv 03.csv
copy 
/b f*04.2010.csv 04.csv
copy 
/b f*05.2010.csv 05.csv
copy 
/b f*06.2010.csv 06.csv
copy 
/b f*07.2010.csv 07.csv
copy 
/b f*08.2010.csv 08.csv
copy 
/b f*09.2010.csv 09.csv
copy 
/b f*10.2010.csv 10.csv
copy 
/b f*11.2010.csv 11.csv 
Теперь за год:
PHP код:
copy /??.csv all.csv 
2) потом новый столбец D,E в D1="A" в E1="B" формулой =ЕСЛИ($D$1=A1;B1;"") растягиваем вниз по D, =ЕСЛИ($E$1=A1;B1;"") вниз по E
Получили столбец D где данные по А, где данные по Б - пусто, для соседнего столбца E - наоборот

3)Избавляемся от лишних пробелов:
Присваиваем Столбцу D Имя ЕстьПустые1, столбцу E Есть Пустые2
Столбцу F НетПустых1, столбцу G НетПустых2
встаем в F1
PHP код:
=ЕСЛИ(СТРОКА()-СТРОКА(НетПустых1)+1>ЧСТРОК(ЕстьПустые1)-СЧИТАТЬПУСТОТЫ(ЕстьПустые1);"";ДВССЫЛ(АДРЕС(НАИМЕНЬШИЙ((ЕСЛИ(ЕстьПустые1<>"";СТРОКА(ЕстьПустые1);СТРОКА()+ЧСТРОК(ЕстьПустые1)));СТРОКА()-СТРОКА(НетПустых1)+1);СТОЛБЕЦ(ЕстьПустые1);4))) 
Аналогично для G1
растягиваем до половины таблицы
добавляем даты в столбец с датой 01.01.2010, 02.01.2010, растягиваем вниз пока есть значения, убеждаемся, что последняя дата- сегодняшнее число, все готово

Муторно конечно, но вроде работает

Последний раз редактировалось mmvds; 07.11.2010 в 22:20.
mmvds вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос, вытащить данные и расставить по местам kzld Microsoft Office Excel 25 06.01.2013 09:11
вытащить данные из бинарного файла Sanprof Общие вопросы Delphi 21 25.06.2010 10:37
Сумировать данные из нескольких файлов excel в 1 общий Miishka Microsoft Office Excel 8 12.11.2009 07:49
Как из нескольких файлов *.xls выбрать нужные данные суммировать их и скопировать в уже готовую форму Иван123456 Microsoft Office Excel 2 07.08.2009 21:50
Вытащить данные из MySQL Droid PHP 3 22.12.2008 23:23