我需要将excel表中的数据插入到teradata表中。 我需要使用MACRO来完成。
我有像中文这样的excel表中的数据
COL1 COL2 COL3 COL4 1 2 3 4 2 5 8 10 . .等等
我需要在excel表中保留一个按钮,并为该按钮分配一个宏,这样当我点击按钮时,excel表中的行应插入到数据库表中。
要求是我将空的excel表发送给该人,他将用数据填写表单,然后单击excel中的按钮,数据必须插入到数据库表中。 我更喜欢用宏来做这个..
谢谢大家。
答案 0 :(得分:4)
我创建了将Excel表格转换为多个插入命令的函数。
将其复制到模块中,然后在公式中,将第一个参数设置为需要插入的单元格的值,第二个范围应该是列的名称(按F4将其设置为常量),第三个(可选)表的名称。如果未指定表名,则表的名称将用作默认值。
在您的情况下,这是电子表格的样子:
+---+------+------+------+------+-----------------------------------------+
| | A | B | C | D | E |
+---+------+------+------+------+-----------------------------------------+
| 1 | COL1 | COL2 | COL3 | COL4 | |
+---+------+------+------+------+-----------------------------------------+
| 2 | 1 | 2 | 3 | 4 | =Insert2DB(A2:D2,$A$1:$D$1,"TableName") |
+---+------+------+------+------+-----------------------------------------+
| 3 | 2 | 5 | 8 | 10 | =Insert2DB(A3:D3,$A$1:$D$1,"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,有不同的字符串转义,所以在这种情况下使用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
答案 1 :(得分:2)
查看this链接,了解如何使用vb / vba代码(对于marco)将数据从excel移动到sql server。