Страницы: 1
RSS
Растянуть формулу массива через VBA, Варианты растягивая формулы массива средствами VBA
 
Здравствуйте. Возникла, казалось бы простая задача, растянуть формулу массива до конца последней строки, но по какой то причине это не выходит. Делал так.
В Range("P2: Последняя строка / столбец") у меня имеются формулы ({массивы}).
Я прочитал на форумах, что за вставку массивов отвечает не formula / formular1c1, а FormulaArray.
Растягивать нужно в "P3: последняя строка/столбец"
Код
'Нахожу последний столбец / строку:
lColumnsCnt = wSh_Base_Sales.Cells(1, wSh_Base_Sales.Columns.Count).End(xlToLeft).Column
lLastRow_Prod_Un_C = wSh_Base_Sales.Cells(Rows.Count, 13).End(xlUp).Row


With wSh_Base_Sales
'Копирую формулы в весь диапозон
.Range(.Cells(3, 16), .Cells(lLastRow_Prod_Un_C, lColumnsCnt)).Formula = .Range(.Cells(2, 16), .Cells(2, lColumnsCnt)).Formula
For i = 16 To lColumnsCnt
'Преобразую формулы в массивы
.Range(.Cells(3, i), .Cells(lLastRow_Prod_Un_C, i)).FormulaArray = .Range(.Cells(3, i), .Cells(lLastRow_Prod_Un_C, i)).Formula
Next i
.Calculate
End With
Вся это конструкция не работает. Я не понимаю почему, особенно если учитывать что
Код
wSh_Base_Sales.Range("P3:Q" & lLastRow_Prod_Un_C).Formula = wSh_Base_Sales.Range("P2:Q2").Formula
wSh_Base_Sales.Range("P3:P" & lLastRow_Prod_Un_C).FormulaArray = wSh_Base_Sales.Range("P3:P" & lLastRow_Prod_Un_C).FormulaR1C1
wSh_Base_Sales.Range("Q3:Q" & lLastRow_Prod_Un_C).FormulaArray = wSh_Base_Sales.Range("Q3:Q" & lLastRow_Prod_Un_C).FormulaR1C1
работает без проблем
Ситуация с Range("A1:A2") и Range(Cells (1,1), Cells(1,2)) должна быть одинаковой (так везде в примерах приведено), но у меня это не работает и всегда выдает ошибку.
Изменено: Mirai - 24.10.2016 02:02:42
 
А Вы попробуйте так же, как во втором примере не Formula указывать, а FormulaR1C1. Насколько помню, в справке тоже предлагают применять для формул массива именно этот стиль(хотя может работать и с другим, но велика вероятность ошибок).

P.S. Для оформления кодов на форуме применяется спец.тег: <...>
Изменено: The_Prist - 23.10.2016 17:25:40
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
А Вы попробуйте так же, как во втором примере не Formula указывать, а FormulaR1C1.
К сожалению так не работает (Error 13 Type Missmatch)
 
Код
For i = 16 To lColumnsCnt 
.Range(.Cells(3, i), .Cells(lLastRow_Prod_Un_C, i)).FormulaArray = .Range(.Cells(3, i), .Cells(lLastRow_Prod_Un_C, i)).Formula 
Next i 
В этом коде выдает ошибку.
 
А почему Вы пытаетесь выудить целый массив формул? Т.е. получаете все формулы из диапазона? Это неверно, FormulaArray должна быть строковым значением типа String, а свойство Formula, взятое из диапазона возвращает тип Array. Вот и вся ошибка. Делайте так:
Код
.Range(.Cells(3, i), .Cells(lLastRow_Prod_Un_C, i)).FormulaArray = .Cells(3, i).Formula
P.S. свои сообщения можно править. Поэтому имеет смысл в первом сообщении тоже теги расставить.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Mirai, может поможет Записать в макросе формулу массива
 
The_Prist спасибо, заработало. Утро вечера мудренее оказалось,  не заметил, что делаю полный бред. У меня видимо ошибка в чем-то еще, так как попробовал в другом файле, все работает, у меня нет. Буду искать подвох.
Страницы: 1
Наверх