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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2013, 22:38   #1
Yai
 
Регистрация: 25.12.2012
Сообщений: 3
По умолчанию Сравнение файлов Excel на изменения

Всем Привет! Пытаюсь написать универсальный макрос который сравнивает 2 файла Excel на наличие изменений (примерно так же как это делает Word).
Точнее получается, что будет 2 макроса:
1. Простое сравнение 2-х одинаковых файлов, где изменения только внутри ячеек.
2. Проверка выбранных диапазонов. Этот макрос нужен в случае, если в измененном файле будут добавлены (удалены) строки (столбцы) и «простое» сравнение тут не поможет (это видно на листе 3 при работе 1-го макроса).
Первый макрос я практически написал, воспользовавшись примером из темы http://www.programmersforum.ru/showthread.php?t=86887
Он работает, но его надо только проверить и решить проблему, почему не срабатывает условие
Код:
If wB1.Sheets(numlist).Cells(i, y) <> wB.Sheets(numlist).Cells(iprov, y) Then
wB1.Sheets(numlist).Cells(i, y).Interior.Color = 255
при сравнении например пустой ячейки в исходном файле и нулем в измененном файле.

По второму макросу прошу помочь написать ему начало:
Алгоритм следующий:
Открыть 1 книгу,
Сообщение «выбрать диапазон 1»
Сообщение «выбрать диапазон 2», да/нет, если нет, то начинаем открывать книгу 2
Сообщение «выбрать диапазон 3», да/нет, если нет, то начинаем открывать книгу 2
Таким образом, выбираем сколько нужно диапазонов (причем они могут быть на разных листах книги 1)
После того как мы выбрали все диапазоны из книги 1:
открываем книгу 2
затем предложение выбрать столько же диапазонов, сколько мы их выбрали в книге 1.
Проверка на равенство диапазонов, если не равны, то предложение выбрать еще раз.
Сама проверка следующая:
Сохраняем Книгу 2 как измененную копию (в ней делаем все сравнения).
Все выбранные диапазоны заливаем какой-нибудь светлой заливкой, чтобы было видно, что мы проверяли.
Проверяем поечеечно все выбранные диапазоны на изменения.

У меня затык в том, что не знаю как начать 2й макрос с предложением выбора диапазонов после открытия книги 1.
Файлы прикрепляю.
Вложения
Тип файла: rar сравнивалка.rar (36.5 Кб, 28 просмотров)
Yai вне форума Ответить с цитированием
Старый 08.01.2013, 08:21   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

По первому вопросу

Yai, в Excel, если ячейка пустая, то считается что в ней ноль.
Чтобы это учитывать, можно использовать вот это:
Код:
Sub Procedure_1()
    
    'Вывод результата в: View - Immediate Window.
    Debug.Print IsEmpty(ActiveCell)
    
End Sub

По второму вопросу

Для выбора диапазонов в программе Excel есть специальный инструмент InputBox. Есть ещё InputBox в VBA.
Код:
Sub Procedure_2()
    
    'Массив "myRanges" будет содержать имена выбранных
    'диапазонов. В данном случае имена - это имена, которые
    'будут использоваться только в ходе выполнения этого кода.
    Dim myRanges() As Excel.Range
    Dim i As Long
    
    '1. Задаём количество элементов в массиве.
    'Если заранее не известно, сколько пользователь выберет
    'диапазонов, то можно добавлять элементы в ходе выполнения кода
    'с использованием "Redim Preserve" (при больших объёмах "Redim Preserve"
    'замедляет работу кода очень сильно).
    '"1 To" используется, чтобы порядковый номер первого элемента
    'массива был один, а не ноль (по умолчанию ноль), чтобы было удобно писать код.
    ReDim myRanges(1 To 2)
    
    '2. Выбираем диапазоны.
    'Ubound - это порядковый номер последнего элемента в массиве.
    For i = 1 To UBound(myRanges) Step 1
        'С помощью "InputBox (это команда Excel, а не VBA)"
        'выбираем нужный диапазон.
        'Даём выбранному диапазону имя "myRanges(i)".
        'Обратите внимание, что я указываю параметры в "InputBox".
        'Это позволяет не ставить запятые, что улучшает чтение кода.
        'Type:=8 - означает, что браться будет диапазон, а не просто данные.
        'Type я посмотрел в справке по VBA: поставил курсор на "InputBox" 
        'и нажал клавишу "F1".
        Set myRanges(i) = _
            Application.InputBox(Prompt:="Выберите диапазон", Type:=8)
    Next i
    
    '3. Выводим в "View - Immediate Window" адреса выбранных диапазонов.
    For i = 1 To UBound(myRanges) Step 1
        'Получаем имя листа, где выбран диапазон.
        Debug.Print myRanges(i).Worksheet.Name
        'Получаем диапазон.
        Debug.Print myRanges(i).Address
    Next i
    
