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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2010, 15:55   #11
biv
Пользователь
 
Регистрация: 05.07.2010
Сообщений: 12
По умолчанию

Прошу, подскажите что-нибудь.. или скажите, что ничего нельзя сделать
biv вне форума Ответить с цитированием
Старый 03.08.2010, 18:19   #12
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

можно...
добавил два листа Отчет1 и Отчет2.
Отчет1 работает по такому алгоритму:
в колонке 3 предварительно записываются 17-значные коды, начиная с строки 2. По каждому коду собирается сумма значений из 13 колонки.
Отчет2:
перебирает все возможные 17-значные коды, которые есть на листах Документ (1) ... Документ (12).
В качестве исходных данных рассматриваются только листы, имя которых начяинается со слова "Документ"
Собраные суммы записываются в 9 колонку.
Вложения
Тип файла: rar Книга374.rar (49.9 Кб, 9 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.08.2010, 19:04   #13
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
можно...
добавил два листа Отчет1 и Отчет2.
Отчет1 работает по такому алгоритму:
в колонке 3 предварительно записываются 17-значные коды, начиная с строки 2. По каждому коду собирается сумма значений из 13 колонки.
Отчет2:
перебирает все возможные 17-значные коды, которые есть на листах Документ (1) ... Документ (12).
В качестве исходных данных рассматриваются только листы, имя которых начяинается со слова "Документ"
Собраные суммы записываются в 9 колонку.
А это нормально, что в результирующем списке коды дублируются?
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 03.08.2010, 19:13   #14
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

И еще вопрос к автору:
А чем не устраивает функционал Сводных таблиц с несколькими диапазонами консолидации? См. пример.
Вложения
Тип файла: zip Multiple Consolidation Levels.zip (95.3 Кб, 20 просмотров)
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 03.08.2010, 19:21   #15
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Это абсолютно неприемлемо!!!
Спасибо за проявленую бдительность.
строку
Код:
rw = WorksheetFunction.Match(Right(Sheets(sh).Cells(r2, 1), 17), Range(Cells(1, 3), Cells(r2-1, 3)), 0)
надо заменить на
Код:
rw = WorksheetFunction.Match(Right(Sheets(sh).Cells(r2, 1), 17), Range(Cells(1, 3), Cells(r, 3)), 0)
все должно наладиться...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.08.2010, 20:10   #16
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
...Спасибо за проявленую бдительность...
Не то чтобы я специально проверял правильность кода. Я как раз использовал его результат как эталон для проверки моего решения, когда обнаружил повторы :-)
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 04.08.2010, 00:03   #17
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я сделал на массивах, перебор листов позаимствовал (зачем писать с нуля ) - работает быстро, среднее время 0,21875 сек.
Правда результат с пустыми значениями, и не сортированный, это можно в коде поправить, но пока надо руками удалить строки с нулями и отсортировать - тогда можно сравнивать. В основном данные совпадают, но есть и расхождения, например
10601030100000110 = 179944,66 - в отчёте 541565.58
Можно ещё прикрутить и сравнение - например покрасить красным несовпадающие значения . Но это уже потом, если код понравится.
И будете сравнивать Вашу "ненавистную справка" за пару секунд - как бы кого не уволили за ненадобностью...
Код:
Sub hugo()
'tm = Timer
'Сперва вручную добавить лист для вывода данных, рассчитано на 13-й лист
Dim a(), b(), flag As Boolean, iLastrow As Long, i As Long, ii As Long, iiLastrow As Long
Dim x As Long
ReDim b(2, x)

For Each sh In Sheets
If Mid(sh.Name, 1, 8) <> "Документ" Then Exit For
With Sheets(sh.Name)

iLastrow = .Cells(9, 1).End(xlDown).Row - 1
a = Range(.Cells(9, 1), .Cells(iLastrow, 13)).Value
iiLastrow = iLastrow - 8
For i = 1 To iiLastrow
flag = True
For ii = 0 To x
If Mid(a(i, 1), 4, 10) & "0000" & Right(a(i, 1), 3) = b(0, ii) Then
b(2, ii) = b(2, ii) + a(i, 13)
flag = False
End If
Next
If flag Then
b(0, x) = Mid(a(i, 1), 4, 10) & "0000" & Right(a(i, 1), 3)
b(2, x) = a(i, 13)
x = x + 1
ReDim Preserve b(2, x)
End If
Next

End With
Next

Sheets(13).Columns("A:A").NumberFormat = "@"
Range(Sheets(13).Cells(1, 1), Sheets(13).Cells(x, 3)).Value = WorksheetFunction.Transpose(b)
'Debug.Print Timer - tm
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.08.2010 в 00:35.
Hugo121 вне форума Ответить с цитированием
Старый 04.08.2010, 03:16   #18
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Не совсем понятно в отчете..
Но как я понял - так и сделал программу
Результаты воводит на листь "Отчёт"
Вложения
Тип файла: rar справка 2.rar (36.1 Кб, 11 просмотров)
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 04.08.2010, 09:15   #19
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

alex77755, в начале на нули три знака заменить надо.
Долго перебор работает - мой код на рабочей машине в среднем за 0.15625 отрабатывает (вроде меньше технически не показывает).

