Есть массив arr(100,3). Хочу удалить 30 строку. Как это сделать?
Спасибо.
Спасибо.
12.11.2010 22:48:32
Есть массив arr(100,3). Хочу удалить 30 строку. Как это сделать?
Спасибо. |
|
|
|
12.11.2010 22:59:36
Есть вариант удалить строку на листе, а потом записать в массив.
Но можно как-то программно? |
|
|
|
15.11.2010 15:12:53
Дмитрий, ты, конечно, прав...
Просто по инерции мышления: как начали тут делать с диапазоном, так я и продолжил... Конечно, с массивом намного универсальнее и быстрее в несколько раз получается. Я свою предыдущую универсальную (любые размерности массивов и сразу строку и столбец можно задавать) формулу подпилил. На массиве 100х100 выигрыш в скорости получился в 5 раз. Function DelArrRC(Arr(), Optional xRow& = 0, Optional xCol& = 0) 'удалить из массива любую строку и/или столбец Dim L1&, U1&: L1 = LBound(Arr, 1): U1 = UBound(Arr, 1) Dim L2&, U2&: L2 = LBound(Arr, 2): U2 = UBound(Arr, 2) Dim tArr(): ReDim tArr(L1 To U1 + (xRow > 0), L2 To U2 + (xCol > 0)) Dim RR&, CC&, tRR&, tCC& tRR = L1 For RR = L1 To U1 tCC = L2 If RR <> xRow Then For CC = L2 To U2 If CC <> xCol Then: tArr(tRR, tCC) = Arr(RR, CC): tCC = tCC + 1 Next tRR = tRR + 1 End If Next DelArrRC = tArr End Function |
|
|
|
15.11.2010 18:48:59
Alex_ST, R Dmitry, Спасибо.
R Dmitry, подошел Ваш вариант. |
|
|
|
15.11.2010 19:01:52
{quote}{login=PavelKs}{date=15.11.2010 06:48}{thema=}{post}Alex_ST, R Dmitry, Спасибо.
R Dmitry, подошел Ваш вариант.{/post}{/quote} Ну и ладненько, пользуйтесь на здоровье.
|
|||
|
|
16.11.2010 08:34:32
Конечно, пользуйтесь макросом Дмитрия...
Он намного короче. Но "заточен" на строго определённый конкретный случай. Правда, если послезавтра вам нужно будет удалять не 30-ю строку, а 23-й столбец из массива другой размерности, будете опять обращаться за помощью на форум или самостоятельно перелопачивать макрос. Я же всё-таки предпочитаю писать и потом использовать универсальные макросы с задаваемыми аргументами и минимумом ограничений на их значения. Самому же потом проще: взял из своей "копилки" подходящий макрос и, не переделывая, вставил в требуемый модуль. :-) |
|
|
|
16.11.2010 08:58:14
Alex_ST, Ваш в копилке. Спасибо.
R Dmitry'я, в работе. :) |
|
|
|
16.11.2010 09:24:25
Просто на всякий случай полезный совет из личного опыта:
при работе с массивами я предпочитаю при задании размерностей указывать не только UBound, но и LBound чтобы от значения Option Base 1/0 не зависели результаты работы макросов. И именно поэтому я в своих макросах для обработки массивов всегда делаю циклы от LBound до UBound. Да и разноразмерные массивы при этом всегда корректно обрабатываются |
|
|
|
16.11.2010 09:27:32
Alex_ST, спасибо, это я заметил - именно по этому и в копилке.
Загляните в |
|
|
|
16.11.2010 09:32:20
traspose и получим столбец
:)
|
|||
|
|
16.11.2010 09:37:57
R Dmitry, и Вас просу заглянуть
|
|
|
|
16.11.2010 11:11:11
{quote}{login=R Dmitry}{date=15.11.2010 01:13}{thema=Re: }{post}{quote}{login=PavelKs}{date=12.11.2010 10:59}{thema=}{post}Есть вариант удалить строку на листе, а потом записать в массив.
Но можно как-то программно?{/post}{/quote} можно и так переписать из массива в массив (как вариант) Sub arrdel_str() arr = Range("A1:B5").Value Dim delStr&, x& ReDim arrf(1 To 4, 1 To 2) delStr = 3: x = 1 For i = 1 To UBound(arr) If i <> delStr Then arrf(x, 1) = arr(i, 1): arrf(x, 2) = arr(i, 2): x = x + 1 Next i Range("C1:D4") = arrf End Sub{/post}{/quote} уточню :) Sub arrdel_str(rng as range) arr = rng Dim delStr&, i&, j&, mr& delStr = 3: x = 1: mr = UBound(arr) ReDim arrf(1 To mr - delStr + 1, 1 To UBound(arr, 2)) For i = 1 To mr - delStr For j = 1 To UBound(arr, 2) arrf(i, j) = arr(i + delStr, j) Next Next i rng(delstr).Resize(UBound(arrf), UBound(arr, 2)) = arrf End Sub
Живи и дай жить..
|
|
|
|
16.11.2010 11:13:16
но можно еще быстрее - цикл copymemory по столбцам
Живи и дай жить..
|
|
|
|
16.11.2010 11:17:18
{quote}{login=слэн}{date=16.11.2010 11:13}{thema=}{post}но можно еще быстрее - цикл copymemory по столбцам{/post}{/quote}
Буду признателен за небольшой пример |
|
|
|
16.11.2010 11:29:56
|
|
|
|
16.11.2010 12:17:54
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Sub arrdel_str_copymem() arr = Range("A1:B5").Value Dim delStr&, j&, mr& delStr = 3: mr = UBound(arr) For j = 1 To UBound(arr, 2) CopyMemory arr(delStr, j), arr(delStr + 1, j), 16 * (mr - delStr) arr(mr, j) = Empty Next End Sub
Живи и дай жить..
|
|
|
|
16.11.2010 12:42:23
слэн, спасибо, буду разбираться.
|
|
|
|
16.11.2010 12:46:13
{quote}{login=Alex_ST}{date=16.11.2010 11:29}{thema=}{post}слэн,
на сколько я понял, delStr - это не число удаляемых строк, а номер удаляемой строки (иначе нужно было бы ещё и задавать, с какой начиная нужно удалять) Поэтому я и писАл: Dim tArr(): ReDim tArr(L1 To U1 + (xRow > 0), L2 To U2 + (xCol > 0)){/post}{/quote} да, там я неправильно понял, сделал именно для выгрузки на лист. последний пример лучше( и необязательно с copymem) |
||||
|
|
|||