Как добавить уникальные серийные номера с помощью кода VBA - PullRequest
1 голос
/ 11 июля 2020

В столбце B есть некоторые значения (например, номера сотрудников). Несколько цифр повторяются. Я хочу дать уникальный серийный номер каждому уникальному идентификатору сотрудника. Как и для сотрудника A номер 1, сотрудника B-2, если A снова появится в следующей ячейке, снова введите серийный номер как 1. Я пробовал с кодом ниже, пожалуйста, помогите. Код:

Sub add_serial_number()
    Dim i As Long
    For i = 2 To Cells(Rows.Count, "B").End(xlUp).Row
        If Cells(i, "B").Value <> "" Then
            Cells(i, "A").Value = i - 1
        End If
    Next i
End Sub

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Путём или правдами и неправдами я заработал. Получил то, что хотел, и сделал это без словарей, без использования массивов, словарей или ключей (что, по моему мнению, было бы лучше, но сейчас для меня слишком много головной боли). Должен понимать, что я разбит, район, в котором я живу, сводит меня с ума и мне нужен отпуск.

это было сделано «читерским» способом (с помощью рабочих таблиц VBA - формул - это не чит, а то, что я думаю) и не массивы / словари, на которые я смотрел Здесь , Здесь и Здесь , его менее общий c и менее стабильный, как мне кажется, поэтому вы должны очистить столбец A каждый раз, когда вы запускаете, в противном случае некоторые идентификаторы будут каждый раз +1, и если вы добавите значение между другими, идентификатор изменится. Так что на самом деле это хорошо только для получения идентификатора в первый раз, сохранения и для любых новых, которые вы добавляете, если они не ниже всех остальных. изменит идентификатор. ДОБАВЛЯЙТЕ НОВЫЕ ЗНАЧЕНИЯ ТОЛЬКО НИЖЕ ДРУГИХ В СПИСКЕ, НЕ В СРЕДНЕМ (В противном случае ОН ВСЕ ЕЩЕ РАБОТАЕТ, НО ВЫ ПОТЕРЯЕТЕ (ИЗМЕНИТЕ) НЕКОТОРЫЕ ID, ВЫ В конечном итоге ИЗМЕНИТЕ ИХ, ЕСЛИ ВЫ ДОБАВИТЕ НОВЫЕ ЗНАЧЕНИЯ И ЗАПУСТИТЕ ЛЮБОЙ ДРУГОЙ ТОЛЬКО В КОНЦЕ ПОСЛЕДНЕГО ВХОДА / ЗНАЧЕНИЯ)

Итак, если вы на самом деле не добавляете значения по порядку, а добавляете их где-то посередине, да, они все равно получат идентификатор (как и все остальные), но эти идентификаторы не будут стабильный (они могут быть не такими, как раньше).

ER GO: Да, Dictionary Array был бы намного лучше (и быстрее) er go, пожалуйста, убедитесь, что вы добавили по порядку (под последней записью с пустыми ячейками или без них - это не имеет значения), а не посередине, иначе при 2-м и 3-м прогоне вы измените некоторые идентификаторы. Подходит для однократного использования, а затем для сохранения. Также хорошо для добавления записей по порядку, но плохо для добавления записей в любом месте столбца, который изменит идентификаторы (хотя все еще создает правильные для этого экземпляра). Может ты этого и хочешь? id будет меняться в зависимости от того, что вы делаете.

Sub add_my_serial_numbers()
Dim lastRow As Long
Dim matchFoundIndex As Long
Dim iCntr As Long

Range("A:A").Cells.Clear 'Very Important if your going to be using this code to make your serial #'s. For the process/code to work properly, the serial numbers must be cleared everytime you run. its part of the process and ensures it works.

lastRow = Range("B65001").End(xlUp).Row 'changed it to +1 of the lookup range to catch all values .

For iCntr = 1 To lastRow

If Cells(iCntr, 2) <> "" Then
    
    matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 2), Range("B1:B" & lastRow), 0)
    
    arr = Array(matchFoundIndex)
    
    If iCntr = matchFoundIndex Then
       If WorksheetFunction.CountIf(Range("B1:B" & lastRow), Cells(iCntr, 2)) = 1 Then
       Cells(iCntr, 1).Value = WorksheetFunction.Max(Range("A1:A" & iCntr - 1)) + 1
       Else
       
        Cells(iCntr, 1).Value = WorksheetFunction.Max(Range("A1:A" & iCntr)) + 1

        End If
       
       Else:
       
          Cells(iCntr, 1) = WorksheetFunction.Index(Range("A1:A65000"), WorksheetFunction.Match(Cells(iCntr, 2).Value, Range("B1:B65000"), 0))

    'delete "Duplicate - " & in your case if you chose to do with it. it wont be neccissary. Was for testing.
     'warning this code will not work the same or at all with strings so removed deletes which where unneccisary anyway.

    End If
