Используйте диапазон Excel в качестве карты для того, что возвращать из БД
Мой клиент дал мне интересное задание, которое я пытаюсь найти, как лучше всего решить, и хотел бы услышать ваши отзывы...
Предположим, у меня есть данные в БД, которые я запрашиваю в Excel VBA (в настоящее время хранится как набор записей ADODB), который выглядит следующим образом:
Name: Char1: Char2: Char3:
a a1 a2 a3
b b1 b2 b3
c c1 c2 c3
.....
И тогда у них есть следующие данные, содержащиеся в электронной таблице:
Name: NewName: Char1: Char2: Char3:
a New_a Yes NULL Yes
b New_b Yes Yes NULL
c New_c NULL NULL Yes
.....
И они ожидают, что результат будет следующим:
NewName: Char1: Char2: Char3:
New_a a1 <blank> a3
New_b b1 b2 <blank>
New_c <blank> <blank> c3
.....
По сути, имя должно быть преобразовано в новое имя и везде, где естьNULL
, эта характеристика должна быть исключена (я надеюсь, что это имеет смысл).
Теперь я нашел способ сделать это, используя двойной Vlookup()
функций, но это некрасиво и требует записи промежуточного набора записей из БД в электронную таблицу.
Мне на самом деле любопытно посмотреть, есть ли какой-нибудь хороший способ, который кто-нибудь может придумать для достижения этой цели... Мои 3 мысли:
- Запрос, в котором я присоединяюсь к БД и листу Excel на основе
Name
(но я не так силен с ADO в VBA, поэтому любая помощь будет очень признательна) - Создание 2
Scripting.Dictionary
сName
как ключ и связывая их таким образом (но это даже кажется несколько неэффективным). - Я не думаю, что это возможно без циклического перебора наборов записей (в этом случае я бы просто создал словарь, как в идее 2), но, может быть, повторно запросить 2 набора записей и присоединиться к ним?
Есть мысли / помощь??
Спасибо!!
1 ответ
Просто чтобы ответить на этот вопрос, я закончил так:
1) я создал отдельный класс UserTableColumns
который был просто следующим:
Public NewName as String
Public Char1_YN As Boolean
Public Char2_YN As Boolean
Public Char3_YN As Boolean
2) Я запросил диапазон User-Table в наборе записей (хотя мог бы легко сделать массив) и создал словарь, который я заполнил:
КЛЮЧ = Имя
Значение = а UserTableColumns
объект, определяющий эту строку пользовательской таблицы.
3) Я перебрал свой набор записей БД, сопоставил его с соответствующей записью словаря, используя Name
поле, а затем обновил его поля, чтобы быть или исходное значение или Null
и добавил в NewName
поле
4) Вывод набора записей с использованием CopyFromRecordset()
метод.
Я уверен, что есть более элегантные способы, и мне удалось добиться этого с VLookUp()
, но это казалось наиболее эффективным и простым в обслуживании в будущем.