Если у вас есть условия 1k (как у вас), то я думаю, что ни If
, ни Select
операторы не подходят. Кроме того, создание / поддержание выражений (в вашем коде), которые оценивают два массива по 1 элементу, может быть обременительным.
Удобный для обслуживания подход может заключаться в том, чтобы хранить элементы в Array1
на некотором рабочем листе и хранить рядом с ним содержимое AssignedArray
. Что-то вроде ниже. Скажем, желтые значения - это элементы, которые вы бы поместили в Array1
, а зеленые - это элементы, которые вы бы поместили в AssignedArray
(у меня в качестве примера только 25).

Тогда вам не обязательно нужен VBA, и вы можете просто использовать функции Excel, такие как VLOOKUP
- или MATCH
и INDEX
в сочетании. Например, я помещаю эту формулу в ячейку E4
, которая пытается найти значение в D4
среди значений в столбце A и возвращает соответствующее значение из столбца B:
=INDEX($B$1:$B$25,MATCH(D4,$A$1:$A$25,0))

Если вы все еще хотите использовать VBA, этот код должен зацикливаться на ячейках D4:D8
(это правильный диапазон для моей электронной таблицы, но, вероятно, не для вашей), сделайте их заглавными (только в памяти, а не на листе) затем введите соответствующие значения в G4:G8
:
Option Explicit
Private Sub FillInAssociatedValuesValue()
Dim inputKeys() As Variant ' <-- AKA Array1
inputKeys = ThisWorkbook.Worksheets("Sheet1").Range("A1:A25").Value2 ' Change to wherever items from Array1 are kept
Dim inputValues() As Variant '<-- AKA AssignedArray
inputValues = ThisWorkbook.Worksheets("Sheet1").Range("B1:B25").Value2 ' Change to wherever items from AssignedArray are kept
If (UBound(inputKeys, 1) - LBound(inputKeys, 1)) <> (UBound(inputValues, 1) - LBound(inputValues, 1)) Then
MsgBox ("The number of keys should be the same as the number of associated values. Code will stop running now.")
Exit Sub
End If
Dim dict As Object 'Shouldn't need to add a reference
Set dict = CreateObject("Scripting.Dictionary")
' One pass to fill the dictionary. If there are duplicates, will only add first instance.
Dim rowIndex As Long
For rowIndex = LBound(inputKeys, 1) To UBound(inputKeys, 1)
If Not dict.Exists(inputKeys(rowIndex, 1)) Then
dict.Add UCase$(inputKeys(rowIndex, 1)), inputValues(rowIndex, 1)
End If
Next rowIndex
Dim Key As String
With ThisWorkbook.Worksheets("Sheet1")
For rowIndex = 4 To 8 ' I needed to loop over range D4:D8
Key = UCase$(.Cells(rowIndex, "D").Value2)
If dict.Exists(Key) Then
.Cells(rowIndex, "G").Value2 = dict.Item(Key)
Else
' Some logic in case input is not found, and cannot be mapped to some associated value
.Cells(rowIndex, "G").Value2 = "VALUE NOT FOUND"
End If
Next rowIndex
End With
End Sub