使用VBA把EXCEL数据导入数据库

Dim table_Name$
Sub JugeData()
Dim i%, Cnum%, dt$, arry1 () As String, arry2 () As String, arry3 () As String, cnn As Object, rst As Object

cdt = Format(Date, "MMDD")

table_Name = InputBox("请输入数据库表名", "数据库表名", "ygl_temp" & cdt)

Cnum = ActiveSheet.Range("a1"). CurrentRegion.Columns.Count
On Error GoTo errmsg


'定义字段为文本类型
For i = 1 To Cnum
  ReDim Preserve arry2(i - 1)
  dt = ActiveSheet.Cells(1, i).Value
  dt2 = FindDataType(dt )
  arry2(i - 1) = dt2 & " varchar2(800)"
Next

'生成建表语句
str1 = Join(arry2, " , " )
str2 = "create table " & table_Name & " (" & str1 & " )"
'MsgBox str2


Set cnn = CreateObject ("ADODB.Connection" )
Set rst = CreateObject ("ADODB.Recordset" )
cnn.Open "Provider=OraOLEDB.Oracle.1;Data Source=cd;User Id=user;Password=password;"

sql = str2
cnn.Execute (sql)
MsgBox "create table OK"


cnn.Close
Set rst = Nothing
Set cnn = Nothing

Call 插入数据


    Exit Sub
errmsg:
    MsgBox Err.Description, , "错误报告"
End Sub



Function FindDataType(V_cell As String)

'替换标题里的特殊字符
If V_cell = "" Then V_cell = "空的"

If IsNumeric(Left (V_cell, 1 )) = True Then V_cell = "a" & V_cell

If Len(V_cell) >= 15 Then V_cell = Left (V_cell, 14 )

If InStr(V_cell , "/") Then V_cell = Replace (V_cell, "/" , "_")

If InStr(V_cell , "'") Then V_cell = Replace (V_cell, "'" , "")



FindDataType = V_cell

End Function

Sub 插入数据()
    Dim tt, arr1(), i% , j%, str$ , arr2(), str2$
    tt = Timer
    Dim cnn As Object, sql$ , rst As Object
    arr1 = ActiveSheet.Range("a1"). CurrentRegion.Value
    Set cnn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    On Error GoTo errmsg
    cnn.Open "Provider=OraOLEDB.Oracle.1;Data Source=cd;User Id=stat_yg;Password=yg12345;"
   
    '构造插入语句
    sql = "insert into " & table_Name & " values ("
    '从第2行开始插入数据
    For i = 2 To UBound(arr1, 1)
        For j = 1 To UBound (arr1, 2 )
            ReDim Preserve arr2(j - 1)
            '在单元格内容插入单引号
            arr2 (j - 1) = "'" & arr1(i, j ) & "'"

        Next
        str = Join( arr2, ",")
        '执行插入语句
        str2 = sql & str & ")"
        cnn.Execute (str2)
    Next

    MsgBox "ok,用了" & Timer - tt & "秒"

    cnn.Close
    Set cnn = Nothing
    Exit Sub
errmsg:
    MsgBox Err.Description, , "错误报告"
End Sub


2014.10.21 增加重复字段名处理,字段名含(,(,-的处理,修改插入数据行变量I为LONG类型,解决超过3W行整形数据溢出问题



2014.11.26 增加对字段名包含换行符的处理,对字段名第一个字符为特殊字符的处理,替换2个下划线为1个。





附件列表

     

    posted @ 2015-02-06 17:06  阳光树林  阅读(8338)  评论(0编辑  收藏  举报