Ошибка обновления значения инвентаризации Excel VBA до другого листа

#excel #vba

#excel #vba

Вопрос:

В моем Excel есть 2 листа: «Лист1» предназначен для получения, а «Лист2» — для инвентаризации запасов. что я хочу сделать, так это когда пользователь вставляет название продукта в строки A16 и A17, обновляется количество товара из «Листа 2» с тем же именем. Созданный мной код может обновлять элемент количества из ячейки A16, но элемент количества ячейки A17 не обновляется (показано на рисунке). кто-нибудь знает, что не так с моим кодом? На изображении есть 2 товара: cheese Cheetos и hot Cheetos. когда я делаю свою квитанцию, уменьшается количество только сыра Cheetos изображение

Вот код

 Sub printInvoice()
Dim rng1, rng2, cell1, cell2 As Range
Dim rConstants As Range
Dim lastRow1 As Long
lastRow1 = Sheets("Sheet1").Range("A" amp; Rows.Count).End(xlUp).Row
Set rng1 = Worksheets("Sheet1").Range("A16:A17" amp; lastRow1)

Dim lastRow2 As Long
lastRow2 = Sheets("Sheet2").Range("A" amp; Rows.Count).End(xlUp).Row
Set rng2 = Worksheets("Sheet2").Range("B2:B" amp; lastRow2)

Dim lr4 As Long
lr4 = Sheets("DaftarPenjualan").Range("A" amp; Rows.Count).End(xlUp).Row   1

For Each cell1 In rng1
    If IsEmpty(cell1.Value) Then Exit For
        For Each cell2 In rng2
            If IsEmpty(cell2.Value) Then Exit For
                If cell1 = cell2 Then

                        cell2.Offset(0, 2) = cell2.Offset(0, 2) - cell1.Offset(0, 1)
                        Sheet1.PrintOut
                        Sheets("DaftarPenjualan").Range("A" amp; lr4).Value = Sheet1.Range("B11")
                        Sheets("DaftarPenjualan").Range("B" amp; lr4).Value = Sheet1.Range("B10")
                        Sheets("DaftarPenjualan").Range("C" amp; lr4).Value = Sheet1.Range("A16")
                        Sheets("DaftarPenjualan").Range("D" amp; lr4).Value = Sheet1.Range("C16")
                        Sheets("DaftarPenjualan").Range("F" amp; lr4).Value = Sheet1.Range("D19")
                        Sheets("DaftarPenjualan").Range("G" amp; lr4).Value = Sheet1.Range("D18")
                        Sheets("DaftarPenjualan").Range("H" amp; lr4).Value = cell2.Offset(0, 5)
                        Sheets("Sheet1").Range("B10").Value = Sheets("Sheet1").Range("B10").Value   1
                        Set rConstants = Sheet1.Range("A16:C" amp; "C17").SpecialCells(xlCellTypeConstants)
                        rConstants.ClearContents

                    End If
                End If
        Next cell2
Next cell1

Sheets("Sheet1").Activate
End Sub
  

Комментарии:

1. Эй, Джастин, мне нужно кое-что знать здесь, столбцы и строки, с которых начинаются ваши данные на листе 2. В каких столбцах указано название продукта и его наличие на складе?

2. @Damian данные начинаются со строк 2. название продукта находится в столбце B, а количество — в столбце D

3. Хорошо, дайте мне несколько минут, и я напишу вам другой способ сделать это.

4. Хорошо, надеюсь, что вы сможете мне помочь

5. вот так, Джастин, попробуй мой ответ

Ответ №1:

Попробуйте это, я предполагаю, что у вас нет повторяющихся элементов в вашем инвентаре, иначе это приведет к сбою при сохранении элементов в словаре

 Option Explicit
Sub printInvoice()

    Dim ws As Worksheet, wsInventory As Worksheet
    Dim LastRow As Long, LastRowInventory As Long, i As Long
    Dim DictInventory As Scripting.Dictionary 'You need to check Microsoft Scripting Runtime on your references for this to work
    Dim C As Range
    Dim Substract As Integer
    Dim arrInventory 'here we will store your inventory

    With ThisWorkbook 'with this you are referencing both sheets on this workbook so its shorter to call them
        Set ws = .Sheets("Sheet1")
        Set wsInventory = .Sheets("Sheet2")
    End With

    Set DictInventory = New Scripting.Dictionary
    LastRow = ws.Cells(ws.Rows.Count, 3).End(xlUp).Row 'this is to know how many items are sold

    With wsInventory
        LastRowInventory = .Cells(.Rows.Count, 2).End(xlUp).Row 'this is to get all your inventory
        arrInventory = .Range(.Cells(1, 2), .Cells(LastRowInventory, 4)).Value 'storing your inventory
    End With

    For i = 2 To UBound(arrInventory) 'here we loop through your inventory to know in which row is every item and store the row
        If Not arrInventory(i, 1) = vbNullString Then DictInventory.Add arrInventory(i, 1), arrInventory(i, 3)
    Next i

    With ws
        For Each C In .Range("B2:B" amp; LastRow) 'we are looping through the first sheet to substract the inventory
            Substract = .Cells(C.Row, 3)
            arrInventory(DictInventory(C.Value), 3) = arrInventory(DictInventory(C.Value), 3) - Substract
        Next C
    End With

    'Paste the values modified to the sheet
    wsInventory.Range(wsInventory.Cells(1, 2), wsInventory.Cells(LastRowInventory, 4)).Value = arrInventory

End Sub
  

Редактировать:
Я не знаю, подумали ли вы уже об этом, но чтобы избежать проблем, я бы использовал список проверки данных на листе получения, чтобы выбрать продукт, который подается по листу инвентаризации. Таким образом, не будет проблем с поиском некоторых продуктов из-за опечаток.

Комментарии:

1. эй, я попробовал это, и это выдает мне сообщение об ошибке «Пользовательский тип не определен.

2. Я думаю, вы не читали комментарии, но вы должны проверить Microsoft Scripting Runtime перед запуском этого кода. В противном случае это не сработает.

3. привет, @Damian Я просто пробую это снова и уже проверяю среду выполнения сценариев, но она снова показывает ошибку, в которой говорится: «Этот ключ уже связан с элементом этой коллекции». Когда я отлаживаю эту строку, отображается ошибка ‘DictInventory. Добавьте arrInventory (i, 1), arrInventory (i, 3) ‘. вы можете мне помочь?

4. Это означает, что у вас есть дубликаты в вашем инвентаре … проверьте значение arrInventory(i, 3) , оно дублируется.

5. но я проверил название продукта, и у него нет дубликатов. какое значение хранится в arrInventory (I, 3)?? количество ?? .. извините, я все еще новичок в кодировании