Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.36.10] |
|
Сообщ.
#1
,
|
|
|
Приветствую!
Возникла периодически повторяющаяся задача. Пока решал "кустарными" методами. Если не лениво, покажите как такое можно решить на VBA, уверен - кода много не будет. Суть Есть файлы 1.xls и 2.xls. Нужно в первом файле оставить только те строки, которых нет во втором файле. Однако, речь идет не о сравнении всей строки, а только, скажем так, "ключевой" ячейки. Пример: 1.xls UIN;ФИО; DF559849495;Иванов Иван Иванович; 2.xls UNN;ФИО;UIN; 23333477757;Иванов Иван Иванович;DF559849495; Как видно - в первом файле "ключевой" столбец первый, а во втором файле - третий. А решал пока так Выгружал данные файлов в csv-формате. Запускал скрипт, который написал на Перле, результат загружал в новый файл. Естественно, хотелось бы избавиться от ручных манипуляций. #!/usr/local/bin/perl use FileHandle; $file = FileHandle->new; die "Read error in file!" unless ($file->open("< 1.csv")); @One = <$file>; $file->close; die "Read error out file!" unless ($file->open("< 2017.csv")); @Res = <$file>; $file->close; foreach $I (@One) { @Tmp = split(/;/,$I); $Tmp[0] =~ s/(\S+).*/$1/; # 0 - номер столбца с "ключевыми" данными IN $ResHash{$Tmp[0]} = 1; } foreach $I (@Res) { @Tmp = split(/;/,$I); $Tmp[2] =~ s/(\S+).*/$1/; # 2 - номер столбца с "ключевыми" данными OUT print $I unless exists $ResHash{$Tmp[0]}; } |
Сообщ.
#2
,
|
|
|
Тупо циклики for.
Я вижу это вот так примерно. Работа с массивами заметно быстрее, особенно при больших объёмах данных. Естесно я это не тестировал, но должно работать. Интерфейса нет, все параметры задаются в коде, если это пойдёт конечно надо будет допилить. Прикреплённый файл__________1.rar (10,89 Кбайт, скачиваний: 48) |
Сообщ.
#3
,
|
|
|
Пасип! Вечерком поразбираюсь.
|
Сообщ.
#4
,
|
|
|
Цитата JoeUser @ Пасип! Вечерком поразбираюсь. Я там пару грамматических ошибок сделал щас прикрепил исправленный файлик |
Сообщ.
#5
,
|
|
|
Да сделай это макросом... вот какой-нить дурью типа
Sub DeleteRows() Dim wbk2 As Workbook Dim sht1 As Worksheet Dim sht2 As Worksheet Dim rng2 As Range Dim i As Long Set wbk2 = Workbooks.Open("c:\Книга2.xls") Set sht1 = ThisWorkbook.Sheets("Лист1") Set sht2 = wbk2.Sheets("Лист1") Set rng2 = sht2.Range("A:A").SpecialCells(xlCellTypeLastCell) For i = rng2.Row To 1 Step -1 If Not sht1.Range("A:A").Find(sht2.Cells(i, 1), LookIn:=xlValues) Is Nothing Then sht1.Range("A:A").Find(sht2.Cells(i, 1), LookIn:=xlValues).Rows.EntireRow.Delete End If Next i End Sub |
Сообщ.
#6
,
|
|
|
Akina, пасип!
|