Страницы: 1
RSS
Сравнение строк или диапазона. Без применения циклов.
 
Добрый вечер товарищи.
Интересует такой вопрос. Есть ли возможность в VBA сравнить две строки без применения циклов.
Что-то типа Rows(1).value=Rows(2).value (это условно).
Было много тем сравнения диапазонов, но там опять же с применением циклов и массивов.
Нет ли всё-таки быстрого метода сравнения строк.
Если значения строки 1 равны значениям строки 2 то Msgbox. (Под строкой подразумеваю диапазон ячеек расположеный на одной строке, который может быть очень длинным).
Спасибо.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Вам нужно проверить соответствие КАЖДОЙ ячейки диапазона? Может быть сцепить все ячейки одной и другой строки, а затем проверить их идентичность?
 
Цитата
Юрий М написал:
Вам нужно проверить соответствие КАЖДОЙ ячейки диапазона?
Именно это Юрий.
Цитата
Может быть сцепить все ячейки одной и другой строки, а затем проверить их идентичность?
Но тут опять же придётся по каждой ячейке бегать. Или вы имеете в виду формулой в отдельном месте?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Или формулой в отдельной ячейке, или... опять же циклом. Но если цикл, то можно прямо в нём проверять КАЖДУЮ пару ячеек. А чем так страшен цикл? ))
 
CAHO, а если без VBA попробовать, например, УФ сравнить? Не подойдет?
Учусь программировать :)
 
ну как в формулах сравниваем, так и здесь - в имя прописать формулу сравнения и имя вычислить
то, что нет циклов - это только кажется, просто они организованы могут быть более эффективно
Изменено: Слэн - 16.06.2015 14:50:45
Живи и дай жить..
 
Цитата
Юрий М написал: А чем так страшен цикл? ))
Имеется ооооочень большая книга на несколько тысяч строк и 50 с лишним столбцов. Эта книга время от времени редактируется. И для того чтобы понять в какой именно ячейке произошли изменения необходимо проверить и сравнить каждую ячейку (включая объединённые ячейки). Циклом уходит много времени (несколько минут).
Вот я и думал сравнивать не ячейками, а строками. Если в строке нет изменений, то пропускаем её и т.д.
Цитата
УФ сравнить? Не подойдет?
Не, не подойдёт. Данная книга лежит на нескольких компьютерах. после внесения изменений каждого человека, все эти книги опрашиваются и собираются в одну уже с изменёнными данными.
Надеюсь понятно написал. )))
Изменено: CAHO - 21.06.2015 21:14:42
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
CAHO написал: Циклом уходит много времени (несколько минут).
Вручную быстрее? )) Может быть тогда загнать диапазон в массив и там проверять?
 
выкладдывайте файл с тремя строками минимум - есть изменения/ нет изменений
объясняйте что вы сравниваете и что делаете по результатам сравнения
Живи и дай жить..
 
Книгу не смогу выложить, ибо она не будет работать. Но выкладываю сам код, который переносит. данные из двух книг. Возможно ли заменить его на более шустрый?
Обычное сравнение ячеек. Загнать в массив это хорошо, но не совсем представляю как будет сравниваться.
1 IF копирует ячейку с примечанием
2 и 3 IF проверяет объединены ли ячейки
4 IF проверяет заливку
5 IF переносит формулы или данные

больше всего времени уходит на проверку объединённых ячеек
Код
For d = 4 To c 'Строка
For e = 1 To 38 'Столбец
    If e = 31 And Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e) <> Workbooks("БАЗА-АЛВИК.xls").Worksheets("Изменения").Cells(d, e) Then
    Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).Copy Workbooks("Ба3а.xls").Worksheets("База").Cells(d, e)
    Else
        If Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).MergeCells = True Then Workbooks("Ба3а.xls").Worksheets("База").Range(Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).MergeArea.Address(0, 0)).Merge
        If Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).MergeCells = False And Workbooks("Ба3а.xls").Worksheets("База").Cells(d, e).MergeCells = True Then Workbooks("Ба3а.xls").Worksheets("База").Range(Workbooks("Ба3а.xls").Worksheets("База").Cells(d, e).MergeArea.Address(0, 0)).UnMerge
        If Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).Interior.ColorIndex <> Workbooks("БАЗА-АЛВИК.xls").Worksheets("Изменения").Cells(d, e).Interior.ColorIndex Then Workbooks("Ба3а.xls").Worksheets("База").Cells(d, e).Interior.ColorIndex = Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).Interior.ColorIndex
        If Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).Formula <> Workbooks("БАЗА-АЛВИК.xls").Worksheets("Изменения").Cells(d, e).Formula Or Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e) <> Workbooks("БАЗА-АЛВИК.xls").Worksheets("Изменения").Cells(d, e) Then Workbooks("Ба3а.xls").Worksheets("База").Cells(d, e).Formula = Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e).Formula
    End If
Next e
Next d
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
CAHO написал: Книгу не смогу выложить, ибо она не будет работать.
А всю книгу и не нужно - создайте файл с аналогичной структурой и в нём 3-5 строк, кок просит Слэн.
 
Цитата
CAHO написал: Нет ли всё-таки быстрого метода сравнения строк
Отсутствие цикла не означает, что метод будет работать быстрее. Слэн верно говорит - выложите файл, объясните что хотите реализовать и скорее всего решение будет хоть и с циклом, но наиболее оптимальным по времени выполнения.

А самый простой способ узнать были ли изменения - при открытии книги тупо копировать лист, а при закрытии прописать на третьем листе формулу сравнения(=Лист1!А1=Лист2!А1) и потом можно быстро вычислить только те строки, где ЛОЖЬ.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
там цвета сравниваются - так что все предположения о сравнении формулами можно забыть - только попробовать оптимизировать код
Живи и дай жить..
 
Выкладываю на файлообменник файл.
Запускать необходимо файл База.
Логин: Александр
Пароль: 0202

Так вот. Там много всего. Но меня интересует как ускорить процесс сохранения книги.
Это сетевой файл. Пользоваться могут все одновременно.

Суть в чём. при открытии файла создаётся временный в папку Темп, и вы уже работаете в нём. при сохранении файла открывается главный сетевой файл и все различия переносятся в него, после этого сетевой файл сохраняется и закрывается.
http://dropmefiles.com/OTHtf
Изменено: CAHO - 16.06.2015 16:09:55
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
первое улучшение: два первых IF надо делать через if else? ,а то два раза одно и тоже проверяем
Живи и дай жить..
 
второе - через with Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e)
надо делать

а лучше определять в начале шага два объекта:

Workbooks("БАЗА-АЛВИК.xls").Worksheets("База").Cells(d, e) и тоже для второй книги
Изменено: Слэн - 16.06.2015 15:56:27
Живи и дай жить..
 
поменять перебор условий немного... но, в общем, особой экономии врядли можно добиться
Живи и дай жить..
Страницы: 1
Читают тему
Наверх