Как считать точные совпадения с учетом лидирующих нулей в Excel VBA - PullRequest
0 голосов
/ 19 марта 2019

У меня есть проект, который называется генератором инвентарных номеров.Номера указаны для каждого элемента каждой группы запаса, который включает в себя 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:

Проблемы, которые я решил с помощью новой формулы:

  1. Если первая строка пуста, то происходит сбой функции match ()

  2. Если номер группы запасов равен «0», функция match () работает не всегда.

  3. Проблема с добавлением номера в список, который содержит меньше цифр, чем предыдущая, чем функция 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

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Спасибо, но я нашел решение, которое искал сам: D

PS: Коды, которыми я делюсь здесь, включают комментарии на турецком языке, которые я написал, и они настроены для моего проекта, но если выЕсли у вас есть какие-либо вопросы, просто задавайте.

Вот коды для подсчета точных совпадений в указанном диапазоне цифр от начала чисел, даже если они имеют начальные нули:

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

    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 "Tüm alanları Doldurun!"

End If

End Sub
0 голосов
/ 19 марта 2019

Если вы используете действительные числа в качестве инвентарных номеров (а не текст / строки), вы можете сделать следующее:

enter image description here

  • Столбец Aсодержит истинные числа, отформатированные в числовом формате 00 00 00 000 для удобства просмотра.Фактическое число, которое хранится в ячейках в столбце A, показано в столбце B.
  • В столбце F есть формулы, показанные в столбце I, результатом этих формул является истинное число, как показано в столбце G. СтолбецF также просто отформатирован в числовом формате.

Пользователь должен ввести полный 6-значный номер группы в F3 (красный), и формулы предоставят вам следующий бесплатный инвентарный номер этой группы вF9 (зеленый).

...