Как пометить ячейки на листе для макроса, из которого будут приниматься значения? (Excel VBA)

#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  
  1. Массивы 1D основаны на 0, за исключением случая, когда у вас есть поверх модуля Option Base 1 . Я привык Ubound , чтобы это работало в обоих случаях.
  2. То, что было строкой 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 — Подводя итоги, это было замечательное решение. Ты спасаешь мне жизнь 🙂