Excel宏从稀疏填充表生成SQL?

时间:2010-06-24 12:22:48

标签: sql excel vba excel-vba

我有一个工作表,其中稀疏地填充了需要进入多个关系数据库表的数据。表格如下:

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,它将填充Table_1中的列A中的数据,Table_2中的列B和C(带有来自Table_1的值的外键引用) )和Table_3中的列D,E和F(外键引用Table_2的值)。 SQL可以放在单独的工作表,文本文件,剪贴板 - 几乎任何地方。

如果需要,我可以操纵表格(填写数值,重新安排数据,等等)但是我宁愿避免这个手动步骤。我希望有一些Excel / VBA宏,我可以传递源范围(或工作表),然后传递每个表的子范围,并让宏知道如何找到返回父表的引用。

2 个答案:

答案 0 :(得分:1)

这是一个非常基本的例子,并且取决于您的数据的布局与您上面描述的完全相同。 (如果您愿意,可以更改此选项以将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)

答案 1 :(得分:0)

您可以为标题创建命名范围(如果它是静态的,则为整个范围),并使用嵌入了表名的文本字符串,然后在代码中解析它。