#excel #vba #timestamp #barcode
#превосходить #vba #отметка времени #штрих-код
Вопрос:
Я использую visual basic для создания системы оформления заказа на листе Excel. Лист будет заполнен информацией для проекта, каждый из проектов требует, чтобы мы отправили комплект. Этот лист Excel позволит сканировать штрих-код, когда это произойдет, он проверяет время «выхода». Когда этот штрих-код сканируется снова, он показывает время «в». Проблема, с которой я сталкиваюсь, заключается в том, что если этот штрих-код будет отсканирован в третий раз, он обновит только время выхода.
Как мне настроить его так, чтобы он видел, что было записано время «вход» и «выход», и, таким образом, перейдите в следующую пустую ячейку в строке и добавьте штрих-код новое время «вход» или «выход». Любая помощь будет очень признательна!
Это код, который я использую.
Код для на рабочем листе
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Me.Range("B2")) Is Nothing Then Application.EnableEvents = False Call inout Application.EnableEvents = True End If End Sub
код для макроса
Sub inout() Dim barcode As String Dim rng As Range Dim rownumber As Long barcode = Worksheets("Sheet1").Cells(2, 2) Set rng = Sheet1.Columns("a:a").Find(What:=barcode, _ LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) If rng Is Nothing Then ActiveSheet.Columns("a:a").Find("").Select ActiveCell.Value = barcode ActiveCell.Offset(0, 1).Select ActiveCell.Value = Date amp; " " amp; Time ActiveCell.NumberFormat = "m/d/yyyy h:mm AM/PM" Worksheets("Sheet1").Cells(2, 2) = "" Else rownumber = rng.Row Worksheets("Sheet1").Cells(rownumber, 1).Select ActiveCell.Offset(0, 2).Select ActiveCell.Value = Date amp; " " amp; Time ActiveCell.NumberFormat = "m/d/yyyy h:mm AM/PM" Worksheets("Sheet1").Cells(2, 2) = "" End If Worksheets("Sheet1").Cells(2, 2).Select End Sub
Ответ №1:
Все это содержится в модуле код рабочего листа:
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Me.Range("B2")) Is Nothing Then inout 'use of Call is deprecated End If End Sub Sub inout() Dim barcode As String Dim rng As Range Dim newRow As Boolean barcode = Me.Cells(2, 2) 'find the *last* instance of `barcode` in ColA Set rng = Me.Columns("A").Find(What:=barcode, after:=Me.Range("A1"), _ LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False) 'figure out if we need to add a new row, or update an existing one If rng Is Nothing Then newRow = True 'no matching barcode Else 'does the last match already have an "in" timestamp? If Len(rng.Offset(0, 2).Value) gt; 0 Then newRow = True End If If newRow Then Set rng = Me.Cells(Me.Rows.Count, "A").End(xlUp).Offset(1, 0) rng.Value = barcode SetTime rng.Offset(0, 1) 'new row, so set "out" Else SetTime rng.Offset(0, 2) 'existing row so set "in" End If Me.Cells(2, 2).Select End Sub 'set cell numberformat and set value to current time Sub SetTime(c As Range) With c .NumberFormat = "m/d/yyyy h:mm AM/PM" .Value = Now End With End Sub