Новая задачка. Есть файл №1 содержит итоговый лист "Расчет" и рабочий лист в котором список номеров телефонов и соответствующий им код. Есть файл №2 содержит номера телефонов и сумму расхода по каждому из них.
В файле №1 надо на листе "Расчет" вывести сумму расходов по каждому из кодов на выбранный отчетный период. Файл №2 будет именоваться в соответствии с периодом (2012aug или 2012август, для форума приаттачил на английском)
\Изначально файл №2 вообще HTML, если можно брать прям его было бы еще лучше. Тот что я выложил это открытый в Excel html файл и сохраненный как xlsx и вырезано все лишнее\
Новая задачка. Есть файл №1 содержит итоговый лист "Расчет" и рабочий лист в котором список номеров телефонов и соответствующий им код. Есть файл №2 содержит номера телефонов и сумму расхода по каждому из них.
В файле №1 надо на листе "Расчет" вывести сумму расходов по каждому из кодов на выбранный отчетный период. Файл №2 будет именоваться в соответствии с периодом (2012aug или 2012август, для форума приаттачил на английском)
\Изначально файл №2 вообще HTML, если можно брать прям его было бы еще лучше. Тот что я выложил это открытый в Excel html файл и сохраненный как xlsx и вырезано все лишнее\ALARMus
Касательно замены инфы, над этим я и поработаю (закажу не полный список, а столько сколько я тут наэмулировал - 24 номера и уже в каком-нибудь редакторе исправлю номера и прочее)
Тот приложенный файл 2012aug.xlsx - этот как раз кусок того html - как его открыл 2010 excel
у меня 2010 офис
Касательно замены инфы, над этим я и поработаю (закажу не полный список, а столько сколько я тут наэмулировал - 24 номера и уже в каком-нибудь редакторе исправлю номера и прочее)
Тот приложенный файл 2012aug.xlsx - этот как раз кусок того html - как его открыл 2010 excelALARMus
Сообщение отредактировал ALARMus - Среда, 22.08.2012, 11:19
Непонятно с "Период можно выбирать" - выбирать из чего? Как это связать с файлами html? Похоже, что данные можно брать прямо из html, используя алгоритм как в UDFках по извлечению курсов валют со страниц банков. Но нужно конечно видеть файл. Т.е. в тексте страницы ищем номер телефона, далее находим "Итого по телефону:", правее берём сумму. Эти данные извлекаем на лист "Список", а уже с него формулой СУММЕСЛИ() суммируем по региону на лист "Расход" (вопрос - почему там нет кодов? Нужно занести.).
Я бы делал примерно так.
P.S. Прочитал про 161 мб - это уже серьёзнее, нужно подумать... Читать сразу весь файл вероятно не стОит - я бы вероятно читал построчно пока не найдётся нужный номер, затем ещё пару строк до данных. И всё. Или один раз прочитать всё, собрать нужную инфу в словарь, использовать.
Непонятно с "Период можно выбирать" - выбирать из чего? Как это связать с файлами html? Похоже, что данные можно брать прямо из html, используя алгоритм как в UDFках по извлечению курсов валют со страниц банков. Но нужно конечно видеть файл. Т.е. в тексте страницы ищем номер телефона, далее находим "Итого по телефону:", правее берём сумму. Эти данные извлекаем на лист "Список", а уже с него формулой СУММЕСЛИ() суммируем по региону на лист "Расход" (вопрос - почему там нет кодов? Нужно занести.).
Я бы делал примерно так.
P.S. Прочитал про 161 мб - это уже серьёзнее, нужно подумать... Читать сразу весь файл вероятно не стОит - я бы вероятно читал построчно пока не найдётся нужный номер, затем ещё пару строк до данных. И всё. Или один раз прочитать всё, собрать нужную инфу в словарь, использовать.Hugo
Да стандартно, например заводим новый лист, в котором в строку перечислены периоды в формате: 2012август, 2012сентябрь,.... На Листе расчета выбираешь из этого списка и имена html файлов как раз так и должны называться и находиться в той же папке где и файл расчета.
Почему нет кодов. Просто не определился как лучше - взять весь список кодов и вынести его как есть на расчетный лист или этот список будет попадать туда только по тем которые имеют не нулевую сумму. (скорее первое)
Quote (Hugo)
Прочитал про 161 мб - это уже серьёзнее
161Мб это в виде HTML. Опять же задача на ходу формулируется и уточняется. Не знаю может выгоднее (по времени и трудозатратам) открывать этот html в excel и сохранять уже в xlsx и работать далее с ним. в excel открывался 7 минут (в формате xlsx размер 61Мб)
Quote (Hugo)
ыбирать из чего?
Да стандартно, например заводим новый лист, в котором в строку перечислены периоды в формате: 2012август, 2012сентябрь,.... На Листе расчета выбираешь из этого списка и имена html файлов как раз так и должны называться и находиться в той же папке где и файл расчета.
Почему нет кодов. Просто не определился как лучше - взять весь список кодов и вынести его как есть на расчетный лист или этот список будет попадать туда только по тем которые имеют не нулевую сумму. (скорее первое)
Quote (Hugo)
Прочитал про 161 мб - это уже серьёзнее
161Мб это в виде HTML. Опять же задача на ходу формулируется и уточняется. Не знаю может выгоднее (по времени и трудозатратам) открывать этот html в excel и сохранять уже в xlsx и работать далее с ним. в excel открывался 7 минут (в формате xlsx размер 61Мб)ALARMus
Сообщение отредактировал ALARMus - Среда, 22.08.2012, 11:47
Ну думаю читать html как текст будет быстрее 7-ми минут (там ведь ещё и парсинг не мало времени занял), но т.к. объём не маленький, то не стОит читать его больше одного раза.
Ну думаю читать html как текст будет быстрее 7-ми минут (там ведь ещё и парсинг не мало времени занял), но т.к. объём не маленький, то не стОит читать его больше одного раза.Hugo
Пока идут раздумья откуда что читать, я немного в свою АДОшную дуду подую.
В запас набросал макрос для подготовки рафинированных данных на втором листе файла 2012aug.xlsx [vba]
Code
Sub prepareData()
'Перед запуском в редакторе VB в меню Tools\References установить ссылку (включить галку) 'на библиотеку "Microsoft ActiveX Data Objects ... Library", где ... - номер версии. 'Можно выбрать любой максимальный (6.0, 2.8, 2.5...) из того, что установлено на компьютере.
Dim rst As New ADODB.Recordset
[Лист1].Activate
With Columns("B:B") .WrapText = False .MergeCells = False On Error Resume Next .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" On Error GoTo 0 .CurrentRegion.Offset(0, 1).Resize(, 3).Name = "MyRange" End With
rst.Open _ "SELECT F1, F3 FROM MyRange WHERE F2 = 'Итого по телефону:'" _ , _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties='Excel 12.0;HDR=No'"
[Лист2!A1].CopyFromRecordset rst
End Sub
[/vba]
Пока идут раздумья откуда что читать, я немного в свою АДОшную дуду подую.
В запас набросал макрос для подготовки рафинированных данных на втором листе файла 2012aug.xlsx [vba]
Code
Sub prepareData()
'Перед запуском в редакторе VB в меню Tools\References установить ссылку (включить галку) 'на библиотеку "Microsoft ActiveX Data Objects ... Library", где ... - номер версии. 'Можно выбрать любой максимальный (6.0, 2.8, 2.5...) из того, что установлено на компьютере.
Dim rst As New ADODB.Recordset
[Лист1].Activate
With Columns("B:B") .WrapText = False .MergeCells = False On Error Resume Next .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" On Error GoTo 0 .CurrentRegion.Offset(0, 1).Resize(, 3).Name = "MyRange" End With
rst.Open _ "SELECT F1, F3 FROM MyRange WHERE F2 = 'Итого по телефону:'" _ , _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties='Excel 12.0;HDR=No'"
Нет, такой html не годится, нужен кусок (с начала) оригинального файла. Можно его попробовать разбить в ТоталКомандере на куски по 50к и прервать, как будет пару кусков готово (чтоб всего монстра не резать).
Нет, такой html не годится, нужен кусок (с начала) оригинального файла. Можно его попробовать разбить в ТоталКомандере на куски по 50к и прервать, как будет пару кусков готово (чтоб всего монстра не резать).Hugo
Вот что удалось наколдовать. Не знаю насколько остался оригинал - в редакторе убрал все телефоны и оставил список из 25.
(как колдовал: открыл в блокноте, скопировал все и вставил в FronPage (во вкладке КОД), заменил\удалил, скопировал код, вставил в блокноте и сохранил)
Вот что удалось наколдовать. Не знаю насколько остался оригинал - в редакторе убрал все телефоны и оставил список из 25.
(как колдовал: открыл в блокноте, скопировал все и вставил в FronPage (во вкладке КОД), заменил\удалил, скопировал код, вставил в блокноте и сохранил)ALARMus
Для начала проверьте на своём оригинальном файле (на изменённом работает):
[vba]
Code
Sub readhtml()
Dim oD As Object, cc As Range, cnt&
Set oD = CreateObject("scripting.dictionary")
For Each cc In Sheets("Список").[c3:c27].Cells oD.Item(Trim(cc.Value)) = 0 Next cnt = oD.Count
strFilePath = "D:\TMP\3\4\2012_aug_004UTF8.html"
Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTS = objFSO.OpenTextFile(strFilePath, 1)
Do Until objTS.AtEndOfStream 'пока не кончился файл strNextLine = objTS.Readline 'читаем посторочно If InStr(strNextLine, "Абонентский номер</td><td") Then t = Mid(strNextLine, InStr(strNextLine, "left") + 6, 11) For ii = 1 To 6: objTS.SkipLine: Next If oD.exists(t) Then oD.Item(t) = Val(Replace(objTS.Readline, ",", ".")) cnt = cnt - 1 If cnt = 0 Then Exit Do End If End If Loop
Set objFSO = Nothing Set objTS = Nothing strNextLine = Empty
For Each cc In Sheets("Список").[c3:c27].Cells cc.Offset(, 1) = oD.Item(Trim(cc.Value)) Next
End Sub
[/vba]
Вот именно так с каракулями - не стал пытаться перекодировать, да и это время занимает. Путь естественно поменяйте на свой, в листе "Список" нужно отобразить скрытый столбец D - туда должны вытянуться суммы.
Попутно с чтением файла считатаю количество вытянутых сумм. Как только оно равно количеству искомых номеров - можно прекращать читать файл. Возможно так сильно сократится время чтения файла.
Если всё сработает - то в общем уже и готово, на первый лист данные можно вытянуть формулами, если поместить туда список кодов. Ну а так можно потом подшлифовать по поводу динамических диапазонов, имени файла html, индикации работы...
Для начала проверьте на своём оригинальном файле (на изменённом работает):
[vba]
Code
Sub readhtml()
Dim oD As Object, cc As Range, cnt&
Set oD = CreateObject("scripting.dictionary")
For Each cc In Sheets("Список").[c3:c27].Cells oD.Item(Trim(cc.Value)) = 0 Next cnt = oD.Count
strFilePath = "D:\TMP\3\4\2012_aug_004UTF8.html"
Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTS = objFSO.OpenTextFile(strFilePath, 1)
Do Until objTS.AtEndOfStream 'пока не кончился файл strNextLine = objTS.Readline 'читаем посторочно If InStr(strNextLine, "Абонентский номер</td><td") Then t = Mid(strNextLine, InStr(strNextLine, "left") + 6, 11) For ii = 1 To 6: objTS.SkipLine: Next If oD.exists(t) Then oD.Item(t) = Val(Replace(objTS.Readline, ",", ".")) cnt = cnt - 1 If cnt = 0 Then Exit Do End If End If Loop
Set objFSO = Nothing Set objTS = Nothing strNextLine = Empty
For Each cc In Sheets("Список").[c3:c27].Cells cc.Offset(, 1) = oD.Item(Trim(cc.Value)) Next
End Sub
[/vba]
Вот именно так с каракулями - не стал пытаться перекодировать, да и это время занимает. Путь естественно поменяйте на свой, в листе "Список" нужно отобразить скрытый столбец D - туда должны вытянуться суммы.
Попутно с чтением файла считатаю количество вытянутых сумм. Как только оно равно количеству искомых номеров - можно прекращать читать файл. Возможно так сильно сократится время чтения файла.
Если всё сработает - то в общем уже и готово, на первый лист данные можно вытянуть формулами, если поместить туда список кодов. Ну а так можно потом подшлифовать по поводу динамических диапазонов, имени файла html, индикации работы...Hugo