Для сети трубопроводов я пытаюсь найти трубы, ведущие к люку. Может быть несколько труб, которые могут стекать в один люк. Моя структура данных организована следующим образом:
Stop Node Label
.......................
MH-37 CO-40
MH-37 CO-40
MH-39 CO-43
MH-37 CO-44
MH-39 CO-45
MH-41 CO-46
MH-35 CO-47
MH-44 CO-50
MH-39 CO-51
MH-44 CO-52
и так далее.
Конечно, в Excel мы можем обойти множественный вопрос vlookup
, используя уравнения массива. Однако я не уверен, как это делается в кодировании Excel VBA. Мне нужно автоматизировать весь процесс и, следовательно, кодирование Excel VBA. Эта задача является частью более крупного задания.
Ниже приведен код функции, который я написал до сих пор:
Function Conduitt(M As String) As String()
Dim Stop_Node As Variant /* All Manhole label */
Dim Conduit As Variant /* All conduit label */
Dim compare As Variant /* Query Manhole label */
Dim Result() As String
Dim countc As Integer
Stop_Node = ActiveSheet.Range("B2:B73").Value
Conduit = ActiveSheet.Range("C2:C73").Value
compare = M
countc = 1
Do While countc <= 72
If Application.IsError(Application.Match(Stop_Node(countc), compare)) = 0 Then
Result(countc) = Conduit(countc)
End If
countc = countc + 1
Loop
Conduitt = Result()
End Function
Если вы сравните образец данных, который я предоставил ранее, для люка MH-39
соответствующие метки трубопровода: CO-43
, CO-45
и CO-51
. Я думал, что с изменением countc
из-за цикла do
он пройдет по списку и найдет точные совпадения для MH-39
и вернет CO-43
, CO-45
и CO-51
.
Цель состоит в том, чтобы возвращать эти метки каналов только в виде массива строк с тремя строками (для случая MH-39
).
До сих пор, когда я запускаю код, я получаю:
Ошибка выполнения '9': нижний индекс вне допустимого диапазона.
Я искал разные форумы и обнаружил, что это происходит, когда ссылаются на несуществующие элементы массива. На данный момент мои ограниченные знания и опыт не помогают разгадать загадку.
После некоторых предложений от R3uK код был исправлен. По-видимому, при назначении диапазона вариантному массиву (как в случае с Stop_Node и Conduit) вариант будет многомерным. Итак, обновите код соответствующим образом и включите Preserve с Redim.
Если вам интересно, обновленный код:
Function Conduitt(Manhole As String) As String()
Dim Stop_Node As Variant
Dim Conduit As Variant
Dim Result() As String
ReDim Result(0)
Stop_Node = ActiveSheet.Range("B2:B73").Value
Conduit = ActiveSheet.Range("C2:C73").Value
For i = LBound(Stop_Node) To UBound(Stop_Node)
If Stop_Node(i, 1) <> Manhole Then
Else
Result(UBound(Result)) = Conduit(i, 1)
ReDim Preserve Result(UBound(Result) + 1)
End If
Next i
ReDim Preserve Result(UBound(Result) - 1)
Conduitt = Result