Я думаю, что было бы лучше передать два диапазона функции создания словаря. Это позволяет диапазонам быть полностью отдельными, даже в разных книгах. Это также позволяет сопоставить диапазон 1D с диапазоном 2D, как показано ниже.
В качестве альтернативы вы также можете передать два массива значений диапазона. Это может быть чище для диапазонов 1D, но приведет к немного большему количеству кода для отображения 2D. Обратите внимание, что элементы диапазона могут проходить по циклу слева направо сверху вниз по индексу. Вы можете использовать Application.Transpose(Range("A1:A5"))
для эффективного запуска сверху вниз слева направо.
Неровное сопоставление
Sub Test()
RangeToDict Sheets(1).Range("A1:A5"), Sheets(2).Range("C1:E2")
End Sub
Function RangeToDict(ByVal KeyRng As Range, ByVal ValRng As Range) As Dictionary
Set RangeToDict = New Dictionary
For Each r In KeyRng
vi = vi + 1
'It may not be advisable to handle empty key values this way
'The handling of empty values and #N/A/Error values
'Depends on your exact usage
If r.Value2 <> "" Then
RangeToDict.Add r.Value2, ValRng(vi)
Debug.Print r.Value2 & ", " & ValRng(vi)
End If
Next
End Function
Рядом (как диапазон)
Если ваш целевой диапазон представляет собой один диапазон из двух столбцов рядом друг с другом, вы можете упростить передачу одного диапазона, как показано ниже. Следовательно, это также работает для отображения любого другого элемента в одномерном диапазоне.
Sub Test()
RangeToDict2 Range("A1:B5")
End Sub
Function RangeToDict2(ByVal R As Range) As Dictionary
Set RangeToDict2 = New Dictionary
i = 1
Do Until i >= (R.Rows.Count * R.Columns.Count)
RangeToDict2.Add R(i), R(i + 1)
Debug.Print R(i) & ", " & R(i + 1)
i = i + 2
Loop
End Function
Два столбца (в виде массива)
Наконец, в качестве примера передачи массивов в качестве аргументов вы можете сделать что-то вроде следующего. Однако следующий код будет работать только с учетом конкретного сценария OP для сопоставления двух столбцов. Как есть, он не будет обрабатывать сопоставление строк или чередующихся элементов.
Sub Test()
Dim Keys() As Variant: Keys = Range("E1:I1").Value2
Dim Values() As Variant: Values = Range("E3:I3").Value2
RangeToDict Keys, Values
End Sub
Function RangeToDict(Keys() As Variant, Values() As Variant) As Dictionary
Set RangeToDict = New Dictionary
For i = 1 To UBound(Keys)
RangeToDict.Add Keys(i, 1), Values(i, 1)
Debug.Print Keys(i, 1) & ", " & Values(i, 1)
Next
End Function
Использование именованных диапазонов
Может быть удобно использовать именованные диапазоны, и в этом случае вы можете передать диапазон в качестве аргумента, подобного этому...
Sub Test()
RangeToDict Names("Keys").RefersToRange, Names("Values").RefersToRange
End Sub
person
u8it
schedule
04.11.2015