У меня есть проект под названием генератор инвентарных номеров. Цифры предназначены для каждого элемента каждой группы запасов, которая включает 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
Проблема здесь в том, что каждый номер группы может содержать ведущие нули или каждая цифра может быть нулем. Чтобы создать уникальные номера, мне нужно подсчитать точные совпадения данной группы запасов (которая на самом деле является объединенной версией трех групп), выполнив поиск в списке инвентарных номеров и добавив новый инвентарный номер, который создается добавлением 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. Таким образом, в конце пользователь добавляет новый инвентарный номер на последней вкладке пользовательской формы, выбирая группу продуктов из поля со списком, а затем выбирая в зависимости от выбора группы продуктов из второго зависимого поля со списком SubProduct Group. После этого они выбирают группу компонентов из независимого поля со списком и дают имя новому элементу. Таким образом, группы продуктов и вспомогательных продуктов объединены и перечислены в поле со списком «Группа вспомогательных продуктов» с их описаниями рядом с их номерами. При добавлении 4 цифр из групп «Продукт-вспомогательный продукт» и 2 цифр из выпадающих списков «Группа компонентов» мы получаем в качестве входных данных номер нашей группы акций, состоящий из 6 цифр. Реальная задача заключалась в том, чтобы найти данный номер группы акций в инвентарном списке, который отформатирован так, чтобы отображать 9 цифр и иметь ведущие нули, а также подсчитывать точные совпадения. Добавляя 1 к результату подсчета, мы создаем наш новый элемент или инвентарный номер.
Изменить 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