VBA:从Excel导入表格到SQL
我正在尝试使用VBA将excel中的数据表导入到SQL Server 2012中。
最好借助于UDF。
Excel表格看起来像这样。
TableID 2012 2011 2010 2009 row 1 11 12 13 14 row 2 21 22 23 24 row 3 31 32 33 34 etc..
(我把数字放在单元格中指定它们的位置,例如11 =第1行,第1列)
数据库表看起来像这样。
Header: id | year | row1 | row2 | row3 | etc.. ExampData: TableId 2012 11 21 31 .. ExampData: TableId 2011 12 22 32 ..
(这不包括“主键”列,可以是ID和年份的组合,也可以是NEWID()
)
我知道如何导入特定的列,例如我可以运行下面的代码:
INSERT INTO example_table (id, year, row1, row2, row3) VALUES ('001', '2012', '11', '21', '31')
这对于单个列非常适用,但是我怎样才能使它适用于整个表格(多列和多行)。
所以我设法得到它的工作。 这是使用Excel 2010,SQL Sever 2012。
这假定Excel中的行标题与sql中的列标题相同。
这也假设在问题文章中类似的表格布局。
要从Excel导入数据到SQL服务器,使用UDF我们可以做到以下几点。
在excel中创build一个Public Function
:
Public Function import_data(TableID, vHeader As Variant, vRow As Variant, vData As Variant) End Function
并使用您最喜欢的连接方法连接到数据库。
然后,对于INSERT
语句使用以下内容:
'Declare the variables Dim vpush As String Dim headerCount As Long Dim rowTitles As String Dim rowDatas As String Dim i As Long `Count the amount of columns headerCount = Application.CountA(vHeader) `Create insert statement For i = 1 To headerCount rowTitles = VBA.Join(WorksheetFunction.Transpose(vRow), ", ") rowDatas = VBA.Join(WorksheetFunction.Transpose(Application.Index(vData, , i)), "', '") vpush = "INSERT INTO example_table (id, " & rowTitles & ", year) VALUES ('" & TableID & "', '" & rowDatas & "', '" & vHeader(i) & "')" Next i
不要忘记.Execute (vpush)
。
比任何时候你想要导入一个表,你会做一个Excel工作表中的以下内容:
- 在单元格中键入
=import_data(
并按CTRL
+SHIFT
+A
- selectTableId
- select标题行(假设在这里总是年)
- select所有行标题的列(这将是您的SQL中的标题标题)
- select表中的所有数据
这应该做到这一点。
(PS如果这不是最有效的方式,或者你看到改进..随意编辑或添加)
如果您使用SQL Server 2008或更高版本,则可以在INSERT语句中放入多行:
INSERT INTO example_table (id, year, row1, row2, row3) VALUES ('001', '2012', '11', '21', '31'), ('002', '2012', '12', '22', '32'), ('003', '2012', '13', '23', '33')
根据电子表格的大小,您可以在一个大的INSERT或几个较小的INSERT中执行此操作。