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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2011, 15:43   #1
Magnetic Air
Пользователь
 
Регистрация: 28.01.2011
Сообщений: 29
По умолчанию проверка чисел в разных файлах

Есть два файла, в них столбцы с не уникальными числами (могут повторяться) под названием "Сумма". Но разница в том, что одном файле числа идут списком (т.е. в одной ячейке одно число), а в другом формулой, вида =А+В+... (например = 500,00+300,00). Если все числа в одном файле совпадают со всеми числами в другом, то все правильно, если нет, то msgBox с несовпадениями.
Подскажите какой командой вытаскивать числа из формулы, и как уже проверенные числа исключать (чтобы повторно не проверялись)?
Вложения
Тип файла: rar Primer_1.rar (4.6 Кб, 19 просмотров)
Magnetic Air вне форума Ответить с цитированием
Старый 04.05.2011, 09:06   #2
Magnetic Air
Пользователь
 
Регистрация: 28.01.2011
Сообщений: 29
По умолчанию

аппп ппппппп пппп
Magnetic Air вне форума Ответить с цитированием
Старый 05.05.2011, 22:35   #3
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Девки у Вас дорогущие

Как связать Статьи с дихлофосом и огурцами? Что делать, если в разных статьях встретятся одинаковые числа?
vikttur вне форума Ответить с цитированием
Старый 06.05.2011, 08:33   #4
Magnetic Air
Пользователь
 
Регистрация: 28.01.2011
Сообщений: 29
По умолчанию

Остряки... Поэтому и спрашиваю, как взаимоисключить числа после проверки по ходу процедуры
Magnetic Air вне форума Ответить с цитированием
Старый 06.05.2011, 08:37   #5
Magnetic Air
Пользователь
 
Регистрация: 28.01.2011
Сообщений: 29
По умолчанию

т.е. макрос берет из файла 1 первую цифру, далее ищет в файле 2 равную, найдя он их взаимоисключает (какбе удаляет) next
берет из файла 1 вторую цифру, далее ищет в файле 2 равную если не находит то говорит сообщением next
и т.д.
Magnetic Air вне форума Ответить с цитированием
Старый 06.05.2011, 10:26   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Может быть так - сперва пройтись по всем формулам одного списка (вероятно, "Сумма" и "Оплачено" нужно анализировать раздельно) и с помощью RegExp извлечь числа в словарь, помещая в Item количество повторов.
Потом пройтись так же по формулам второго диапазона, сверяя с словарём и уменьшая Item. В процессе если Item уже 0 или в словаре нет - значит пары нет. В конце анализируем словарь - если есть с Item>0, значит тоже нет пары.
Мне реализовать затруднительно, ибо хромаю в RegExp.

Хотя... можно без RegExp - просто тупо убить "=", заменить "+" на пробел и Split его...

Вроде этого, потренировался на "остатках":
Код:
Sub tt()
Dim cc As Range, temp$, x

With CreateObject("Scripting.Dictionary")

For Each cc In [e9:e21]
temp = cc.Formula
temp = Replace(temp, "=", "")
temp = Replace(temp, "+", " ")
temp = Application.Trim(temp)
For Each x In Split(temp)
 If Not .Exists(x) Then
 .Item(x) = 1
 Else
 .Item(x) = .Item(x) + 1
 End If
Next
Next

On Error Resume Next
Range("E30").Resize(.Count) = Application.Transpose(.keys)
Range("F30").Resize(.Count) = Application.Transpose(.items)
On Error GoTo 0

End With
End Sub
Отключение ошибок на случай пустого диапазона.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 06.05.2011 в 11:01.
Hugo121 вне форума Ответить с цитированием
Старый 06.05.2011, 12:13   #7
Magnetic Air
Пользователь
 
Регистрация: 28.01.2011
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
"Сумма" и "Оплачено" нужно анализировать раздельно
так точно, но на самом деле Вы тут столько страшных слов наговорили... А можно занести в массив данные с одного файла (столбец "Сумма") и в другой массив данные с другого (столбец "Сумма"), а потом производить манипуляции уже непосредственно с ними. Выкидывая из памяти проверенные данные.
Magnetic Air вне форума Ответить с цитированием
Старый 06.05.2011, 12:23   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Такой набросок - запускать из модуля остатков, проверяет конкретные диапазоны:
Код:
Option Explicit

Sub tt()
Dim cc As Range, oDict As Object, temp$, x
Dim a, i As Long, kk

Set oDict = CreateObject("Scripting.Dictionary")

For Each cc In [e9:e21]
temp = cc.Formula
temp = Replace(temp, "=", "")
temp = Replace(temp, "+", " ")
temp = Application.Trim(temp)
For Each x In Split(temp)
 If Not oDict.Exists(x) Then
 oDict.Item(x) = 1
 Else
 oDict.Item(x) = oDict.Item(x) + 1
 End If
Next
Next

With GetObject("C:\temp\Primer_1\журнал.xls")
For Each cc In .Sheets(1).[h5:h37]
    If Len(cc) Then
        If oDict.Exists(CStr(cc.Value)) Then
           If --(oDict.Item(CStr(cc.Value))) > 0 Then
           oDict.Item(CStr(cc.Value)) = oDict.Item(CStr(cc.Value)) - 1
           Else
           MsgBox CStr(cc.Value) & " из журнала " & cc.Address & " нет пары!"
           End If
        Else
        MsgBox CStr(cc.Value) & " из журнала " & cc.Address & " нет пары!"
        End If
    End If
Next
'.Close 0
End With

For Each kk In oDict.keys
If --(oDict.Item(kk)) > 0 Then MsgBox "Лишнее в остатках: " & kk
Next

End Sub
Занести в массив можно, но это с формулами нужно делать всё равно перебором, смысла нет.
Я перебором заношу в словарь.
А второй диапозон можно и в массив, но тогда не покажешь адрес несовпадения - поэтому в этой версии тоже перебор с листа. Ну на Ваших данных разницы по скорости нет.
Пока продолжать некогда - посмотрите пока, может какие замечания будут.
Если файл журнал.xls будет закрыт - раскомментируйте строку '.Close 0, иначе он может стать скрытым
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 06.05.2011, 13:11   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Проверьте - рассчитано на конкретные диапазоны. Если они динамические - нужно доделывать.
Поставил тупо два похожих кода последовательно.
Запускать по Alt+F8 макрос Analiz.
В этой версии - если файл журнал.xls будет при запуске кода открыт, то он закроется без сохранения изменений.
P.S. есть недоработка - при запуске должен быть активным лист остатки.xls. Это легко исправить в итоговой версии, если возьмёте такое решение.
Вложения
Тип файла: rar остатки.rar (14.8 Кб, 9 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 06.05.2011 в 13:17.
Hugo121 вне форума Ответить с цитированием
Старый 06.05.2011, 13:17   #10
Magnetic Air
Пользователь
 
Регистрация: 28.01.2011
Сообщений: 29
По умолчанию

Hugo121
спасибо, буду разбираться
Magnetic Air вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Основная программа и функция расположены в разных файлах. Марат05 Общие вопросы C/C++ 1 01.04.2011 19:09
Сверка столбцов в разных файлах Антон Олегович Microsoft Office Excel 10 03.09.2010 11:38
Работа с данными в разных файлах arc Microsoft Office Excel 4 28.04.2010 15:15
Отображение меню в .php -файлах в разных браузерах griffi HTML и CSS 0 26.01.2010 16:48
Отображение меню в .php -файлах в разных браузерах griffi PHP 2 26.01.2010 16:33