Путём или правдами и неправдами я заработал. Получил то, что хотел, и сделал это без словарей, без использования массивов, словарей или ключей (что, по моему мнению, было бы лучше, но сейчас для меня слишком много головной боли). Должен понимать, что я разбит, район, в котором я живу, сводит меня с ума и мне нужен отпуск.
это было сделано «читерским» способом (с помощью рабочих таблиц 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](https://i.stack.imgur.com/0lQML.png)
![enter image description here](https://i.stack.imgur.com/kFEfu.png)
введите описание изображения здесь
В общем, это хитрый способ создания идентификаторов в электронной таблице. Это не лучший код. Совсем не лучший (лучше всего подойдут Dictionary и Keys). Ни самый быстрый, не назначает эти идентификаторы серверной части какому-либо хранилищу и не фиксирует их (это то, что вы хотели бы в идеале для создания идентификаторов), но он дает вам возможность создавать рабочие идентификаторы "в вашей рабочей таблице в качестве вашей работы (то есть дает вам то, что вы просили, по крайней мере, в настоящее время. Подходит для работы с электронными таблицами с аналогичными требованиями).
После того, как вы создадите их с помощью моего кода, вы можете передать их в массив (очень просто) со строками и столбцами, к которым они относятся, с другим подгруппой, и сделать с ними более стабильную работу в будущем. Но он держится и работает достаточно хорошо, так как он / для того, для чего он был разработан.
вы также можете увидеть мои тесты. image 3..Col I: мои уникальные значения из столбца B, столбец J: их количество в B, а в столбце H: n-е число в списке / порядок их появления.