End If

Next
End Sub

/ На самом деле я больше не могу видеть прямо, чтобы сосредоточиться на этом. Был целый район и окрестностей, сотни из них и музыка c. Мне нужно поесть.

Но, похоже, он работает так, как вам нужно.

add-unique-number-to-excel-datasheet-using-vba

add-unique-id-to-list-of-numbers-vba

быстрый способ получить все уникальные значения - of-a-column-in-vba

get-the-nth-index-of-an-array-in-vba

с использованием словарей youtube

Very Good Video by Leila Gharani

vba-how-do-i-get-unique-values-in-a -column-and-insert-it-into-an-array

как-извлечь-уникальный-список-и-дубликаты-в-excel-from- one-column

Все отличное чтение выше, все относится к тому, что я читал и пробовал (но сдался). Но dicts - это способ go для этого.

Жаль, что у вас нет Office 365 , вы могли бы легко использовать его Unique Function, чтобы помочь вам в этом. (но даже если они мне его дали, я не думаю, что id это понравится. Это слишком "app-y").

Extract-unique-values-in-excel-using-one -function. html

Вот снимок экрана с моими данными после запуска кода (который работает).

enter image description here

enter image description here

введите описание изображения здесь

В общем, это хитрый способ создания идентификаторов в электронной таблице. Это не лучший код. Совсем не лучший (лучше всего подойдут Dictionary и Keys). Ни самый быстрый, не назначает эти идентификаторы серверной части какому-либо хранилищу и не фиксирует их (это то, что вы хотели бы в идеале для создания идентификаторов), но он дает вам возможность создавать рабочие идентификаторы "в вашей рабочей таблице в качестве вашей работы (то есть дает вам то, что вы просили, по крайней мере, в настоящее время. Подходит для работы с электронными таблицами с аналогичными требованиями).

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

вы также можете увидеть мои тесты. image 3..Col I: мои уникальные значения из столбца B, столбец J: их количество в B, а в столбце H: n-е число в списке / порядок их появления.

0 голосов
/ 12 июля 2020

Я сделал это быстро, адаптировал код, который нашел здесь , и мне тоже пришлось подумать об этом, а также использовал «трюк», но я думаю, что это то, что вам нужно. Это дало мне желаемый результат.

Sub add_sbFindDuplicatesInColumn5()
Dim lastRow As Long
Dim matchFoundIndex As Long
Dim iCntr As Long
lastRow = Range("B65001").End(xlUp).Row 'changed it to +1 of the lookup range to catch all values .

For iCntr = 1 To lastRow

If Cells(iCntr, 2) <> "" Then
    
       
    matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 2), Range("B1:B" & lastRow), 0)
    
    If iCntr = matchFoundIndex Then
        Cells(iCntr, 1).Value = iCntr - 1
        
       Else:
          Cells(iCntr, 1) = "Duplicate - " & WorksheetFunction.Index(Range("A1:A65000"), WorksheetFunction.Match(Cells(iCntr, 2).Value, Range("B1:B65000"), 0))

    'delete "Duplicate - " & in your case if you chose to do with it. it wont be neccissary. Was for testing.

    End If
End If


Next
End Sub

Я говорю «использовал трюк», потому что я думаю, что мне следовало хранить дубликаты и их идентификаторы в их собственном массиве, что, как я думаю, вам «следует» do для правильного рабочего ответа и запустите проверку против них и назначьте соответствующие значения таким образом. Вместо этого я делаю (из-за нехватки времени) - ищу их с помощью index match WorksheetFunction. Но я думаю, что теперь я хожу по кругу, и именно для этого был создан Excel. Код кажется именно тем, что вам нужно. Делает работу. Единственный вопрос в том, как он будет работать с более чем 20 тыс. Строк и вашей оперативной памятью на 8 ГБ? значения id.

Это сработало для меня. Работает ли это для вас ? Я думаю, что мой ответ самый логичный / самый простой, вам даже не нужен какой-либо специальный порядок в ваших данных, и это самый быстрый di sh для решения для вас, которое я мог бы сделать за полчаса, которые у меня были. это (без этой идеи массива). Дай мне знать.

О нет. Он получает все дубликаты и присваивает идентификаторы всем значениям, кроме последнего, потому что поиск, конечно, не находит ничего под ним. Я сейчас в постели, ложусь спать и постараюсь сделать так, чтобы это сработало завтра.

Хорошо. Думаю, я решил и эту проблему для диапазона. Просто убедитесь, что в последней строке на 1 строку больше, чем в диапазонах поиска. Затем он поймает все в этом диапазоне (идентификаторы и дубли). Если у кого-то есть более элегантное, универсально применимое (и менее жесткое) решение для этого, дайте мне знать.

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