如何将Excel表格中的数据插入到数据库表格中?

我需要将Excel表格中的数据插入Teradata表格。 我需要用MACRO来完成。

我有一个Excel表格中的数据

 COL1 COL2 COL3 COL4
 1 2 3 4
 2 5 8 10
 。
 。

等等

我需要在Excel表中保留一个button,并为该button分配一个macros,以便当我单击该button的Excel表中的行应插入到数据库表中。

要求是我将发送空的excel表单给这个人,他会用数据填写表单,他点击excel中的button,数据必须插入到数据库表中。 我宁愿这样做使用macros

谢谢大家。

看看这个链接使用vb / vba代码(用于marco)将数据从excel移动到sql server。

我已经创build了将Excel表转换为多个插入命令的函数。

将其复制到模块中,然后在公式中,将第一个参数设置为需要插入单元格的值,第二个范围应为列的名称(按F4将其设置为常量),第三个(可选)表的名字。 如果没有指定表格名称,则表格名称将被用作默认值。

在你的情况下,这是电子表格应该是这样的:

+---+------+------+------+------+-----------------------------------------+ | | A | B | C | D | E | +---+------+------+------+------+-----------------------------------------+ | 1 | COL1 | COL2 | COL3 | COL4 | | +---+------+------+------+------+-----------------------------------------+ | 2 | 1 | 2 | 3 | 4 | =Insert2DB(B3:E3,$B$2:$E$2,"TableName") | +---+------+------+------+------+-----------------------------------------+ | 3 | 2 | 5 | 8 | 10 | =Insert2DB(B4:E4,$B$2:$E$2,"TableName") | +---+------+------+------+------+-----------------------------------------+ 

这将为您生成这两个查询:

 INSERT INTO TableName ([COL1],[COL2],[COL3],[COL4]) VALUES (1,2,3,4) INSERT INTO TableName ([COL1],[COL2],[COL3],[COL4]) VALUES (2,5,8,10) 

这里是函数(适用于Microsoft SQL(TSQL)):

  Function Insert2DB(InputRange As Range, Optional ColumnsNames As Variant, Optional TableName As Variant) Dim rangeCell As Range Dim InsertValues As String Dim CellValue As String Dim C As Range Dim AllColls As String Dim SingleCell As Range Dim TableColls As String InsertValues = "" 'Start Loop For Each rangeCell In InputRange.Cells 'Recognize data type Set C = rangeCell If IsEmpty(C) Then 'DataType is NULL then NULL CellValue = "NULL" ElseIf Application.IsText(C) Then 'DataType is VARCHAR or CHAR CellValue = "'" & Trim(rangeCell.Value) & "'" ElseIf Application.IsLogical(C) Then 'DataType is bit eg. TRUE / FALSE If rangeCell.Value = True Then CellValue = "1" ElseIf rangeCell.Value = False Then CellValue = "0" End If ElseIf Application.IsErr(C) Then 'If there is an ERROR in cell, the statment will return 0 CellValue = "NULL" ElseIf IsDate(C) Then 'DataType is DATE or DATETIME, in case it is DATE specifying HH:mm:ss would do no harm CellValue = "'" & VBA.Format(rangeCell.Value, "yyyymmdd hh:mm:ss") & "'" ElseIf InStr(1, C.Text, ":") <> 0 Then 'DataType is TIME CellValue = "'" & VBA.Format(rangeCell.Value, "hh:mm:ss") & "'" ElseIf IsNumeric(C) Then 'DataType is number CellValue = rangeCell.Value End If If (Len(InsertValues) > 0) Then InsertValues = InsertValues + "," + CellValue Else InsertValues = CellValue End If Next rangeCell 'END Loop If IsMissing(ColumnsNames) Then TableColls = "" Else For Each SingleCell In ColumnsNames.Cells If Len(AllColls) > 0 Then AllColls = AllColls + "," + "[" + Trim(Replace(SingleCell.Value, Chr(160), "")) + "]" Else AllColls = "[" + Trim(Replace(SingleCell.Value, Chr(160), "")) + "]" End If Next SingleCell TableColls = " (" & AllColls & ")" End If 'If TableName is not set, then take the name of a sheet If IsMissing(TableName) = True Then TableName = ActiveSheet.Name Else TableName = TableName End If 'Set the return value Insert2DB = "INSERT INTO " & TableName & TableColls & " VALUES (" & InsertValues & ")" End Function 

如果要插入的数据非常多,则可能不需要在每个命令中都使用INSERT INTO,那么只需在第一行(每第500行)中使用Insert2DB函数,其余部分仅使用Insert2DBValues:

 +---+------+------+------+------+-----------------------------------------------+ | | A | B | C | D | E | +---+------+------+------+------+-----------------------------------------------+ | 1 | COL1 | COL2 | COL3 | COL4 | | +---+------+------+------+------+-----------------------------------------------+ | 2 | 1 | 2 | 3 | 4 | =Insert2DB(B3:E3,$B$2:$E$2,"TableName") | +---+------+------+------+------+-----------------------------------------------+ | 3 | 2 | 5 | 8 | 10 | =Insert2DBValues(A3:D3,$A$1:$D$1,"TableName") | +---+------+------+------+------+-----------------------------------------------+ 