P.S.Вот такой вариант - передумал красить, это нефункционально. Ставлю пометки, по которым легко отсортировать.
Код:
Sub hugo2()
'tm = Timer
'Сперва вручную добавить лист для вывода данных, рассчитано на 13-й лист
Dim a(), b(), flag As Boolean, iLastrow As Long, i As Long, ii As Long, iiLastrow As Long
Dim x As Long
ReDim b(3, x)

For Each sh In Sheets
If Mid(sh.Name, 1, 8) <> "Документ" Then Exit For
With Sheets(sh.Name)

iLastrow = .Cells(9, 1).End(xlDown).Row - 1
a = Range(.Cells(9, 1), .Cells(iLastrow, 13)).Value
iiLastrow = iLastrow - 8
For i = 1 To iiLastrow
flag = True
For ii = 0 To x
If Mid(a(i, 1), 4, 10) & "0000" & Right(a(i, 1), 3) = b(0, ii) Then
b(2, ii) = b(2, ii) + a(i, 13)
flag = False
End If
Next
If flag Then
b(0, x) = Mid(a(i, 1), 4, 10) & "0000" & Right(a(i, 1), 3)
b(2, x) = a(i, 13)
x = x + 1
ReDim Preserve b(3, x)
End If
Next

End With
Next

'# Диалог открытия файла
Set objFSO = CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists("C:\temp\biv\отчет.txt") Then
   Set objTextFile = objFSO.OpenTextFile("C:\temp\biv\отчет.txt", 1)
Else
   '# Диалог открытия файла
   Set objDialog = CreateObject("UserAccounts.CommonDialog")
   objDialog.Filter = "TXT Files|*.txt|All Files|*.*"
   objDialog.FilterIndex = 1
   objDialog.InitialDir = "C:\temp\biv\"
   intResult = objDialog.ShowOpen
   If intResult = 0 Then Wscript.Quit
   Const ForReading = 1
   Set objTextFile = objFSO.OpenTextFile(objDialog.Filename, ForReading)
End If

sep_ = Mid$(1 / 2, 2, 1)

Do Until objTextFile.AtEndOfStream 'пока не кончился файл
  strNextLine = objTextFile.Readline 'читаем посторочно
temnm = Mid(strNextLine, 9, 17)
tempsm = Trim(Mid(strNextLine, 78, 14))
If tempsm <> "" Then tempsm = CDbl(Replace(tempsm, ".", sep_))
For i = 0 To x
If b(0, i) = temnm Then
    If Trim(b(2, i)) <> "" Then
        If CDbl(Trim(b(2, i))) = tempsm Then
        b(3, i) = "совпадает"
        Else
        b(3, i) = "не совпадает"
        End If
    End If
End If
Next
Loop


Sheets(13).Columns("A:A").NumberFormat = "@"
Range(Sheets(13).Cells(1, 1), Sheets(13).Cells(x, 4)).Value = WorksheetFunction.Transpose(b)
'Debug.Print Timer - tm
End Sub
В результате не совпадают:
10601030100000110 179944.66 не совпадает
11201000010000120 578269.37 не совпадает
10503000010000110 13234.4 не совпадает
Есть ещё ненайденное 20805000100000180 46055.01

Добавил файл - текстовик используйте свой, будет предложено открыть.
Можно использовать в работе, но вообще-то надо немного изменённый код переложить в третий файл, из которого кодом открывать оба сравниваемых файла, и куда выводить данные сравнения. Так работать будет проще: получили файлы с данными - открыли файл с кодом - запустили макрос - выбрали, что сравнивать - готово.
Вложения
Тип файла: rar справка 2 hugo.rar (35.5 Кб, 9 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.08.2010 в 10:27.
Hugo121 вне форума Ответить с цитированием
Старый 04.08.2010, 12:05   #20
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

biv, а Вы переживали...
то все молчали по очереди, то набросали разных вариантов.
Теперь, как говорится, задачи найти 10 различий, точнее - задача найти хоть какие-то сходства в результатах. Вы лицо заинтересованное, Вам и разбираться...А отчет небось пришлось вручную колбасить?

Hugo121, вот эта строчка
Код:
If Mid(sh.Name, 1, 8) <> "Документ" Then Exit For
неудачный вариант. Как только встретиться лист с именем не "Документ" цикл будет прерван и некоторые листы могут быть не обработаны.
лучше так написать:
Код:
If Mid(sh.Name, 1, 8) = "Документ" Then
и закрыть это ЭндИфом в правильном месте. Тогда цикл пройдется наверняка по всем листам.

Выложу исправленный вариант.
Вложения
Тип файла: rar Книга374.rar (46.3 Кб, 11 просмотров)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сгруппировать код segail Microsoft Office Excel 2 02.07.2010 14:46
Как вывести данные активной строки excel? kipish_lp Microsoft Office Excel 4 25.02.2010 17:18
Как удалить все строки в Excel содержащие.. Dux Microsoft Office Excel 15 11.09.2009 04:41
Как в Excel красить строки? Xamer Microsoft Office Excel 1 24.06.2009 11:53