Последовательность номера детали с помощью формы пользователя - PullRequest
1 голос
/ 30 апреля 2020

Я совершенно новый в VBA или программировании. Сейчас я занимаюсь разработкой макроса для производственного сайта, который вводит данные процесса, используя пользовательские формы Excel. Одна из вещей, которые я хочу сделать в этом макросе, - это автоматически создавать номера прогонов для каждого процесса. Используемый синтаксис номера серии выглядит следующим образом:

V1.yy.mm.dd-1

V1.yy.mm.dd-2

V1.yy. mm.dd-3

Пример V1.20.04.29-1

Я пытаюсь настроить создание номера прогона, когда я выбираю элемент из ComboBox, номер детали создается в TextBox для последующей отправки в соответствующую базу данных. Я не уверен, как создать последовательность после Префикса = V1.yy.mm.dd-, я попытался использовать приложение CountIf, которое будет подсчитывать количество Префиксов с той же датой в электронной таблице для последовательности, но кажется, что функция не работает для частичных совпадений. Я пытался использовать следующее, но я не могу заставить его работать. Я уверен, что есть более простые способы сделать это, не могли бы вы дать мне несколько советов? Спасибо

Это код, который я написал до сих пор:

Private Sub ComboBox1_Change()

If Me.ComboBox1.Value <> "" Then

Dim Prefix As String
Dim mm, dd, yy As String
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("2- V1 Loading (2)")
Dim s As Long

s = 1 + sh.Application.Count(Application.Match(Prefix, Range("B:B"), 0))

mm = Format(Date, "mm")
dd = Format(Date, "dd")
yy = Format(Date, "yy")

Prefix = "V1." & yy & "." & mm & "." & dd & "-"
v1 = "V1." & yy & "." & mm & "." & dd & "-" & "" & s

Me.TextBox6.Value = v1


End If

Ответы [ 3 ]

0 голосов
/ 30 апреля 2020

Может быть, что-то вроде этого?

Private Sub ComboBox1_Change()

If Me.ComboBox1.Value <> "" Then
Set sh = ThisWorkbook.Sheets("2- V1 Loading (2)")

oDate = Format(Date, "yy.mm.dd")
oConst = "V1." & oDate & "-"

Range("B1:B10000").Copy Destination:=Range("zz1") 'copy all the item to helper column
Range("zz:zz").Replace What:=oConst, Replacement:="" 'get only the number from all the items with the current date
nextNum = Application.Max(Range("zz:zz")) + 1 'get the next number

MsgBox oConst & CStr(nextNum) 'this line only for checking

Range("zz:zz").ClearContents 'clear the helper column

Me.TextBox6.Value = oConst & CStr(nextNum)


End If

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

Предположим, что данные в столбце B выглядят примерно так:
enter image description here

Если код запускается сегодня, он будет отображать V1.20.04.30-4 в качестве следующий номер. С теми же данными, что и выше, если код будет запущен завтра, он выдаст V1.20.05.01-1.

Чтобы получить следующий номер со вчерашнего дня (29 апреля 2020 года), коду потребуется еще одна строка - который должен знать, в какой день код должен получить следующий номер.

Или такая строка может быть короче:

oConst = "V1." & Format(Date, "yy.mm.dd") & "-"
nextNum = oConst & Application.WorksheetFunction.CountIf(Range("B:B"), "*" & oConst & "*") + 1
MsgBox nextNum
0 голосов
/ 30 апреля 2020

Если предположить, что ссылочные номера записаны в столбец B вкладки 2- V1 Загрузка (2) , то следующим номером всегда должен быть номер, найденный внизу столбца + 1. Если есть для этой даты нет номера, чем новый порядковый номер должен быть 1. Код ниже реализует этот метод

Function NextRef() As String
    ' 016

    Dim Fun As String
    Dim Counter As Integer
    Dim Rng As Range
    Dim Fnd As Range
    Dim Sp() As String

    Fun = Format(Date, """V1.""yy.mm.dd")

    With ThisWorkbook.Worksheets("2- V1 Loading (2)")
        ' start in row 2 (row 1 holding column captions)
        Set Rng = .Range(.Cells(2, "B"), .Cells(.Rows.Count, "B").End(xlUp))
    End With

    If Rng.Row > 1 Then                 ' skip, if the column is empty
        ' finds the first occurrence of Ref from the bottom
        Set Fnd = Rng.Find(What:=Fun, _
                           After:=Rng.Cells(1), _
                           LookIn:=xlValues, _
                           LookAt:=xlPart, _
                           SearchDirection:=xlPrevious)
        If Not Fnd Is Nothing Then
            Sp = Split(Fnd.Value, "-")
            If UBound(Sp) Then Counter = Val(Sp(1))
        End If
    End If

    NextRef = Fun & -(Counter + 1)
End Function

Вы можете использовать функцию просто как ComboBox1.Value = NextRef. Однако когда и как вызывать эту строку кода, немного неясно в опубликованном вами проекте. В частности, непонятно, зачем вам это вообще нужно в ComboBox, учитывая, что поле может также содержать другую информацию. Ваша идея использовать событие Change может работать не так, как задумано, поскольку это событие происходит с каждой буквой, которую вводит пользователь. Я проверил это: -

Private Sub ComboBox1_GotFocus()
    ' 016

    With ComboBox1
        If .Value = "" Then .Value = NextRef
    End With
End Sub

Следующий ссылочный номер вставляется, как только вы нажимаете на ComboBox. Это работает, но это не имеет смысла. Я думаю, теперь, когда у вас есть функция, которая выполняет работу, вы найдете способ ее развертывания. Удачи.

0 голосов
/ 30 апреля 2020

Есть несколько способов, которыми вы могли бы go об этом, но я бы сказал, что проще всего было бы поместить инкрементный номер прогона в отдельную ячейку где-нибудь на вашем рабочем листе (или другую, если хотите), чтобы ссылаться каждый раз ,

Например:

Когда данные вводятся в лист «базы данных», запишите значение прогона в ThisWorkbook.Sheets("2- V1 Loading (2)").Range("AZ1").

Затем в вашем коде проверьте это значение следующим образом:

Private Sub ComboBox1_Change()

If Me.ComboBox1.Value <> "" Then

Dim Prefix As String
Dim mm, dd, yy As String
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("2- V1 Loading (2)")
Dim s As Long

s = 1 + sh.Range("AZ1").Value

mm = Format(Date, "mm")
dd = Format(Date, "dd")
yy = Format(Date, "yy")

Prefix = "V1." & yy & "." & mm & "." & dd & "-"
v1 = "V1." & yy & "." & mm & "." & dd & "-" & s

Me.TextBox6.Value = v1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...