Добавление заказа на мастер инвентаризацию с помощью макросов Excel - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть две отдельные книги Excel.Один - это форма заказа, другой - основной инвентарный файл.

У меня есть столбец, в который я вписываю сумму заказа для каждого отдельного элемента (скажем, он простирается от ячейки C2: C130, каждая строка - это отдельный элемент).Моим оптимальным решением является разработка макроса, который принимает этот заказ и добавляет его в существующий основной инвентарь для отслеживания общего количества заказов.

Я написал некоторый код, который, по моему мнению, будет работать:

Private Sub CommandButton1_Click()
Dim wsCopy As Worksheet
Dim wsDest As Worksheet
Dim lCopyLastRow As Variant
Dim lDestLastRow As Variant
Workbooks.Open "C:\Users\Dave\Desktop\Designs Work\Master_Inventory.xlsm"
Set wsCopy = Workbooks("Production file_Dave Edits").Worksheets("Order")
Set wsDest = Workbooks("Master_Inventory").Worksheets("Sheet1")
Set lCopyLastRow = wsCopy.Range("E2:E130")
Set lDestLastRow = wsDest.Range("E2:E130")
lDestLastRow.Value = lDestLastRow.Value + lCopyLastRow.Value
End Sub

, когда я запускаю этот код, я получаю ошибку несоответствия (тип 13?).

Итак, я вошел в окно просмотра, чтобы увидеть тип каждого выражения, и объединенная правая часть уравнения представляет собой тип «вариант / целое число», тогда как каждое отдельное выражение представляет собой тип «вариант / вариант».Более того, когда я запускаю код и вызываю только одну ячейку вместо матрицы, код работает;он не запускается, когда вызывается несколько ячеек.

Кто-нибудь может помочь?Или есть более элегантный код?Спасибо

1 Ответ

0 голосов
/ 12 февраля 2019
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), хотя я сомневаюсь, что действительно хочу, чтобы вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...