Используйте диапазон 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 мысли:

  1. Запрос, в котором я присоединяюсь к БД и листу Excel на основе Name (но я не так силен с ADO в VBA, поэтому любая помощь будет очень признательна)
  2. Создание 2 Scripting.Dictionaryс Name как ключ и связывая их таким образом (но это даже кажется несколько неэффективным).
  3. Я не думаю, что это возможно без циклического перебора наборов записей (в этом случае я бы просто создал словарь, как в идее 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(), но это казалось наиболее эффективным и простым в обслуживании в будущем.

Другие вопросы по тегам