2016-02-16 12 views
1

Я создал таблицу (Excel 2007), которая будет отслеживать заказы в течение года. В рамках этого отслеживания мне нужно создать уникальный идентификатор на основе даты и количества заказов, которые поступают в день. Счетчик сбрасывается каждый день.Создание уникального идентификатора на основе даты и количества запросов

Например,

Запрос 1 = Дата: 02/02/16 -> ID # 20160202-01

Запрос 2 = Дата: 02/02/16 -> ID # 20160202-02

Запрос 3 = Дата : 02/03/16 -> ID # 20160202-01

Из-за характера бизнеса заказы поступают в формате электронной почты и затем вводятся в электронную таблицу через форму пользователя. Внутри этой пользовательской формы я попробовал оператор If..Then для увеличения переменной (n), если дата запроса соответствует предыдущей записи. Это работает, но значение (n) сбрасывается всякий раз, когда выполняется эта форма, что означает, что мое максимальное значение, которое я могу получить, равно 2.

Я считаю, что исправление заключается в создании (n) глобальной/общедоступной переменной, но я не знают, как использовать общедоступную переменную для доступа через пользовательскую форму. Кто-нибудь имеет какие-либо советы или хорошие ссылки, чтобы исправить эту проблему? Спасибо заранее за вашу помощь.

ОБНОВЛЕНИЕ: Спасибо всем за быструю обратную связь. Я просто застал коллегу и, по прихоти, спросил ее, есть ли у меня исправление. Она сообщила мне, что статическая переменная станет способом устранения этой проблемы. Это исправление помогло, но не является идеальным решением. Я поставлю соответствующий код для этого, чтобы показать выполненное исправление.

Sub CommandButtonSubmitClose_Click() 
Static n As Integer 
Dim ordDate As Date 
Dim ordYear As Integer 
Dim txtYear As String 
Dim txtMonth As String 
Dim txtDay As String 
Dim txtCount As String 
Dim IDnum As String 
Dim prevRow As Long 
Dim LastRow As Long, ws As Worksheet 

'Define variables' 
prevRow = LastRow - 1 
txtYear = reqYear 
txtMonth = Format(month(reqDate), "00") 
txtDay = Format(day(reqDate), "00") 

If ordDate = ws.Range("A" & prevRow).Value Then 
n = n + 1 
Else     'Determine daily count' 
    n = 1 
End If 


txtCount = Format(n, "00") 

'Create ID Number' 

    IDnum = " " & txtYear & "" & txtMonth & "" & txtDay & "-" & txtCount & "" 

Новые проблемы: Как указано в комментариях, переменная не сохраняется, если электронная таблица закрыта. Поэтому, если заказы приходят позже, этот счет сбрасывается, создавая дубликаты, которые заставляют все это сходить с ума. Кроме того, если в миксе не существует последовательной даты, генератор не работает.

+0

Было бы хорошо, если бы мы увидели ваш текущий соответствующий код, это может быть легче найти ошибку вместо того, чтобы изобретать код. –

+0

Вы не можете «сохранить» значение в переменной, когда электронная таблица закрыта и снова открыта. Как хранятся данные? На этом мы можем найти легкое решение. – MatthewD

+0

Сохраните счет в ячейке на листе и введите код, увеличивающий указанную ячейку. – findwindow

ответ

0

После экспериментирования с некоторыми из предложенных идей, в том числе с сохранением значения счета в ячейке и другом листе, я остановился на одном, который вместо этого использует цикл для поиска заказов, полученных в тот же день. используя цикл For ... Next, я пробежал каждый заказ, и если дата совпала с датой заказа, счетчик (n) был обновлен на единицу. Как только петля играла, (n) использовалась, как указано выше. Если никакие другие значения не найдены, (n) устанавливается в 1. Значение (n) сбрасывается до нуля перед циклом. Спасибо за отзыв всем, я ценю помощь!

Вот код исправления, если кому-то интересно:

n = 1 
For i = 11 To LastRow 
    If ordDate = ws.Range("A" & i).Value Then 
    n = n + 1 
    End If 
Next i 

txtCount = Format(n, "00") 

'Create ID Number' 

IDnum = " " & txtYear & "" & txtMonth & "" & txtDay & "-" & txtCount & "" 
0

Почему вы не используете лист для хранения значения счетчика?

Sub CommandButtonSubmitClose_Click() 
    Dim r As Range 
    Dim txtCount As String 

    'Add 1 to the counter if the day is still the same, 
    Set r = ThisWorkbook.Sheets("Var_Sht").Range("A1") 
    If r.Value = Date Then 
     r.Offset(1, 0).Value = r.Offset(1, 0).Value + 1 
    Else 
     r.Value = Date 
     r.Offset(1, 0).Value = 1 
    End If 

    txtCount = r.Offset(1, 0).Value 

    'the other code in your procedure... 

End Sub 

Очевидно, что вам нужен лист с именем Var_Sht, но вы можете сделать лист очень скрытым, так что ваши пользователи не видят его.

Лист будет хранить дату в А1 и дневной счетчик в A2. Когда код запускается, если дата в A1 не равна функции Date, мы знаем, что дата в A1 не сегодня, поэтому мы сбрасываем счетчик и обновляем дату в A1.

 Смежные вопросы

  • Нет связанных вопросов^_^