Сравнение данных в листах.

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

byaka86
Сообщения: 11
Зарегистрирован: 24 дек 2007, 16:03

Помогите ПЛИЗ!
Необходимо сравнить данные на 2-х листах (15000 и 25000 записей) по 1-й колонке.
Если на 2-м листе есть строка из первого листа - перенести запись на 3-й лист.
Таким образом должны остаться:
1-й лист - исходные данные.
2-й лист - разница в исходных данный.
3-й лист - перенесенные данные.
4-й лист - прсто скопированный второй в начале работы макроса.

Проблема возникла в том, что не получается сравнить данные в ячейках.
Уже ставил формат ячейки и кисловой и текстовый - не помогает, данные вообще числовые.
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Здравствуйте,byaka86.
Для простоты понимания и удобства при ответе на вопрос, желательно иметь исходный файл. Если это, конечно, не гостайна. И не обязательно все 20000 строк :)
файл Вы можете прикрепить к Вашему сообщению в режиме редактирования сообщения - "расширенный".
Если на 2-м листе есть строка из первого листа - перенести запись на 3-й лист.
именно пернести, т.е. с удалением или скопировать?
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
byaka86
Сообщения: 11
Зарегистрирован: 24 дек 2007, 16:03

VictorM писал(а):Здравствуйте,byaka86.
Для простоты понимания и удобства при ответе на вопрос, желательно иметь исходный файл. Если это, конечно, не гостайна. И не обязательно все 20000 строк :)
файл Вы можете прикрепить к Вашему сообщению в режиме редактирования сообщения - "расширенный".
именно пернести, т.е. с удалением или скопировать?


Вот как вы и просили - прикрепляю файл.
Желательно перенести, чтоб можно было отдельно выделить не попадающие в перкый лист строки.
Вложения
Копия.zip
(22.59 КБ) 44 скачивания
Аватара пользователя
Mint86
Сообщения: 127
Зарегистрирован: 04 мар 2008, 11:47

ИМХО надстройка PLEX довольно легко справляется с этой задачей.
byaka86
Сообщения: 11
Зарегистрирован: 24 дек 2007, 16:03

Спасибо, но это немного не то.
Подскажите мне просто как изъять в буфер содержимое ячейки.
СПАСИБО!
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

byaka86,
Подскажите мне просто как изъять в буфер содержимое ячейки.
а можно Вас попросить "расшифровать" это предложение :confused:
Слово изъять, что Вы под этим понимаете? Если скопировать в буфер обмена с удалением, то это вырезать. И еще, изъять, а дальше?
По поводу Вашего вопроса в начале темы и приложенного файла. Сделать можно, но нужно сразу понимать, что при количестве строк 20 000 - 30 000, цикл будет работать ОЧЕНЬ долго. Здесь, видимо, лучше подошли бы формулы листа. Конкретно по Вашему макросу:
значение данных в ячейке - c = ActiveCell.Value и d = ActiveCell.Value,а дальше можно сравнивать значения и производить необходимые действия.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
byaka86
Сообщения: 11
Зарегистрирован: 24 дек 2007, 16:03

VictorM писал(а):byaka86, а можно Вас попросить "расшифровать" это предложение :confused:
Слово изъять, что Вы под этим понимаете? Если скопировать в буфер обмена с удалением, то это вырезать. И еще, изъять, а дальше?
По поводу Вашего вопроса в начале темы и приложенного файла. Сделать можно, но нужно сразу понимать, что при количестве строк 20 000 - 30 000, цикл будет работать ОЧЕНЬ долго. Здесь, видимо, лучше подошли бы формулы листа. Конкретно по Вашему макросу:
значение данных в ячейке - c = ActiveCell.Value и d = ActiveCell.Value,а дальше можно сравнивать значения и производить необходимые действия.

Да, именно вырезать и нужно. Я вот и хочу их сравнить, но у меня не работает именно сравнение. Вот я и прошу помощи о том каким образом их сравнить, что знал - написал в макросе, но он не работает :(
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Именно применительно к Вашему макросу я и написал (не стал даже буквы менять, чтобы было понятнее).
У Вас есть строка c = Range(Cells(i, 2), Cells(i, 2)).Select и если это заменить на

Код: Выделить всё

Range(Cells(i, 2), Cells(i, 2)).Activate
c = ActiveCell.Value
то теперь переменная с будет содержать значение активной ячейки. То же самое и применительно к d. Теперь Вы получили значения ячеек и можете их сравнивать.
Начало Вашего макроса может выглядеть примерно так

Код: Выделить всё

Application.Goto Reference:=Worksheets("Результат").Range("A1")
Worksheets("Результат").Rows("1:50").Delete Shift:=xlUp
Application.Goto Reference:=Worksheets("Лист3").Range("A1")
Worksheets("Лист3").Rows("1:50").Delete Shift:=xlUp
Worksheets("Лист2").Rows("1:1").Copy Destination:=Worksheets("Результат").Range("A1")
inc = 2
For inс = inc To 50
i = inc
Application.Goto Reference:=Worksheets("журнал проводок").Range("A1") '
Range(Cells(i, 2), Cells(i, 2)).Activate
c = ActiveCell.Value
ActiveWorkbook.Sheets("Лист2").Activate
j = 1
A: j = j + 1
Range(Cells(j, 1), Cells(j, 1)).Activate
 d = ActiveCell.Value
 If c = d Then
'и т.д.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
byaka86
Сообщения: 11
Зарегистрирован: 24 дек 2007, 16:03

Спасибо большое!
Получилось кое как! Только вот действительно - ОЧЕНЬ долго обрабатывает.
Может быть можете подсказать какой-нибудь более рациональное решение.
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Я конечно не уверен, не приходилось такое делать, но здесь IMHO, нужно работать с формулами массивов.
А несколько увеличить скорость работы макроса может помочь вот такая конструкция:

Код: Выделить всё

    With Application
         .ScreenUpdating = False
         .Calculation = xlManual
‘’’’’’’’’’’’’’’’’’’’’’
‘’’’’’’’’’’’’’’’’’’’’’
         .Calculation = xlAutomatic
         .ScreenUpdating = True
    End With
ну и, конечно, избавиться, по возможности, от всех Select и Activate.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Ответить