Страницы: 1
RSS
Сравнить значенния рядом стоящих ячеек.
 
Здравствуйте.  
Пожалуйста подскажите как мне сравнить в строке две рядом стоящие ячейки и если значение следующей больше предыдущей на 1  
как вырезать всю строку и перенести на Лист2 пример прилагаю.Проверить нужно порядка 30000 строк.
 
Как я понял, нужно выделить строки, для которых условие выполняется хотя бы для одной пары соседних ячеек.  
(правда, тогда непонятно, почему последняя строка желтая).  
Вводите формулу в свободный столбец, автофильтр по этому столбцу, отфильтрованный диапазон скопировать и вставить на другой лист, а на этом удалить.  
 
В файле два варианта формулы. Первая - формула массива, вводится с помощью Ctrl+Shift+Enter. Вторая обычная.
 
В последней строке ошибся .а вот верезать только истина не получается
 
Спасибо за формулу .Я сам не додумался.
 
Спасибо разобрался.Копировать правда много.
 
Может быть можно не вырезать строку, а выбрать только данные?  
На 30к строк быстрее сделать н массивах - взять диапазон в массив, создать такой же пустой, перебрать быстренько один и переложить отобранные строки в другой, выгрузить результат на лист.  
И отбор несложный...
 
Можно и просто скопировать. нужны только эти данные ,но в макросах я не силен.
 
Я извиняюсь,немного запутался,нужно именно отделить строки с повторяющимися цифрами.
 
Я же расписал последовательность действий. Если непонятно, F1 - автофильтр.
 
{quote}{login=Serj}{date=30.07.2011 03:54}{thema=}{post}Я извиняюсь,немного запутался,нужно именно отделить строки с повторяющимися цифрами.{/post}{/quote}  
Понятнее не стало:)  
Нужно ли именно удалять строки целиком, или можно просто отобрать/разделить данные по этому критерию на другой лист, оставив исходный лист как он есть?  
Если отбирать, используя массивы, то форматирование данных пропадёт, будут извлечены только именно сами значения.  
Если нужно получить две таблицы - это тоже несложно сделать.  
Вариант Казанского хороший, но я как-то не доверяю автофильтру на 30к строк...
 
Так например (макрос может быть в любой книге, при запуске обрабатывается массив области активной ячейки, в этом массиве должно быть не менее 4-х столбцов с цифрами):  
 
Option Explicit  
 
Sub ProstojMakros()  
   Dim a, b, c, i&, ii&, iii&, k As Byte, kk As Byte, flag As Boolean, WBN As Workbook  
 
   a = Selection.CurrentRegion.Value  
   ReDim b(1 To UBound(a), 1 To 4)  
   c = b  
   For i = 1 To UBound(a)  
       flag = True  
       For k = 1 To 3  
           If a(i, k) = a(i, k + 1) - 1 Then  
               ii = ii + 1  
               For kk = 1 To 4: b(ii, kk) = a(i, kk): Next  
               flag = False  
               Exit For  
           End If  
       Next  
       If flag Then  
           iii = iii + 1  
           For kk = 1 To 4: c(iii, kk) = a(i, kk): Next  
           flag = False  
       End If  
   Next  
     
   Set WBN = Workbooks.Add  
   WBN.Sheets(1).[A1:D1].Resize(ii) = b
   WBN.Sheets(2).[A1:D1].Resize(iii) = c
     
End Sub  
 
Не нашёл, как легко создать новую книгу с двумя листами (не прибегая к подсчёту листов новой книги и добавлению, если один, или проверкой Application.SheetsInNewWorkbook), так что понадеемся, что в новой книге есть 2 листа.
 
Упс, вторая строка  
flag = False  
лишняя, только код тормозит, если это можно заметить.
 
Вот так будет быстро и практично  
файл надо сохранить , макросы должны быть включены
Спасибо
 
Спасибо всем,все работает,в новой книге у меня 5листов,нужны оба разделенные списка,все просто блеск.
 
Игорь у тебя мааленькая ошибка :)или скорее описка  
WBN.Sheets(2).[A1:D1].Resize(ii) = c
надо iii  
WBN.Sheets(2).[A1:D1].Resize(iii) = c
расковырял весь код  
пока разобрался почему не выводит то что надо.....
Спасибо
 
И впрямь.  
Просьба модераторам - исправьте плиз в посте :)  
А при проверке ошибок в результате не было - потому что второй список меньше первого.
 
Спасибо.  
Так и есть с этим копипастом - номер листа поменял, массив поменял, переменную забыл...
 
To Hugo .Я уже немного изменил макрос все работает отлично ,Огромное спасибо  
Sub ProstojMakros()  
Dim a, b, c, i&, ii&, iii&, k As Byte, kk As Byte, flag As Boolean, WBN As Workbook  
 
a = Selection.CurrentRegion.Value  
ReDim b(1 To UBound(a), 1 To 6)  
c = b  
For i = 1 To UBound(a)  
flag = True  
For k = 1 To 5  
If a(i, k) = a(i, k + 1) - 1 Then  
ii = ii + 1  
For kk = 1 To 6: b(ii, kk) = a(i, kk): Next  
flag = False  
Exit For  
End If  
Next  
If flag Then  
iii = iii + 1  
For kk = 1 To 6: c(iii, kk) = a(i, kk): Next  
 
End If  
Next  
 
Set WBN = Workbooks.Add  
WBN.Sheets(1).[A1:F1].Resize(ii) = b
WBN.Sheets(2).[A1:F1].Resize(iii) = c
 
End Sub
 
Приятно видеть, что разобрались.  
Уточню, если кто не понял - этот код может быть в третьей книге, открытой в фоне - просто выделяете в книге с данными ячейку в нужной области (область с данными не обязательно A:F) и запускете код по Alt+F8 из списка доступных макросов.  
Код (изменённый Serj) берёт 6 столбцов региона выбранной ячейки и обрабатывает.  
Поэтому этот CurrentRegion должен быть без лишних данных выше и левее, т.е. как в примере.  
Для другого расположение данных код можно чуть изменить в этой части определения исходного массива.
 
To Hugo.Помогите еще пож что-то произошло при запуске макроса начал выдавать "Typ mismatch"
 
{quote}{login=Serj}{date=30.07.2011 02:26}{thema=}{post}To Hugo.Помогите еще пож что-то произошло при запуске макроса начал выдавать "Typ mismatch"{/post}{/quote}  
активируйте любую ячейку в диапазоне данных,  либо в таблице есть не числовые значения
Спасибо
 
Судя по всему, совет Дмитрия помог.  
Если активная ячейка вне данных, то а - это не массив, и на строке  
 
   ReDim b(1 To UBound(a), 1 To 4)  
 
будет именно Type mismatch.  
Так же если вместо цифр буквы (на пусто ошибки нет), тогда ошибка Type mismatch на  
 
           If a(i, k) = a(i, k + 1) - 1 Then  
 
В принципе это можно предусмотреть в коде, но тогда он будет сложнее.
 
Благодарю, активирую.
Страницы: 1
Читают тему
Наверх