Инвентаризация штрих-кодов Excel - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать книгу Excel для отслеживания остатка на складе.Прямо сейчас моя рабочая тетрадь содержит листы инвентаризации, ввода и вывода.Инвентарный лист содержит коды и количество для каждого товара на складе.

Я хочу ввести код товара в ячейку А1 либо на листе пополнения, либо на снятии со счета, затем программа должна взять число и посмотреть, соответствует ли оно чему-либо вИнвентарный лист, если он есть, должен либо добавить 1 к количеству этого предмета, либо удалить, зависит от листа внесения или снятия, на который был сделан вклад.Если он не может найти совпадения, он должен создать новый элемент на листе инвентаря.После этого он должен очистить ячейку A1.

У меня есть сканер штрих-кода Datalogic Quickscan, я создам штрих-код для каждого товара на складе и использую сканер для ввода штрих-кодов в рабочие листы.Когда я сканирую штрих-код, он просто выводит число, как если бы оно печаталось на обычной клавиатуре, подключенной к ПК.

Я застрял с кодом VBA, который обновит инвентарный лист.У меня есть код ниже, который делает ячейку на листе инвентаря, где я могу сканировать штрих-код, а затем добавляет ее в список, но что мне делать, если мне нужна другая ячейка, где я могу сканировать, и вместо этого она вычитает количество?

Private Sub Worksheet_Change(ByVal Target As Range)

    Const SCAN_CELL As String = "F7"
    Const RANGE_BC As String = "A1:A500"
    Dim val, f As Range, rngCodes As Range

    If Target.Cells.Count > 1 Then Exit Sub
    If Intersect(Target, Me.Range(SCAN_CELL)) Is Nothing Then Exit Sub

    val = Trim(Target.Value)
    If Len(val) = 0 Then Exit Sub

    Set rngCodes = Me.Range(RANGE_BC)

    Set f = rngCodes.Find(val, , xlValues, xlWhole)
    If Not f Is Nothing Then
        With f.Offset(0, 2)
            .Value = .Value + 1
        End With
    Else
        Set f = rngCodes.Cells(rngCodes.Cells.Count).End(xlUp).Offset(1, 0)
        f.Value = val
        f.Offset(0, 1).Value = "enter description"
        f.Offset(0, 2).Value = 1
    End If

    Application.EnableEvents = False
    Target.Value = ""
    Application.EnableEvents = True

    Target.Select

End Sub

1 Ответ

0 голосов
/ 05 февраля 2019

Вот решение с пользовательской формой.

Создайте новый рабочий лист или переименуйте существующий в Inventory.

Создайте пользовательскую форму UserForm1, как показано ниже:

userform1

Введите код для UserForm1 модуля:

Option Explicit

Private pbModeDeposit As Boolean

Private Sub UserForm_Initialize()

    ' Setup header
    ThisWorkbook.Sheets("Inventory").Range("A1:C1").Value = Array("Item Code", "Description", "Quantity")
    ' Set Deposit mode
    pbModeDeposit = True
    ' Indicate current mode
    ShowMode

End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    Dim sItemCode As String
    Dim n As Long
    Dim i As Long
    Dim bExists As Boolean

    ' Check if enter key pressed
    If KeyCode = KeyCodeConstants.vbKeyReturn Then
        ' Cancel key to keep textbox in focus
        KeyCode = 0
        ' Check entire input code
        sItemCode = Me.TextBox1.Value
        Me.TextBox1.Value = ""
        Select Case True
            Case Not IsNumeric(sItemCode)
                ' Skip non-numeric values
                Exit Sub
            Case sItemCode = "10001990"
                ' Service code to switch to Deposit mode
                pbModeDeposit = True
                ShowMode
            Case sItemCode = "10000991"
                ' Service code to switch to Withdrawal mode
                pbModeDeposit = False
                ShowMode
            Case Else
                With ThisWorkbook.Sheets("Inventory")
                    .Range("A1:C1").Value = Array("Item Code", "Description", "Quantity")
                    ' Get last filled row number
                    n = .Cells(Rows.Count, 1).End(xlUp).Row
                    ' Check if scanned code exists
                    For i = 2 To n
                        bExists = .Cells(i, 1).Value = sItemCode
                        If bExists Then Exit For
                    Next
                    If bExists Then
                        ' Change quantity of existing item
                        .Cells(i, 3).Value = .Cells(i, 3).Value + IIf(pbModeDeposit, 1, -1)
                    Else
                        ' Add new item
                        .Cells(n + 1, 1).NumberFormat = "@"
                        .Cells(n + 1, 1).Value = sItemCode
                        .Cells(n + 1, 3).Value = IIf(pbModeDeposit, 1, -1)
                    End If
                End With
        End Select
    End If

End Sub

Private Sub CommandButton1_Click()

    ' Change mode
    pbModeDeposit = Not pbModeDeposit
    ' Indicate current mode
    ShowMode
    ' Keep textbox in focus
    Me.TextBox1.SetFocus

End Sub

Private Sub ShowMode()

    Me.CommandButton1.Caption = IIf(pbModeDeposit, "Deposit", "Withdrawal")

End Sub

Введите код для ThisWorkbook модуля:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    With UserForm1
        .Show
        .CommandButton1.SetFocus
        .TextBox1.SetFocus
    End With

End Sub

Кроме того, вы можете изменить UserForm1 свойство ShowModal на False.

Когда вы сканируете код, он вводится в TextBox1.Если код 10001990, то режим депозита переключается, если 10000991, то режим снятия, который указан на кнопке рядом с текстовым полем.10001990 и 10000991 просто взяты в качестве примера и могут быть изменены.Любой другой ввод числа производит расчет и обновление инвентарного списка.Обратите внимание, что коды хранятся в виде текста, чтобы избежать переполнения или автоматического преобразования в инженерную нотацию E для больших чисел.

...