У меня есть проект, который называется генератором инвентарных номеров.Номера указаны для каждого элемента каждой группы запаса, который включает в себя 2 цифры для основных групп продуктов, 2 цифры для подгрупп продуктов, 2 цифры для групп компонентов, и в целом они образуют первые 6 цифр инвентарного номера.Следующие 3 цифры относятся к индивидуальному номеру элемента, который я пытаюсь сгенерировать после того, как количество точных совпадений номеров данной группы запасов в списке инвентарных номеров и добавление 1 к результату подсчета.
_ _ _ _ _ _ _ _ _
M G S G C G I E N
MG = Main Group
SG = Sub Group
CG = Component Group
SG = Stock Group (The First 6 Digits)
IEN = Individual Element Number
Проблема здесь в том, что каждый номер группы может содержать начальные нули или каждая цифра может быть нулем.Чтобы создать уникальные номера, мне нужно посчитать точные совпадения для данной группы запасов (которая на самом деле является комбинированной версией 3 групп), выполнив поиск в списке инвентарных номеров и добавить новый инвентарный номер, который создается путем добавления1 к результату подсчета и добавление того результата, который имеет максимум 3 цифры, к концу группы запасов 6 цифр.После их создания я также добавляю их в список инвентарных номеров.Например, если заданная группа запасов имеет вид «00 00 10» и если в списке инвентарных номеров есть номера запасов, например «00 00 00 010», то счетчик их тоже считает.
Примечание. Номера не имеютмежду ними я ставлю пробелы (""), чтобы их было легче понять.
Вот коды, которые я написал:
Private Sub EkleSEB_Click() 'Stok Ekle kısmında Stok Ekle butonu tıklanırsa
Dim StokSS As Variant 'Stok Ekle Sıra Say
Dim StokS As Variant 'Stok Say
Dim StokEAS As Integer 'Stok Eşleşen Adet Say
Dim StokG As Long 'Stok Grubu
Dim StokA As Long
If AnaGKSEC <> "" And AltGKSEC <> "" And BilGKSEC <> "" And BirSEC <> "" And StokASET <> "" Then
StokSS = WorksheetFunction.CountA(Worksheets("ÜretimKodları").Range("A:A")) + 1
StokG = (AltGKSEC.Value * 100) + BilGKSEC.Value
For StokS = 2 To StokSS
If Len(Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokS, 1).Value, 9)) < 4 And StokG = 0 Then
StokEAS = (Application.WorksheetFunction.CountIf(Worksheets("ÜretimKodları").Range("A2", ThisWorkbook.Sheets("ÜretimKodları").Cells(StokSS - 1, 1)), "<1000")) + 1
If StokEAS = 999 Then
MsgBox "Seçilen grupta kod sınırına ulaşıldı!"
Else 'Stok Kodu oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
ElseIf Len(Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokS, 1).Value, 9)) = 4 And StokG > 0 And StokG < 10 Then
StokEAS = 0
For StokA = 2 To StokSS - 1
If Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokA, 1).Value, 1) = Left(StokG, 1) Then
StokEAS = StokEAS + 1
End If
Next StokA
If StokEAS = 999 Then
MsgBox "Seçilen grupta kod sınırına ulaşıldı!"
Else 'Stok Kodu oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS + 1), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
ElseIf Len(Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokS, 1).Value, 9)) = 5 And StokG > 9 And StokG < 100 Then
For StokA = 2 To StokSS - 1
If Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokA, 1).Value, 2) = Left(StokG, 2) Then
StokEAS = StokEAS + 1
End If
Next StokA
If StokEAS = 999 Then
MsgBox "Seçilen grupta kod sınırına ulaşıldı!"
Else 'Stok Kodu oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
ElseIf Len(Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokS, 1).Value, 9)) = 6 And StokG > 99 And StokG < 1000 Then
For StokA = 2 To StokSS - 1
If Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokA, 1).Value, 3) = Left(StokG, 3) Then
StokEAS = StokEAS + 1
End If
Next StokA
If StokEAS = 999 Then
MsgBox "Seçilen grupta kod sınırına ulaşıldı!"
Else 'Stok Kodu oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
ElseIf Len(Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokS, 1).Value, 9)) = 7 And StokG > 999 And StokG < 10000 Then
For StokA = 2 To StokSS - 1
If Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokA, 1).Value, 4) = Left(StokG, 4) Then
StokEAS = StokEAS + 1
End If
Next StokA
If StokEAS = 999 Then
MsgBox "Seçilen grupta kod sınırına ulaşıldı!"
Else 'Stok Kodu oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
ElseIf Len(Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokS, 1).Value, 9)) = 8 And StokG > 9999 And StokG < 100000 Then
For StokA = 2 To StokSS - 1
If Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokA, 1).Value, 5) = Left(StokG, 5) Then
StokEAS = StokEAS + 1
End If
Next StokA
If StokEAS = 999 Then
MsgBox "Seçilen grupta kod sınırına ulaşıldı!"
Else 'Stok Kodu oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
ElseIf Len(Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokS, 1).Value, 9)) = 9 And StokG > 99999 And StokG < 1000000 Then
For StokA = 2 To StokSS - 1
If Left(ThisWorkbook.Sheets("ÜretimKodları").Cells(StokA, 1).Value, 6) = Left(StokG, 6) Then
StokEAS = StokEAS + 1
End If
Next StokA
If StokEAS = 999 Then
MsgBox "Seçilen grupta kod sınırına ulaşıldı!"
Else 'Stok Kodu oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
Else
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(((StokG * 1000) + StokEAS), "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
End If
Next StokS
Else
MsgBox "Tüm alanları Doldurun!"
End If
End Sub
Как видите, я отсортировал каждый элемент насписок по месту первой ненулевой цифры, которую они имеют, но единственное, что я не мог сделать, - это сделать функцию «Left ()» для подсчета лидирующих нулей, или мне нужна новая функция для подсчета точных совпадений с учетомначальные нули.
Редактировать:
На самом деле я не знаю, в каком типе они хранятся, но я перевернул первый столбец инвентарных списков, в котором 9-значные инвентарные номера хранятся в специальном форматировании,Я постараюсь вкратце объяснить, как я пытаюсь создать новый инвентарный номер для нового элемента.Итак, сначала пользователь добавляет новые группы продуктов на вкладке пользовательской формы, а затем, связанные с группой продуктов, добавляет новые группы субпродуктов на другой вкладке пользовательской формы.Группы компонентов также добавляются в другую вкладку пользовательской формы, но они не связаны с группами Product-SubProduct.Таким образом, в конце пользователь добавляет новый инвентарный номер на последней вкладке пользовательской формы, выбирая группу продуктов в комбинированном списке, а затем выбирает в зависимости от выбора группы продуктов из второго зависимого комбинированного списка группу субпродуктов.После этого они выбирают группу компонентов из независимого поля со списком и дают имя новому элементу.Таким образом, группы продуктов и субпродуктов объединяются и перечисляются в комбинированном списке субпродуктовых групп с их описаниями рядом с их номерами.Добавляя 4 цифры из групп Product-SubProduct и 2 цифры из списка выпадающих списков Component Group, мы получаем номер группы акций, который имеет 6 цифр в качестве входных данных.Реальная сделка заключалась в том, чтобы найти указанный номер группы акций в инвентарном списке, который отформатирован так, чтобы показывать 9 цифр и иметь начальные нули, и подсчитывать точные совпадения.Добавляя 1 к результату подсчета, мы создаем наш новый элемент или инвентарный номер.
Edit 2:
Проблемы, которые я решил с помощью новой формулы:
Если первая строка пуста, то происходит сбой функции match ()
Если номер группы запасов равен «0», функция match () работает не всегда.
Проблема с добавлением номера в список, который содержит меньше цифр, чем предыдущая, чем функция match (), фокусируется на последнем добавленном номере, или номер, который содержит меньше цифр, решена.
4.Я также добавил функцию, которая прекращает добавление нового инвентарного номера в список (хотя в моем случае группа акций может иметь только 999 элементов), когда счетчик достигает значения "999".
И новый код VBA: (Извините за турецкие комментарии, которые вы видите в кодах)
Private Sub EkleSEB_Click() 'Stok Ekle kısmında Stok Ekle butonu tıklanırsa
Dim StokK As Variant 'Stok Kodu
Dim StokKS As Variant 'Stok Kodu Say
Dim StokSS As Variant 'Stok Sıra Say
Dim StokG As Variant 'Stok Grubu
Dim StokGF As Variant 'Stok Grubu Formatlı
Dim StokGS As Variant 'Stok Grubu Say
If AnaGKSEC <> "" And AltGKSEC <> "" And BilGKSEC <> "" And BirSEC <> "" And StokASET <> "" Then
StokSS = WorksheetFunction.CountA(Worksheets("ÜretimKodları").Range("A:A")) + 1
StokG = ((AltGKSEC.Value * 100) + BilGKSEC.Value)
StokGF = Format(StokG, "000000")
StokKS = 0
For StokGS = 2 To StokSS 'Stok Grubu Say
If StokGF = Left(Worksheets("ÜretimKodları").Cells(StokGS, 1).Text, 6) Then
StokKS = StokKS + 1
End If
Next StokGS
If Not StokKS > 999 Then
StokK = (StokG * 1000) + StokKS 'Stok Kodu Oluştur
Worksheets("ÜretimKodları").Cells(StokSS, 1) = Format(StokK, "#########000000000")
Worksheets("ÜretimKodları").Cells(StokSS, 2) = StokASET.Value
Worksheets("ÜretimKodları").Cells(StokSS, 3) = BirSEC.Value
StokKSET.Value = Format(Worksheets("ÜretimKodları").Cells(StokSS, 1).Value, "#########000000000")
Else
MsgBox "Seçtiğiniz Grup Kodu İçin Üretilebilecek Stok Kodu Sınırına Ulaşıldı!"
End If
Else
MsgBox "Tüm alanları Doldurun!"
End If
End Sub