Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 11:09   #1
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию удалить стороку в массиве

всем дня доброго.
имею 2мерный массив, обрабатываю его построчно, т.е. в определенный момент времени имею номер строки массива, как удалить эту строку целиком?
вот как строку удалить в таблице - умею, в массиве, не нашел((
sn00p вне форума Ответить с цитированием
Старый 12.10.2010, 11:34   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Надо переформировывать массив заново.

Можете воспользоваться моей функцией автофильтра для двумерного массива - задаёте параметры для ArrAutofilterEx, и из массива удаляются все неподходящие строки:
http://excelvba.ru/code/ArrAutofilter
http://excelvba.ru/code/DeleteBlankRows
EducatedFool вне форума Ответить с цитированием
Старый 12.10.2010, 11:39   #3
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

не открываются линки
sn00p вне форума Ответить с цитированием
Старый 12.10.2010, 11:43   #4
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

надо осваивать применение sql в тесте кода vba))))
sn00p вне форума Ответить с цитированием
Старый 12.10.2010, 11:47   #5
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

я так понимаю во такая конструкция это делает?

ReDim Preserve nArr(UBound(nArr) - 1)

хотя нет..
sn00p вне форума Ответить с цитированием
Старый 12.10.2010, 11:51   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

вот пример возможных действий
Код:
Sub DeleteRow_i()
  Dim A(1 To 5, 1 To 2) As Long
'  ...
'  Допустим Вы уже определили, что надо удалить строку i
'  ...
  For r = i To UBound(A, 1)
    For c = 1 To UBound(A, 2)
      If r < UBound(A, 1) Then A(r, c) = A(r + 1, c) Else A(r, c) = 0
    Next
  Next
End Sub
кстати, для знатоков программировая в ВБА, можно как-то взять дамп памяти определенного размера по определенному адресу и перенести на другой адрес?
тогда надо было бы посчитать адреса, одним оператором перенести данные, следующим оператором очистить последнюю строку массива, а не циклы гонять.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 12.10.2010 в 11:59.
IgorGO вне форума Ответить с цитированием
Старый 12.10.2010, 11:58   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

ReDim Preserve nArr(UBound(nArr) - 1)
уменьшает размер массива на 1 элемент, сохраняя остальные значения.
если nArr -это Ваш двумерный массив, то получите Run-time error '9'. для двумерного массива надо указать какую размерность уменьшаем.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 12.10.2010, 12:00   #8
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Еще примерчик
Код:
Sub test()
Dim x
x = Range("A1:H" & Cells(Rows.Count, 1).End(xlUp).Row).Value
'удаляем из массива 9-ю строку
[j1].Resize(UBound(x, 1) - 1, UBound(x, 2)).Value = DelRow(x, 9)
End Sub

Function DelRow(arr As Variant, n As Long) As Variant
Dim t(), i As Long, j As Long, k As Long
ReDim t(1 To UBound(arr, 1) - 1, 1 To UBound(arr, 2))
For i = 1 To UBound(arr, 1)
    If i <> n Then
        j = j + 1
        For k = 1 To UBound(t, 2): t(j, k) = arr(i, k): Next k
    End If
Next i
DelRow = t
End Function
nilem вне форума Ответить с цитированием
Старый 12.10.2010, 12:15   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
для двумерного массива надо указать какую размерность уменьшаем.
Небольшое уточнение: оператор ReDim Preserve может изменять лишь величину последней размерности в n-мерном массиве. поэтому, если, например, требуется изменить 1-ю размерность в 2-мерном массиве (количество строк), то потребуется транспонировать этот массив, применять ReDim Preserve, затем вновь транспонировать. К тому же, этот оператор не только изменяет размерность, но и перезаписывает заново все элементы массива. Так что применять его в цикле нецелесообразно.
На мой взгляд, если это, конечно, возможно, лучше сначала выявить все строки массива, которые требуется удалить, а уже затем сформировать новый, требуемый массив, что будет существенно быстрее, нежели каждый раз перебирать исходный массив, тем более использовать ReDim Preserve.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 12.10.2010, 12:29   #10
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
Еще примерчик
Код:
Sub test()
Dim x
x = Range("A1:H" & Cells(Rows.Count, 1).End(xlUp).Row).Value
'удаляем из массива 9-ю строку
[j1].Resize(UBound(x, 1) - 1, UBound(x, 2)).Value = DelRow(x, 9)
End Sub

Function DelRow(arr As Variant, n As Long) As Variant
Dim t(), i As Long, j As Long, k As Long
ReDim t(1 To UBound(arr, 1) - 1, 1 To UBound(arr, 2))
For i = 1 To UBound(arr, 1)
    If i <> n Then
        j = j + 1
        For k = 1 To UBound(t, 2): t(j, k) = arr(i, k): Next k
    End If
Next i
DelRow = t
End Function
а если 17 000 строк? на сколько быстро сработает метод?
sn00p вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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