Создание уникального списка слов из одного столбца на нескольких листах и ​​сортировка его по алфавиту в динамический именованный диапазон - PullRequest
0 голосов
/ 24 октября 2018

У меня есть пользовательская форма, в которой есть поле со списком имен, в котором пользователь может выбирать.Список должен быть динамическим, так как я хочу, чтобы пользователь мог вводить имя в поле со списком, если оно еще не существует, но для него также должен быть список уже существующих имен.Я нашел похожий вопрос, заданный несколько лет назад здесь: Excel - все уникальные слова в диапазоне

Проблема в том, что он работает только для одного листа, и я не могу понять, какизвлечь из нескольких листов, используя это, или как автоматически сортировать имена в алфавитном порядке.

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

Sub SupplierListDynamic()
'Source: https://powerspreadsheets.com/
'For further information: https://powerspreadsheets.com/vba-create-named-range/
'declare object variable to hold reference to worksheet containing cell range
Dim myWorksheet As Worksheet

'declare variables to hold row and column numbers that define named cell range (dynamic)
Dim myFirstRow As Long
Dim myLastRow As Long
Dim myFirstColumn As Long
Dim myNamedRangeDynamic As Range    'declare object variable to hold reference to cell range
Dim myRangeName As String   'declare variable to hold defined name


Set myWorksheet = ThisWorkbook.Worksheets("List_Data")  'identify worksheet containing cell range
myFirstRow = 2  'identify first row and first column of cell range
myFirstColumn = 9
myRangeName = "SupplierList"    'specify defined name

With myWorksheet.Cells
    'find last row and last column of source data cell range
    myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    'myLastColumn = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

    'specify cell range
    Set myNamedRangeDynamic = .Range(.Cells(myFirstRow, myFirstColumn), .Cells(myLastRow, myFirstColumn))
End With

'create named range with workbook scope. Defined name is as specified.
'Cell range is as identified, with the last row and column being dynamically determined
ThisWorkbook.Names.Add Name:=myRangeName, RefersTo:=myNamedRangeDynamic
End Sub

но он не сортируется, так как я использую {=INDEX(Sep[SUPPLIER],MATCH(0,COUNTIF($I$1:I1,Sep[SUPPLIER]),0))} для извлечения уникальных значений из другого листа, когда я сортирую их, они просто возвращаются к своему первоначальному порядку из-за того, как работает формула.Я бы предпочел, чтобы все это было сделано с VBA, чтобы держать его на заднем плане, но мне нужна помощь, чтобы связать все вместе.

1 Ответ

0 голосов
/ 17 мая 2019

Так что в итоге я понял это.В итоге я скопировал только строковое значение для имен поставщиков в следующий столбец, затем очистил исходный столбец и вставил в него строковые значения.Затем я использовал описанную выше процедуру для динамического создания именованного диапазона и использовал приведенную ниже процедуру для сортировки диапазона.

Это позволило мне добавить новых поставщиков в список и соответствующим образом обновить список.Две вспомогательные процедуры, которые я использовал, приведены ниже.Надеюсь, это поможет кому-то в будущем.

Public Sub AddnewSupplier(supplier As String)
    Dim newRng As Range, supplierListColumn As Integer

    supplierListColumn = 9

    Set newRng = SelectFirstBlankCell(supplierListColumn, "List_Data")

    newRng.Value = supplier

    Call SupplierListDynamic
    Call sortSupplierList

End Sub

Public Sub sortSupplierList()
    Range("SupplierList").Sort Key1:=Worksheets("List_Data").Range("I1"), Order1:=xlAscending, Header:=xlYes
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...