如何将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