Set lCopyLastRow = wsCopy.Range("E2:E130")
Set lDestLastRow = wsDest.Range("E2:E130")
Это делает обе переменные Variant/Range
, потому что ключевое слово Set
говорит, что правая часть оператора присваивания дает ссылку на объект: две переменные также могут быть объявлены As Range
.
Теперь Value
объекта Range
, который ссылается на несколько ячеек, представляет собой массив 2D Variant
.
lDestLastRow.Value = lDestLastRow.Value + lCopyLastRow.Value
Вот где вы получаете тип несоответствие ошибка, поскольку вы не можете использовать оператор +
с операндами массива.
, когда я запускаю код и вызываю только одну ячейку вместо матрицы, кодработает
Это потому, что одиночная ячейка Range.Value
возвращает это числовое значение, и +
будет работать с этим - хотя, если ячейка содержит значение ошибки (например, #REF!
или #VALUE!
), вы все еще получите ошибку несоответствия типов , потому что Variant/Error
не может быть операндом.
Хотелось бы, чтобы я могкроме этого, но я понятия не имею, что собирается делать +
.
Что касается более элегантного решения,Я бы порекомендовал сделать отступ в теле процедуры, переместить объявления ближе к их назначению и сохранить ссылку на целевую книгу «инвентаризации»:
Private Sub CommandButton1_Click()
Dim sourceSheet As Worksheet
Set sourceSheet = Workbooks("Production file_Dave Edits").Worksheets("Order")
Dim inventoryBook As Workbook
Set inventoryBook = Workbooks.Open("C:\Users\Dave\Desktop\Designs Work\Master_Inventory.xlsm")
Dim destSheet As Worksheet
Set destSheet = inventoryBook.Worksheets("Sheet1")
Dim sourceRange As Range
Set sourceRange = sourceSheet.Range("E2:E130")
Dim destRange As Range
Set destRange = destSheet.Range("E2:E130")
'todo: figure out intent
'lDestLastRow.Value = lDestLastRow.Value + lCopyLastRow.Value
End Sub
Если это +
намеревается сложить все в обоих диапазонах, вы могли бы использовать Application.WorksheetFunction.Sum(sourceRange) + Application.WorksheetFunction.Sum(destRange)
, хотя я сомневаюсь, что действительно хочу, чтобы вы искали.