Похоже, вы неправильно поняли намерение PEH.Я объясняю и расширяю это.Вот изображение рабочей таблицы, которую он рекомендовал вам кэшировать.
Вы хотите кэшировать диапазон B2: D7 (или E7 в будущем),Вот код, который выполняет кеширование.
Sub GetTemplateAddresses(AddList As Variant)
' loads AddList only if not already loaded
Dim Rng As Range ' Range of cached addresses table
Dim Rl As Long ' last used row in Ws "Cache"
If IsEmpty(AddList) Then ' skip if AddList is already set
With Worksheets("Cache") ' use your own name for this worksheet
Rl = .Cells(.Rows.Count, "A").End(xlUp).Row
' start from B2 to (LastRow of Template3)
Set Rng = .Range(.Cells(2, 2), .Cells(Rl, Ncc3 + 1))
AddList = Rng.Value
End With
End If
End Sub
Прежде чем вы сможете вызвать этот саб, вам нужно немного подготовиться.Заметьте, что подпрограмма имеет параметр AddList .Идея (любезно предоставлена @PEH) заключается в том, что вам не нужно снова кэшировать ее, если она уже кэширована.Таким образом, вы предоставляете переменную массива, и код загружает ее, только если она пуста.
Другой подготовкой является ссылка в приведенном выше коде на перечисление Ncc3 .Enum предназначен для простой адресации всего массива AddList.Помните, что он должен быть в верхней части любого стандартного модуля кода, перед любой процедурой на этом листе.Вот полный перечень.Явная опция
Enum Ncc ' Array of Cached addresses
Ncc1 = 1 ' Template 1
Ncc2
Ncc3
NccFname = 1 ' assign integers only
NccMname ' if no value is assigned,
NccLname ' VBA assigns previous + 1
NccCity
NccStreet
NccZip
NccTel
NccEmail ' NccEmail = 8 (test with ? NccEmail in the Immediate window)
End Enum
Я разработал небольшую процедуру тестирования для вас.Установите его в стандартный модуль кода, почему бы не под перечисленным выше перечислением и над подпунктом, который он вызывает?
Private Sub TestGetAdd()
Dim AddList As Variant
Dim TemplateNumber As Ncc, FieldName As Ncc
GetTemplateAddresses AddList
TemplateNumber = Ncc2 ' change the numbers for testing
FieldName = NccStreet ' the press F5
MsgBox "You have entered template No. " & TemplateNumber & vbCr & _
"and specified field No. " & FieldName & String(2, vbCr) & _
"The address is " & AddList(FieldName, TemplateNumber)
End Sub
Он готов к запуску.Протестируйте его.
Чтобы использовать всю эту настройку, теперь вы можете приступить к определению ячеек из любого из ваших шаблонов после того, как вы знаете имя рабочего листа и номер его шаблона.Ws.Range (AddList (NccCity, Ncc2)). Значение будет возвращать название города из шаблона 2 в соответствии с адресом этого поля, хранящегося в кэше.