Макрос Excel для создания SQL из малонаселенных листов? - PullRequest
1 голос
/ 24 июня 2010

У меня есть рабочий лист, который редко заполняется данными, которые необходимо поместить в несколько таблиц реляционной базы данных.Лист выглядит следующим образом:

A        B        C        D        E        F        G
Table_1  Table_2  Table_2  Table_3  Table_3  Table_3  Table_3
                           Table_3  Table_3  Table_3  Table_3
         Table_2  Table_2  Table_3  Table_3  Table_3  Table_3
                           Table_3  Table_3  Table_3  Table_3
         Table_2  Table_2  Table_3  Table_3  Table_3  Table_3
                           Table_3  Table_3  Table_3  Table_3
Table_1  Table_2  Table_2  Table_3  Table_3  Table_3  Table_3
                           Table_3  Table_3  Table_3  Table_3
         Table_2  Table_2  Table_3  Table_3  Table_3  Table_3
                           Table_3  Table_3  Table_3  Table_3
         Table_2  Table_2  Table_3  Table_3  Table_3  Table_3
                           Table_3  Table_3  Table_3  Table_3

Учитывая эти данные, я бы сгенерировал SQL, который бы заполнял данные в столбце A в Table_1, столбцах B и C в Table_2 (со ссылкой на внешний ключзначение из Table_1) и столбцы D, E и F в Table_3 (со ссылкой внешнего ключа на значение из Table_2).SQL можно разместить на отдельном листе, в текстовом файле, в буфере обмена - практически везде.

Я могу манипулировать таблицей, если это необходимо (для заполнения значений, переупорядочения данных и т. Д.), Но этопредпочитаю избегать этого ручного шага.Я надеюсь, что есть некоторый макрос Excel / VBA, в котором я могу передать исходный диапазон (или лист), а затем поддиапазоны для каждой таблицы и получить от макроса знать, как найти ссылку на родительскую таблицу.

Ответы [ 2 ]

1 голос
/ 24 июня 2010

Это довольно простой пример, и он зависит от того факта, что ваши данные выложены именно так, как вы описали это выше.(Вы можете изменить это, чтобы передать originCell в качестве аргумента, если хотите, или просто вручную изменить значение при устранении неполадок / реализации.)

Все, что он делает, это берет значение строки исходной ячейки и создаетновый диапазон в столбце A с тем же номером строки.Затем он просто смотрит на ячейку над ним и проверяет, не заполнено ли оно.Если он пуст, он сдвигает диапазон вверх на одну строку, пока не найдет заполненную ячейку.У меня есть это, чтобы поместить значение найденного parentCell в I3, очевидно, вы можете поместить его где угодно, просто чтобы убедиться, что оно находит правильное значение.

Sub findParent()
    Dim originCell As Range, parentCell As Range
    Set originCell = Sheet1.Range("E3")
    Set parentCell = Sheet1.Cells(originCell.Row, 1)
    While IsEmpty(parentCell) = True
        Set parentCell = parentCell.Offset(-1, 0)
    Wend
    Sheet1.Range("I3").Value = parentCell.Value
End Sub

Это было бы хорошей отправной точкойна любое количество решений.В дополнение к передаче originCell в качестве аргумента, вы также можете передать номер столбца, скажем, значения Table_2, которое вы хотите найти, используя такую ​​форму:

Sub findParent(originCell as Range, parentColumn as long)
0 голосов
/ 25 июня 2010

Вы можете просто создать именованные диапазоны для заголовков (или всего диапазона, если он статический) с текстовой строкой, в которую встроено имя таблицы, а затем проанализировать ее в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...