这会给你下面的命令:

 INSERT INTO TableName ([COL1],[COL2],[COL3],[COL4]) VALUES (1,2,3,4) ,(2,5,8,10) Function Insert2DBValues(InputRange As Range, Optional ColumnsNames As Variant, Optional TableName As Variant) Dim rangeCell As Range Dim InsertValues As String Dim CellValue As String Dim C As Range Dim AllColls As String Dim SingleCell As Range Dim TableColls As String InsertValues = "" 'Start Loop For Each rangeCell In InputRange.Cells 'Recognize data type Set C = rangeCell If IsEmpty(C) Then 'DataType is NULL then NULL CellValue = "NULL" ElseIf Application.IsText(C) Then 'DataType is VARCHAR or CHAR CellValue = "'" & Trim(rangeCell.Value) & "'" ElseIf Application.IsLogical(C) Then 'DataType is bit eg. TRUE / FALSE If rangeCell.Value = True Then CellValue = "1" ElseIf rangeCell.Value = False Then CellValue = "0" End If ElseIf Application.IsErr(C) Then 'If there is an ERROR in cell, the statment will return 0 CellValue = "NULL" ElseIf IsDate(C) Then 'DataType is DATE or DATETIME, in case it is DATE specifying HH:mm:ss would do no harm CellValue = "'" & VBA.Format(rangeCell.Value, "yyyy-mm-dd hh:mm:ss") & "'" ElseIf InStr(1, C.Text, ":") <> 0 Then 'DataType is TIME CellValue = "'" & VBA.Format(rangeCell.Value, "hh:mm:ss") & "'" ElseIf IsNumeric(C) Then 'DataType is number CellValue = rangeCell.Value End If If (Len(InsertValues) > 0) Then InsertValues = InsertValues + "," + CellValue Else InsertValues = CellValue End If Next rangeCell 'END Loop If IsMissing(ColumnsNames) Then TableColls = "" Else For Each SingleCell In ColumnsNames.Cells If Len(AllColls) > 0 Then AllColls = AllColls + "," + "[" + Trim(Replace(SingleCell.Value, Chr(160), "")) + "]" Else AllColls = "[" + Trim(Replace(SingleCell.Value, Chr(160), "")) + "]" End If Next SingleCell TableColls = " (" & AllColls & ")" End If 'If TableName is not set, then take the name of a sheet If IsMissing(TableName) = True Then TableName = ActiveSheet.Name Else TableName = TableName End If 'Set the return value Insert2DBValues = ",(" & InsertValues & ")" End Function 

最后,如果你使用MySQL,string有不同的转义,所以在这种情况下使用Insert2DBMySQL:

  Function Insert2DBMySQL(InputRange As Range, Optional ColumnsNames As Variant, Optional TableName As Variant) Dim rangeCell As Range Dim InsertValues As String Dim CellValue As String Dim C As Range Dim AllColls As String Dim SingleCell As Range Dim TableColls As String InsertValues = "" 'Start Loop For Each rangeCell In InputRange.Cells 'Recognize data type Set C = rangeCell If IsEmpty(C) Then 'DataType is NULL then NULL CellValue = "NULL" ElseIf Application.IsText(C) Then 'DataType is VARCHAR or CHAR CellValue = "'" & Trim(rangeCell.Value) & "'" ElseIf Application.IsLogical(C) Then 'DataType is bit eg. TRUE / FALSE If rangeCell.Value = True Then CellValue = "1" ElseIf rangeCell.Value = False Then CellValue = "0" End If ElseIf Application.IsErr(C) Then 'If there is an ERROR in cell, the statment will return 0 CellValue = "NULL" ElseIf IsDate(C) Then 'DataType is DATE or DATETIME, in case it is DATE specifying HH:mm:ss would do no harm CellValue = "'" & VBA.Format(rangeCell.Value, "yyyy-mm-dd hh:mm:ss") & "'" ElseIf InStr(1, C.Text, ":") <> 0 Then 'DataType is TIME CellValue = "'" & VBA.Format(rangeCell.Value, "hh:mm:ss") & "'" ElseIf IsNumeric(C) Then 'DataType is number CellValue = rangeCell.Value End If If (Len(InsertValues) > 0) Then InsertValues = InsertValues + "," + CellValue Else InsertValues = CellValue End If Next rangeCell 'END Loop If IsMissing(ColumnsNames) Then TableColls = "" Else For Each SingleCell In ColumnsNames.Cells If Len(AllColls) > 0 Then AllColls = AllColls + "," + "" + Trim(Replace(SingleCell.Value, Chr(160), "")) + "" Else AllColls = "" + Trim(Replace(SingleCell.Value, Chr(160), "")) + "" End If Next SingleCell TableColls = " (" & AllColls & ")" End If 'If TableName is not set, then take the name of a sheet If IsMissing(TableName) = True Then TableName = ActiveSheet.Name Else TableName = TableName End If 'Set the return value Insert2DBMySQL = "INSERT INTO " & TableName & TableColls & " VALUES (" & InsertValues & ");" End Function