Почему я получаю ошибку «Несоответствие типов» при выполнении следующей формулы в VBA?

#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-массиве, но в моем случае использование строки легче понять, и в любом случае оба метода должны работать, спасибо.