Добрый день! вопрос я уже задавала и ответ получила. Но осталось несколько вопросов, которые со старого форума почему-то удалились(
Напомню, задача была:составить таблицу 2хN, состоящие из уникальных значений этих столбцов.
Предложенный макрос от Hugo:
Option Explicit
Sub StraniKodi() ' словарь в словаре
Dim a, cArr, i&, t$, Dic As Object
Dim el, lr&
a = Range("B3", Cells(Rows.Count, "A" ;) .End(xlUp)).Value
Set Dic = CreateObject("Scripting.Dictionary" ;)
With Dic
.CompareMode = 1
For i = 1 To UBound(a)
t = a(i, 2)
If Not .exists(t) Then .Add t, CreateObject("Scripting.Dictionary" ;)
.Item(t).Item(Format(a(i, 1), "00000" ;) ) = 0&
Next
End With
cArr = Dic.keys: SortArray cArr
lr = 3
For Each el In cArr
Cells(lr, 17) = el: lr = lr + 1
a = Dic.Item(el).keys: SortArray a
With Cells(lr, 16).Resize(UBound(a) + 1, 1)
.NumberFormat = "00000"
.Value = Application.Transpose(a)
End With
lr = lr + UBound(a) + 1
Next
End Sub
Private Sub SortArray(ByRef a As Variant)
Dim i As Long, j As Long
Dim t As Variant
'standard bubble sort loops
For i = LBound(a) To UBound(a) - 1
For j = i + 1 To UBound(a)
If a(i) > a(j) Then 'change to < for descending order
t = a(i)
a(i) = a(j)
a(j) = t
End If
Next j
Next i
End Sub
Вопрос был: Как изменить код, если список стран находится в столбце N, а коды в M, где N и M могут быть не подряд идущими?
Ответ:
Исходные данные берутся в массив тут:
a = Range("B3", Cells(Rows.Count, "A" ;) .End(xlUp)).Value
Т.е. от B3 до последней снизу в столбце A.
Соответственно меняйте буквы.
Но в таком варианте не должно быть лишних данных ниже кодов.
Но данный способ как раз не работает в случае, если данные находятся не в ближайших столбцах. Как это можно исправить.
В файлике есть ещё один вопросик, но буду рада ответу и на этот =)
Напомню, задача была:составить таблицу 2хN, состоящие из уникальных значений этих столбцов.
Предложенный макрос от Hugo:
Option Explicit
Sub StraniKodi() ' словарь в словаре
Dim a, cArr, i&, t$, Dic As Object
Dim el, lr&
a = Range("B3", Cells(Rows.Count, "A" ;) .End(xlUp)).Value
Set Dic = CreateObject("Scripting.Dictionary" ;)
With Dic
.CompareMode = 1
For i = 1 To UBound(a)
t = a(i, 2)
If Not .exists(t) Then .Add t, CreateObject("Scripting.Dictionary" ;)
.Item(t).Item(Format(a(i, 1), "00000" ;) ) = 0&
Next
End With
cArr = Dic.keys: SortArray cArr
lr = 3
For Each el In cArr
Cells(lr, 17) = el: lr = lr + 1
a = Dic.Item(el).keys: SortArray a
With Cells(lr, 16).Resize(UBound(a) + 1, 1)
.NumberFormat = "00000"
.Value = Application.Transpose(a)
End With
lr = lr + UBound(a) + 1
Next
End Sub
Private Sub SortArray(ByRef a As Variant)
Dim i As Long, j As Long
Dim t As Variant
'standard bubble sort loops
For i = LBound(a) To UBound(a) - 1
For j = i + 1 To UBound(a)
If a(i) > a(j) Then 'change to < for descending order
t = a(i)
a(i) = a(j)
a(j) = t
End If
Next j
Next i
End Sub
Вопрос был: Как изменить код, если список стран находится в столбце N, а коды в M, где N и M могут быть не подряд идущими?
Ответ:
Исходные данные берутся в массив тут:
a = Range("B3", Cells(Rows.Count, "A" ;) .End(xlUp)).Value
Т.е. от B3 до последней снизу в столбце A.
Соответственно меняйте буквы.
Но в таком варианте не должно быть лишних данных ниже кодов.
Но данный способ как раз не работает в случае, если данные находятся не в ближайших столбцах. Как это можно исправить.
В файлике есть ещё один вопросик, но буду рада ответу и на этот =)