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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2011, 13:32   #11
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

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

.Columns(1).NumberFormat = "@"
а можно как-нибудь придать данным формат даты? эксель при такой загрузке распознает их как текст


Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Ну а мой скрипт как? Пригодился? Результаты сошлись?
Да, помогло, только оказалось, что не во всех файлах значения даны за один месяц, в некоторых половина одного, а половина другого... не пойму, как с этим бороться...
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 13:56   #12
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Можно побороть словарём.
И с датой можно побороться - нужно принудительно в дату правильно перевести перед помещением в массив, а не пускать на самотёк при выгрузке.
Тогда @ можно убрать.
Или попробуйте вместо @ задать явно нужный формат столбцу.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 15.09.2011, 14:09   #13
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Можно побороть словарём.
И с датой можно побороться - нужно принудительно в дату правильно перевести перед помещением в массив, а не пускать на самотёк при выгрузке.
Тогда @ можно убрать.
Или попробуйте вместо @ задать явно нужный формат столбцу.
пробовал вместо "@" ставить "DD.MM.YYYY", но получалось тоже самое, что и тут


Цитата:
Сообщение от Dexter_M Посмотреть сообщение
... до 12 числа каждого месяца формат выглядит, как ММ.ДД.ГГГГ, а с 13 до конца месяца ДД-ММ-ГГГГ.
Подскажите, как еще побороть это?
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 14:19   #14
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Для расчета суммарных значений в итоговом файле воспользовался функцией:
Код:
Function Sum_M_Y(Дата As Range, Значения As Range, Месяц As Integer, Год As Integer) As Double
    Dim cell As Range
    For Each cell In Дата
        If Month(cell) = Месяц And Year(cell) = Год Then Sum_M_Y = Sum_M_Y + Cells(cell.Row, Значения.Column)
    Next
  
End Function
Правда она работает, только если в первом столбце будет дата...
И моих знаний не хватает, что бы понять, как сделать так, что бы она сама по всему диапазону прошла и вывела на новый лист данные по месяцам, т.е. в первом столбце месяц и год, а во втором значение.
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 14:20   #15
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Можно в Function CSVfolder2Array() так в конце изменить:

Код:
...
...
        Next j
     newArr(i + 1, 1) = _
     CDate(Mid(newArr(i + 1, 1), 4, 2) & "/" & _
           Mid(newArr(i + 1, 1), 1, 2) & "/" & _
           Mid(newArr(i + 1, 1), 7, 4))
    Next i
    CSVfolder2Array = newArr
    Application.StatusBar = False
End Function
И даже без CDate() можно обойтись - теперь Эксель и сам поймёт.


Так Вам нужны вообще промежуточные значения или нет?
Если не нужны, то я постараюсь свой csv скрипт доделать, чтобы смешанные по месяцам файлы брал.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 15.09.2011 в 14:24.
Hugo121 вне форума Ответить с цитированием
Старый 15.09.2011, 14:48   #16
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Так Вам нужны вообще промежуточные значения или нет?
Если не нужны, то я постараюсь свой csv скрипт доделать, чтобы смешанные по месяцам файлы брал.
мне не надо промежуточных значений, только суммарные по месяцам.
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 14:55   #17
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Можно в Function CSVfolder2Array() так в конце изменить:

Код:
...
...
        Next j
     newArr(i + 1, 1) = _
     CDate(Mid(newArr(i + 1, 1), 4, 2) & "/" & _
           Mid(newArr(i + 1, 1), 1, 2) & "/" & _
           Mid(newArr(i + 1, 1), 7, 4))
    Next i
    CSVfolder2Array = newArr
    Application.StatusBar = False
End Function
И даже без CDate() можно обойтись - теперь Эксель и сам поймёт.
Сделал так и опять получилась путаница...
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 15:47   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

У меня нормально получилось. Не знаю, что там у Вас - может локаль мешает?

Вообще всё, что мы тут напрограммировали (особенно EducatedFool ) - для ленивых.
Есть прекрасный дедовский способ - пишем бат:

@echo off
copy /b *.csv all.csv
start all.csv

или просто тупо в коммандной строке выполняем
copy /b *.csv all.csv

Это всё на папке с файлами.
Теперь этот all.csv сортируем по первому столбцу, удаляем снизу лишние строки (одну можно наверх перенести) - готово!


Но если нужны только суммарные по месяцам - то постараюсь свой скрипт доделать чуть попозже.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 15.09.2011 в 17:46.
Hugo121 вне форума Ответить с цитированием
Старый 15.09.2011, 16:04   #19
Dexter_M
Пользователь
 
Регистрация: 13.09.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
У меня нормально получилось. Незнаю, что там у Вас - может локаль мешает?

Вообще всё, что мы тут напрограммировали (особенно EducatedFool ) - для ленивых.
Есть прекрасный дедовский способ - пишем бат:

@echo off
copy /b *.csv all.csv
start all.csv

или просто тупо в коммандной строке выполняем
copy /b *.csv all.csv

Это всё на папке с файлами.
Теперь этот all.csv сортируем по первому столбцу, удаляем снизу лишние строки (одну можно наверх перенести) - готово!
Просто у мя таких файло по всем регионам Росси по 140 штук, и соответственно для всех это надо повторять.

Во вложении то, что у мя получается с моими данными.

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Но если нужны только суммарные по месяцам - то постараюсь свой скрипт доделать чуть попозже.
Спасибо!
Вложения
Тип файла: zip archive.zip (184.2 Кб, 10 просмотров)

Последний раз редактировалось Dexter_M; 15.09.2011 в 16:45. Причина: Загрузил файл не с тем кодом
Dexter_M вне форума Ответить с цитированием
Старый 15.09.2011, 16:48   #20
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, 2)

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

With CreateObject("Scripting.Dictionary")
   .CompareMode = vbTextCompare

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

        For i = 1 To UBound(arr)
        If Len(arr(i)) Then
        s = Mid(Split(arr(i), ";")(0), 4)
            If Not .Exists(s) Then
                j = j + 1: .Item(s) = j
                outarr(j, 0) = Mid(Split(arr(i), ";")(0), 4, 8)
                For k = 1 To 2: outarr(j, k) = --Split(arr(i), ";")(k): Next
            Else
                u = .Item(s)
                For k = 1 To 2: outarr(u, k) = outarr(u, k) + --Split(arr(i), ";")(k): Next
            End If

        End If
        Next
Next

End With

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

Set objExcel = Nothing
Set obj = Nothing
Set objFSO = Nothing

'End Sub
Проверил, отработало на
Const PathToFolder = "C:\tmp\csv\Генерация и потребление в ОЭС Центра (суточные)\"
Но суммы не проверял - это Ваша ответственность

P.S. февраль и март сошлись (лишние данные в файле и данные в разных файлах):
фев.00 14132647 14207942
мар.00 14631100 14712178
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 15.09.2011 в 17:23.
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