#excel #vba #row
#превосходить #vba #ряд
Вопрос:
Я пытаюсь создать макрос, который должен вставлять указанное количество строк ниже указанного номера строки. Вот что я пробовал до сих пор :
Sub Macro2() Dim iRow As Long Dim iCount As Long Dim i, j As Long Dim length As Long arrVal = Array(2, 3, 4) 'no. of rows to add arrTar = Array(18, 19, 20) 'target row numbers to respectively add the no. rows specified above length = 3 'length of above array For j = 1 To length iCount = arrVal(j) iRow = arrTar(j) For i = 1 To iCount Rows(iRow).EntireRow.Insert Next i Next j End Sub
Приведенный выше код вставляет все строки, которые он должен добавить (2 3 4=9) непосредственно под номером первой строки (18). Что не так с моим кодом? Опять же, все, что я хочу сделать, это добавить указанное количество строк ниже указанного номера строки. (согласно массивам в моем коде, 2 строки ниже 18-й строки, 3 строки ниже 19-й и т. Д.)
Я только начал с петель, поэтому я довольно запутался в том, что здесь делать.
Комментарии:
1. Помните, что массивы начинаются с 0, а не с 1. Также Вставка будет вставляться в указанную строку, а не ниже. В вашем случае это может показаться ниже, потому что оно начинается в 19, потому
arrTar(1) = 19
что . Также помните, что он будет использовать текущий номер строки, не принимая во внимание предыдущие вставленные строки.2. Для дальнейшего использования
Dim i, j As Long
будет тусклымi
как вариант, так как он не указан. Сравните с ответом от FaneDuru, где массивы являются вариантами.3. Большое спасибо за советы @ChristoferWeber — обязательно учту их для моих будущих проектов 🙂
Ответ №1:
Пожалуйста, протестируйте следующий адаптированный код:
Sub InsertRows_Arrays() Dim sh As Worksheet, iRow As Long, iCount As Long Dim arrVal, arrTar, i As Long, j As Long, length As Long Set sh = ActiveSheet arrVal = Array(2, 3, 4) 'no. of rows to add arrTar = Array(18, 19, 20) 'target row numbers to respectively add the no. rows specified above length = UBound(arrVal) 'length of above array, in fact is 2. A 1D array is zero based For j = LBound(arrVal) To length iCount = arrVal(UBound(arrVal) - j): iRow = arrTar(UBound(arrTar) - j) For i = 1 To iCount sh.rows(iRow 1).EntireRow.Insert xlUp Next i Next j End Sub
- Массивы 1D основаны на 0, за исключением случая, когда у вас есть поверх модуля
Option Base 1
. Я привыкUbound
, чтобы это работало в обоих случаях. - То, что было строкой 20 до первой вставки, становится 22 после первых вставок и 27 после следующих трех. Вот почему приведенный выше код запускает вставки из последнего элемента массива и, конечно же, использует соответствующее количество строк из другого массива…
Пожалуйста, протестируйте его и отправьте несколько отзывов.
Комментарии:
1. @Сонал Лист, на котором будет происходить вставка, не имеет значения. Если вместо
Set sh = ActiveSheet
этого вы будете использоватьSet sh = Sheets("Sheet2")
илиSet sh = Sheet2
в случае использования листаCodeName
, он будет работать так, как вы хотите. Вот почему я использовал объявление листа, за которым последовала его настройка. Чтобы допустить такое поведение… 🙂2. может
For j = UBound(arrVal) To LBound(arrVal) step -1
быть, это более очевидно3. @Sonal Вы должны просто действовать, как я предложил выше, но массив должен быть построен с использованием нужного вам значения ячеек. Объявите и установите другой лист (
sh1
) тоже. Я имею в виду,Set sh = Sheets("Sheet2")
иarrVal = Array(sh1.range("A2").value, sh1.range("A10").value, sh1.range("A20").value)
, или установите диапазон для каждого случая и поместите значение диапазона в массив. Он также может быть загружен в цикле. Есть и другие способы, в зависимости от вашей реальной ситуации…4. @CDP1802 Да, это может быть более очевидно. Я скопировал его код и только старался вносить как можно меньше изменений, но чтобы он работал. Конечно, повторение в обратном направлении было лучшим/более ясным решением…
5. Спасибо @FaneDuru — Подводя итоги, это было замечательное решение. Ты спасаешь мне жизнь 🙂