Вот решение с пользовательской формой.
Создайте новый рабочий лист или переименуйте существующий в Inventory
.
Создайте пользовательскую форму 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 для больших чисел.