If I understand your problem correctly, the following code should allow you to do what you want. Within the code, you select the range you wish to process; the first column of each data set, and the number of columns within each data set.
It does assume only two data sets, as you wrote, although that could be expanded. And there are ways of automatically determining the dataset columns, if there is no other data in between.
Option Explicit
Option Base 0
Sub RemoveDups()
Dim I As Long, J As Long
Dim rRng As Range
Dim vRng As Variant, vRes() As Variant
Dim bRng() As Boolean
Dim aColumns, lColumns As Long
Dim colRowsDelete As Collection
'vRng to include from first to last column to be tested
Set rRng = Range("f1", Cells(Rows.Count, "F").End(xlUp)).Resize(columnsize:=100)
vRng = rRng
ReDim bRng(1 To UBound(vRng))
'columns to be tested
'Specify First column of each data set
aColumns = Array(1, 13)
'num columns in each data set
lColumns = 3
For I = 1 To UBound(vRng)
bRng(I) = vRng(I, aColumns(0)) = vRng(I, aColumns(1))
For J = 1 To lColumns - 1
bRng(I) = bRng(I) And (vRng(I, aColumns(0) + J) = vRng(I, aColumns(1) + J))
Next J
Next I
'Rows to Delete
Set colRowsDelete = New Collection
For I = 1 To UBound(bRng)
If bRng(I) = True Then colRowsDelete.Add Item:=I
Next I
'Delete the rows
If colRowsDelete.Count > 0 Then
Application.ScreenUpdating = False
For I = colRowsDelete.Count To 1 Step -1
rRng.Rows(colRowsDelete.Item(I)).EntireRow.Delete
Next I
End If
Application.ScreenUpdating = True
End Sub
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
1 |
|
Сравнение двух диапазонов ячеек на совпадение29.05.2012, 00:04. Показов 23526. Ответов 20
Здравствуйте! Подскажите пожалуйста…
0 |
Заблокирован |
||||
29.05.2012, 06:59 |
2 |
|||
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
31.05.2012, 13:37 [ТС] |
3 |
Спасибо, а как сделать чтобы этот же код продолжал работать в след.ячейках например не А1:А3 и С1:С3, а изменил диапазон со сдвигом вправо, т.е. В1:В3 и D1: D3 стало, чтобы не писать его для всех ячеек, а просто со сдвигом вправо? Спасибо
0 |
17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
01.06.2012, 09:20 |
4 |
И сколько таких сдвигов планируется?
0 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
01.06.2012, 13:00 [ТС] |
5 |
Примерно 30 сдвигов
0 |
Dragokas 17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||
01.06.2012, 16:15 |
6 |
|||
Сообщение было отмечено как решение Решение 1. Прокрутка через смещения
4 |
ikki призрак 3261 / 889 / 119 Регистрация: 11.05.2012 Сообщений: 1,702 Записей в блоге: 2 |
||||||||
01.06.2012, 16:38 |
7 |
|||||||
а так не проще?
0 |
Dragokas |
01.06.2012, 17:23
|
Не по теме: Да, я забыл как это делается. Спасибо.
0 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
01.06.2012, 22:54 [ТС] |
9 |
Спасибо!
Len(a) <> 0 а что значит эта строка?
0 |
17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
02.06.2012, 05:16 |
10 |
Без нее, если попадутся 2 пустые ячейки, начнет писать о совпадении. У меня они были почти все пустые, поэтому я это дело отключил.
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
02.06.2012, 08:45 [ТС] |
11 |
Спасибо! Как раз то, что нужно.
0 |
irealife 2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
||||
03.07.2012, 23:15 [ТС] |
12 |
|||
Подскажите пожалуйста, а как написать так, чтобы к letters8 прибавлялось 1 при одном совпадении и прибавлялась 2 при больше двух совпадениях.
0 |
Dragokas 17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||
04.07.2012, 02:51 |
13 |
|||
Если правильно Вас понял, общее кол-во совпадений считаем, как сумму любых совпадений значений в 3 х 3 ячеек в текущем смещении. При этом, если совпадений ровно 2, то ничего не прибавляем.
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
07.07.2012, 13:52 [ТС] |
14 |
При выполнении данного кода, у меня при 1 совпадении все правильно происходит, а при больше двух к letters8 прибавляется 5 вместо 2.
0 |
17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
07.07.2012, 14:09 |
15 |
Так здесь добавляется сразу же, как только найдет совпадения в одном смещении. Тогда строку № 15 переместите между 8 и 9 (а № 3 удалить).
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
07.07.2012, 15:31 [ТС] |
16 |
У меня снова не выходит, теперь получается так, что при любом количестве совпадений прибавляется к letters8 значение 2, а должно, чтобы при отсутствии совпадений — не прибавляться ничего, при одном совпадении — прибавляться единица. И проблема по-моему в переменной k. Я в ячейки добавляю все разные значения, а k он мне выводит равное трем, поэтому и прибавляется все время 2 к letters8.
0 |
17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
|
07.07.2012, 22:30 |
17 |
Можете выложить файл с некоторыми фрагментами цифер для теста.
1 |
2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
|
08.07.2012, 01:15 [ТС] |
18 |
А вы можете почту написать свою? я на почту скину файл? Добавлено через 2 часа 23 минуты Добавлено через 13 минут
0 |
Dragokas 17992 / 7618 / 890 Регистрация: 25.12.2011 Сообщений: 11,351 Записей в блоге: 17 |
||||
08.07.2012, 02:03 |
19 |
|||
Да? А я — нет. Можете просветить, чтобы в следующий раз тоже знать как правильно объяснять?
Из леттерсов тоже сделал массив, так как не знал они теперь отдельно подсчитываются или складываются из всех строк. Если что поубираете массивы (скобки).
1 |
irealife 2 / 2 / 0 Регистрация: 10.05.2012 Сообщений: 45 |
||||
08.07.2012, 10:30 [ТС] |
20 |
|||
Вы в самом начале правильно мне все написали, ошибка у меня была в диапазоне: было от 0 до 150, а нужно было от 0 до 75, и в кейсах у меня он не понимал что такое Case 1, поэтому я ему указала конкретно на равенство через Case Is. И все, спасибо вам)
0 |
Gorr98 Пользователь Сообщений: 17 |
Подскажите пожалуйста, как организовать поиск на несовпадение? Прикрепленные файлы
|
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#2 29.06.2016 18:50:38
Не находится, так как на втором листе нет значений, которые бы отсутствовали на первом. Прикрепленные файлы
|
||
JeyCi Пользователь Сообщений: 3357 |
#3 29.06.2016 19:56:42 а что делать с дублями в 1-й таблице?
файл в папку C:1 Прикрепленные файлы
Изменено: JeyCi — 29.06.2016 20:20:29 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Мотя Пользователь Сообщений: 3218 |
#4 29.06.2016 20:43:07
1 таблица должна дополниться только новыми данными из 2 таблицы, т.е. 1 таблица может иметь кучу строк, представленных одним данным. Gorr98 ! Юрий М . Прикрепленные файлы
|
||
Gorr98 Пользователь Сообщений: 17 |
Огого! Никогда бы не подумал, что это может быть так просто, да еще и в такое маленькое количество строк! Спасибо большое, благодаря таким, как вы, чайники вроде меня черпают опыт чашками, а не ложками) Насчет кода — да, согласен, очень чудной, может потому, что основу подсмотрел, а потом попытался сам его изменить. |
Hugo Пользователь Сообщений: 23251 |
#6 30.06.2016 08:32:14
так показали бы тут код где ещё меньше строк — тот с кибера от fever brain
Только тут у него идёт сравнение обратное заказанному, но не суть.
Если данных много — добавкой rn=rn.value можно анализ перевести в массивы (только тип rn убрать). Изменено: Hugo — 30.06.2016 08:33:02 |
|||||||||
Gorr98 Пользователь Сообщений: 17 |
#7 30.06.2016 16:59:30
Юрий М, расскажите, пожалуйста, что означают приставки xl? Так и не смог разобраться. Знаю, что xlUp — это верхняя граница. Кстати, почему мы используем верхнюю границу, а не нижнюю? С нижней попробовал — не работает. Но ведь мы используем последнее значение снизу — почему тогда xlUp? Set Rng = Columns(1).Find(what:=.Cells(i, 1), LookIn:=xlFormulas, lookAt:=xlWhole) — а в этой строке такая логика, что задаем Rng первую колонку и ищем ее в первой колонке добавленного листа, верно? Если да, то what тут означает «ищем совпадение»? А что значат LookIn и lookAt? Надеюсь, что не сильно завалил вопросами |
||
Hugo Пользователь Сообщений: 23251 |
По второму вопросу — задаём не первую колонку, а задаём найти. И ищем в первой колонке что, в чём и как. А xlUp — это вверх. Вверх от в данном случае последней ячейки столбца, пока не наткнёмся на значение. Юра, я пришёл — а тебя нет… Изменено: Hugo — 30.06.2016 17:20:23 |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
#9 30.06.2016 17:13:02 Всякие xl — это своего рода константы-сокращения: xlFormulas, xlWhole, xlNone, XlYesNo и т.д. Т.е. «готовые к употреблению» параметры )
what — какое значение ищем. |
||
Gorr98 Пользователь Сообщений: 17 |
О! с what, lookIn и lookAt понятно стало, а вот xlUp не совсем — выходит, да, бывают пустые ячейки, на которые xlDown наткнется и подумает, что это конец данных. Но xlUP ведь тоже должен тогда споткнуться об эту же пустую ячейку? И еще, если возможно, посоветуйте, пожалуйста, какую-нибудь литературу по vba |
Hugo Пользователь Сообщений: 23251 |
xlUP идёт снизу вверх, по пустым, он наткнётся на первую заполненную. Снизу! список этих сокращений — в редакторе жмёте F2, там всё. Изменено: Hugo — 30.06.2016 18:01:31 |
С.М. Пользователь Сообщений: 936 |
#12 30.06.2016 21:36:14 Вариант с xlDown:
Прикрепленные файлы
|
||
You can use a simple MATCH formula to detect any non matches, then delete them with AutoFilter
If your first list was in Sheet 1 Column A, your second in Sheet 2 Column A then in B1 of Sheet 2 put
=ISNA(MATCH(A1,Sheet1!A:A,0))
and copy down
this returns TRUE where the second list cant be matched against the first. You can then delete these TRUE rows with autofilter
Note that you could also use
=COUNTIF(Sheet1!A:A,A1)=0
for the same effect to identify not matches (as TRUE)
xl2010 pic shown here
[VBA added]
Sub QuickKill()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim rng1 As Range
Set ws1 = Sheets(1)
Set ws2 = Sheets(2)
ws2.Columns(2).Insert
Set rng1 = ws2.Range(ws2.[a1], ws2.Cells(Rows.Count, "A").End(xlUp))
Rows(1).Insert
With rng1.Offset(0, 1)
.FormulaR1C1 = "=COUNTIF('" & ws1.Name & "'!C1,RC[-1])=0"
.AutoFilter Field:=1, Criteria1:="TRUE"
.EntireRow.Delete
.EntireColumn.Delete
End With
End Sub