#vba #excel-formula #type-mismatch
Вопрос:
РАУНД(СУММА($L$3:$L$14,$K$3:$K$14,0,5)/1000,0)
Dim A As Range
Dim B As Range
Set A = Range("L" amp; FirstRow, "L" amp; LastRow2)
Set B = Range("K" amp; FirstRow, "K" amp; LastRow2)
Range("T7").Formula = "=Round(SumIfs(" amp; A amp; "," amp; B amp; ",0.5)/1000,0)"
Комментарии:
1. Попробуй
Range("T7").Formula = "=Round(SumIfs(" amp; A.Address amp; "," amp; B.Address amp; ",0.5)/1000,0)"
2. Благодаря @SuperSymmetry это работает, а также является более интуитивно понятным решением. Как я могу отметить ваш комментарий в качестве ответа?
3. Рад, что это сработало. Я добавил ответ, спасибо.
4. Почему первая строка отделена от остальных?
Ответ №1:
Попробуй:
Range("T7").Formula = "=Round(SumIfs(" amp; A.Address amp; "," amp; B.Address amp; ",0.5)/1000,0)"
Объяснение ошибки:
Твоя линия
Range("T7").Formula = "=Round(SumIfs(" amp; A amp; "," amp; B amp; ",0.5)/1000,0)"
эквивалентно
Range("T7").Formula = "=Round(SumIfs(" amp; A.Value amp; "," amp; B.Value amp; ",0.5)/1000,0)"
потому .Value
что это свойство Range
объекта по умолчанию в VBA.
Поскольку A
и B
оба являются диапазонами с несколькими смежными ячейками, .Value
возвращает двумерный массив всех значений этих диапазонов. Таким образом, вы пытаетесь объединить String
s с двумерными массивами, что приводит к несоответствию типов.
Ответ №2:
Вы получаете несоответствие типов, потому range.formula
что ожидается String value
, и вы объединяетесь Range with String
, и это вызывает ошибку. Чтобы решить эту проблему, достаточно изменить вашу переменную из Range to String
, например:
Dim lastrow As Long, firstrow As Long
Dim A As String
Dim B As String
firstrow = 1
lastrow = 20
A = "L" amp; CStr(firstrow) amp; ":L" amp; CStr(lastrow)
B = "K" amp; CStr(firstrow) amp; ":K" amp; CStr(lastrow)
Range("B7").Formula = "=Round(SumIfs(" amp; A amp; "," amp; B amp; ",0.5)/1000,0)"
Комментарии:
1. На самом деле OP смешивается
String
с 2-d массивами. Формула читается как"=Round(SumIfs(" amp; A.Value amp; "," amp; B.Value amp; ",0.5)/1000,0)"
. ПосколькуA
иB
являются диапазонами с несколькими ячейками.Value
, возвращает 2-d массив. Если это все, что делает операция, то ваше решение является хорошей оптимизацией. Однако оператору могут понадобиться эти диапазоны позже в коде. Простое исправление, которое сохраняет логику операции, заключается в использованииA.Address
иB.Address
. И здесь тожеCStr
не нужно.2. @Я не уверен в вашем 2d-массиве, но в моем случае использование строки легче понять, и в любом случае оба метода должны работать, спасибо.