Как в Excel добавить уникальные идентификаторы строкам (записям)?

Приветствую

Надо как-то в Excel или в LibreOffice настроить автоматическую генерацию уникального числа у каждой строки с заполненными данными.

Есть два столбца — ID (столбец №1) и имя человека (столбец №2). Если добавляю новое имя в столбец №2, то в этой строке в столбце №1 должен появиться уникальный идентификатор, к примеру, цифровой код (цифра). Но есть одна особенность. Допустим, что есть пять записей в файле с айдишниками с 1 по 5. Я удаляю пятую запись, строку целиком или очищаю ее, а затем добавляю новую запись. А вот у же у новой записи по факту шестой, но с учетом ранее удаленной записи, новая запись будет пятой, но ее ID уже не должен быть пятым, но должен быть шестым.

На картинке пояснил тремя блоками:
dc505601869f433e82f708d0404992e0.png
  1. добавил записи, добавились автоматом ID
  2. удалил пятую запись
  3. добавил новую запись; по факту ее ID должен быть новым, ранее не использовавшимся.


Подскажите пожалуйста реализацию.
  • Вопрос задан
  • 7657 просмотров
Пригласить эксперта
Ответы на вопрос 3
x67
@x67
Используйте ms access или любую БД. Они для этого и предназначены.
в Excel можно реализовать через макросы, но это такой костыль, что всем костылям костыль:
Добавьте код макроса в код страницы (редактор кода vba->двойной щелчок по нужному листу в менеджере проекта), диапазон ваших значений B1:B1000
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

    ' The variable KeyCells contains the cells that will
    ' cause an alert when they are changed.
    Set KeyCells = Range("B1:B1000")
    
    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

        ' Display a message when one of the designated cells has been
        ' changed.
        ' Place your code here.
        X = 5
        Y = 1
        If Cells(Y, X).Value = "" Then Cells(Y, X).Value = 0
        On Error GoTo here
        
        If Target.Value <> "" Then
            answer = MsgBox("Increment?", vbYesNo + vbQuestion, "Empty Sheet")
            If answer = vbYes Then Target.Offset(0, -1).Value = Cells(Y, X).Value + 1
            If answer = vbYes Then Cells(Y, X).Value = Cells(Y, X).Value + 1
        Else
            Target.Offset(0, -1).Value = ""
        End If
here:
        Debug.Print Err
    End If
End Sub
Ответ написан
Комментировать
Leo5700
@Leo5700
Инженер
Можно использовать ID на основе текущего времени, например 170911181042, 170911181057 и т.п. Со вставкой такого числа справится простенький макрос типа:
Sub typeID()
mydate = Date
mytime = Time
mydateF = Format(mydate, "yymmdd")
mytimeF = Format(mytime, "HhMmSs")
ID = mydateF & mytimeF
ActiveCell.Value = ID
End Sub
Ответ написан
Комментировать
0X12eb
@0X12eb
Варианты с GUID:
1. Макрос:
Public Function GetGUID() As String 
    GetGUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) 
End Function

2. Формула:
=CONCATENATE(DEC2HEX(RANDBETWEEN(0;4294967295);8);"-";DEC2HEX(RANDBETWEEN(0;42949);4);"-";DEC2HEX(RANDBETWEEN(0;42949);4);"-";DEC2HEX(RANDBETWEEN(0;42949);4);"-";DEC2HEX(RANDBETWEEN(0;4294967295);8);DEC2HEX(RANDBETWEEN(0;42949);4))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы