|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
12.10.2010, 12:32 | #11 | |
Пользователь
Регистрация: 27.09.2010
Сообщений: 40
|
Цитата:
спасибо за совет!код вывалю потом |
|
12.10.2010, 12:40 | #12 |
Форумчанин
Регистрация: 25.04.2010
Сообщений: 616
|
Попробуйте:
Код:
|
12.10.2010, 12:48 | #13 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Цитата:
Не лучше ли (повторюсь, что если это применимо к конкретной задаче), формировать новый массив 1 раз, заранее определив, какие строки он должен (или не должен) содержать?
Чем шире угол зрения, тем он тупее.
|
|
12.10.2010, 13:12 | #14 |
Форумчанин
Регистрация: 25.04.2010
Сообщений: 616
|
Согласен, конечно лучше. Мой подход применим для, может быть, десятка строк. Если речь о тысячах записей, то так не пойдет.
Последний раз редактировалось nilem; 12.10.2010 в 13:15. |
13.10.2010, 06:37 | #15 |
Пользователь
Регистрация: 27.09.2010
Сообщений: 40
|
Да, все верно, у меня в таблице из более 17000 строк остается 10к строк, поэтому написание ф-ии по удалению одной строки не практично, но тем не менее спасибо.
'можно назвать удалением строк массива, путем копирования в 'другой массив, более 17000 строк отрабатывает менее чем за секунду. 'алгоритм может и корявый, сильно не пинайте я не профи), но критику принимаю с благодарностью 'но работает быстро и как надо 'самописная ф-ия возвращает кол-во не пустых строк в таблице nLastrow = iHowStr("сличительная") 'самописная ф-ия возвращает кол-во не пустых столбцов в таблице nLastCol = iHowCol("сличительная") Dim sekkk 'вставляем в массив данные с листа sekkk = ActiveWorkbook.Worksheets("сличител ьная").Range("a1:j" & nLastrow) 'растягиваем массив до нужного размера ReDim Preserve sekkk(1 To UBound(sekkk), 1 To nLastCol) ' For i = 1 To nLastrow 'считаем кол-во строк конечного массива , в соответствии с нужным нам условием If sekkk(i, 6) <> 0 And sekkk(i, 8) <> 0 Then nKolZeroRow = nKolZeroRow + 1 'End If Next i 'создаем конечный массив нужного нам размера Dim se22 ReDim se22(1 To nKolZeroRow, 1 To nLastCol) 'перебор начального массива For i = 1 To nLastrow 'выбор нужных значений и перенос их итоговый массив If sekkk(i, 6) <> 0 And sekkk(i, 8) <> 0 Then nRowNum = nRowNum + 1 se22(nRowNum, 1) = sekkk(i, 1) se22(nRowNum, 2) = sekkk(i, 2) se22(nRowNum, 3) = sekkk(i, 3) se22(nRowNum, 4) = sekkk(i, 4) se22(nRowNum, 5) = sekkk(i, 5) se22(nRowNum, 6) = sekkk(i, 6) se22(nRowNum, 7) = sekkk(i, 7) se22(nRowNum, 8) = sekkk(i, 8) se22(nRowNum, 9) = sekkk(i, 9) se22(nRowNum, 10) = sekkk(i, 10) se22(nRowNum, 11) = sekkk(i, 11) End If Next i 'вставляем итоговые данные на лист ActiveWorkbook.Worksheets("лист2"). Range("a1").Resize(nKolZeroRow, nLastCol).Value = se22 Последний раз редактировалось sn00p; 13.10.2010 в 06:41. |
13.10.2010, 08:42 | #16 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
На сколько я понял из Вашего кода, Вам требуется перенести на лист "Лист2" все строки листа "сличительная" в диапазоне столбцов "A:J", в которых значения в 6-м или 8-м столбцах не равны 0. Так? Если так, то все можно сделать существенно проще и гораздо быстрее, если использовать встроенные методы Excel, обойтись вообще без циклов и формирования массивов:
Код:
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 13.10.2010 в 08:47. |
13.10.2010, 09:08 | #17 | |
Пользователь
Регистрация: 27.09.2010
Сообщений: 40
|
Цитата:
все гениальное просто))!!! я только учусь).... спасибо! хотя отрабатывает подольше, порядка 2х секунд Последний раз редактировалось sn00p; 13.10.2010 в 09:11. |
|
13.10.2010, 09:37 | #18 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,166
|
sn00p, Ваш код ещё можно немного ускорить, откинув ненужную проверку в этой строке (в двух местах в коде):
If sekkk(i, 6) <> 0 And sekkk(i, 8) <> 0 Then Это нужно заменить на If sekkk(i, 6) <> 0 Then If sekkk(i, 8) <> 0 Then Тогда при несовпадении первого условия второе проверяться не будет. И вот что-то я не понял, зачем sekkk растягивать, раз ничего туда не помещаете? И можно было упростить код, просто создав другой массив аналогичного размера (не высчитывая в начале нужный будущий размер), затем переложить в него нужные строки (низ массива пусть остаётся пустым), затем выгрузить только верхушку, ведь её размер известен в переменной nRowNum.
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 13.10.2010 в 09:42. |
13.10.2010, 10:06 | #19 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Цитата:
Чем шире угол зрения, тем он тупее.
|
|
13.10.2010, 10:08 | #20 | |||
Пользователь
Регистрация: 27.09.2010
Сообщений: 40
|
Цитата:
Цитата:
Цитата:
обязательно поправлю, вот только разберусь с тем, почему считает не верно у меня итог и поправлю |
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
VBA_макрос: удалить всю строку в таблице, если в ней есть слово "удалить" | макарошка | Microsoft Office Excel | 15 | 05.10.2010 09:09 |
удалить дубли в tstringlist, и удалить по списку | AHTOLLlKA | Компоненты Delphi | 2 | 17.01.2010 10:20 |
как удалить одиннаковые элементы в массиве? | -ushёl- | Помощь студентам | 22 | 15.05.2009 23:07 |
Как удалить строки и столбцы в массиве | ЛесенОК | Свободное общение | 1 | 31.01.2009 18:35 |
как удалить анти вирус( касперский 2006)если она не работает и ее не возможно удалить | Alar | Общие вопросы Delphi | 0 | 29.10.2006 21:36 |