End Sub

Последний раз редактировалось Скрипт; 08.01.2013 в 09:12.
Скрипт вне форума Ответить с цитированием
Старый 08.01.2013, 08:27   #3
Serge 007
Участник клуба
 
Аватар для Serge 007
 
Регистрация: 15.12.2009
Сообщений: 1,448
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Yai, в Excel, если ячейка пустая, то считается что в ней ноль
Это в частности
А глобально =епусто(А1) вернёт ИСТИНА, если А1 пуста и ЛОЖЬ, если в А1 ноль
Бесплатная помощь: www.excelworld.ru
Платная помощь: serge_007.planetaexcel@mail.ru
https://yoomoney.ru: 41001419691823
Serge 007 вне форума Ответить с цитированием
Старый 08.01.2013, 09:28   #4
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
в Excel, если ячейка пустая, то считается что в ней ноль.
и кто именно так считает? имена, пароли, явки, плиз.

проводим эксперимент.
яч. A1 оставляем пустой, в яч. A2 вводим 10, в яч. A3 формулу =МИН(A1;A2)
любуемся на результат.
возвращаемся в яч. A1 и вводим 0.
любуемся, опять же.
ikki_pf вне форума Ответить с цитированием
Старый 08.01.2013, 11:01   #5
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
ikki_pf: и кто именно так считает?
программа Excel так считает. Вот пример (в активной ячейке ничего нет):
Код:
Sub Procedure_1()
    
    'Вывод результата в: View - Immediate Window.
    Debug.Print ActiveCell.Value = 0
    
End Sub
Скрипт вне форума Ответить с цитированием
Старый 08.01.2013, 11:13   #6
Serge 007
Участник клуба
 
Аватар для Serge 007
 
Регистрация: 15.12.2009
Сообщений: 1,448
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
программа Excel так считает. Вот пример (в активной ячейке ничего нет):
Sub
В Excel нет такой команды как Sub.
Скрипт, может быть Вы путаете Excel и VBA?
Бесплатная помощь: www.excelworld.ru
Платная помощь: serge_007.planetaexcel@mail.ru
https://yoomoney.ru: 41001419691823
Serge 007 вне форума Ответить с цитированием
Старый 08.01.2013, 11:17   #7
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Serge 007, я поверхностно знаю программирование, поэтому могу ошибаться. Но Excel пустую ячейку тоже считает за ноль. Вот эта формула вернёт ноль:
Код:
=B1
Условия:
  1. формула находится в ячейке A1;
  2. в ячейке B1 пусто.
Скрипт вне форума Ответить с цитированием
Старый 08.01.2013, 11:24   #8
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
Вот пример
я вам тоже привёл пример.
противоположный вашему.
и Serge007 привёл.

пора бы уже сделать очевидный вывод - для Excel'я пустая ячейка и ячейка с 0 не всегда одно и то же.
точнее - Excel не всегда считает, что в пустой ячейке находится 0.

Последний раз редактировалось ikki_pf; 08.01.2013 в 11:26.
ikki_pf вне форума Ответить с цитированием
Старый 08.01.2013, 11:33   #9
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Serge 007, ikki_pf просто я не стал обращать внимание на тонкости работы с Excel и написал, что Excel считает пустую ячейку нулём в данном случае - т.е. в отношении темы автора.

А так, да: много всяких нюансов. Например, Excel считает пустую ячейку и пустой строкой:
Код:
Sub Procedure_1()

    Debug.Print ActiveCell.Value = ""
    
End Sub
Естественно, нельзя утверждать, что во всех случаях Excel считает пустую ячейку пустой строкой, т.к. нужно знать весь Excel.
Скрипт вне форума Ответить с цитированием
Старый 08.01.2013, 11:38   #10
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

имхо, надо выражать свои мысли более аккуратно.
Вас таки читают и к Вам прислушиваются.
поэтому заблуждения, созданные Вами, для некоторых людей могут оказаться стойкими.
привести к ошибкам, неправильным выводам, испортить карьеру, искалечить судьбу...
(гы).
ikki_pf вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контроль изменения файлов Johnson Общие вопросы Delphi 6 05.10.2012 09:32
Мониторинг изменения файлов Сергей846 Общие вопросы Delphi 2 20.08.2010 08:07
Сравнение двух файлов Excel (поячеечно) для выявления отличий IEEE Microsoft Office Excel 8 21.04.2010 15:45
Разрешить изменения файлов по сети joojle Операционные системы общие вопросы 3 09.07.2009 12:39
Программа получения списка файлов директории и изменения атрибутов файлов roma86 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 09.06.2009 09:08