2010-04-02 260 views
1

我有下面的代码从一个电子表格来导入数据直接从Excel VBA SQL:Excel的VBA SQL导入

Sub SQLIM() 

      ' Send data to SQL Server 
    ' This code loads data from an Excel Worksheet to an SQL Server Table 
    ' Data should start in column A and should be in the same order as the server table 
    ' Autonumber fields should NOT be included' 
    ' FOR THIS CODE TO WORK 
    ' In VBE you need to go Tools References and check Microsoft Active X Data Objects 2.x library 


    Dim Cn As ADODB.Connection 
    Dim ServerName As String 
    Dim DatabaseName As String 
    Dim TableName As String 
    Dim UserID As String 
    Dim Password As String 
    Dim rs As ADODB.Recordset 
    Dim RowCounter As Long 
    Dim ColCounter As Integer 
    Dim NoOfFields As Integer 
    Dim StartRow As Long 
    Dim EndRow As Long 
    Dim shtSheetToWork As Worksheet 
    Set shtSheetToWork = ActiveWorkbook.Worksheets("Sheet1") 
    Set rs = New ADODB.Recordset 


    ServerName = "WIN764X\sqlexpress" ' Enter your server name here 
    DatabaseName = "two28it" ' Enter your database name here 
    TableName = "COS" ' Enter your Table name here 
    UserID = "" ' Enter your user ID here 
    ' (Leave ID and Password blank if using windows Authentification") 
    Password = "" ' Enter your password here 
    NoOfFields = 7 ' Enter number of fields to update (eg. columns in your worksheet) 
    StartRow = 2 ' Enter row in sheet to start reading records 
    EndRow = shtSheetToWork.Cells(Rows.Count, 1).End(xlUp).Row ' Enter row of last record in sheet 

    ' CHANGES 
    ' Dim shtSheetToWork As Worksheet 
    ' Set shtSheetToWork = ActiveWorkbook.Worksheets("Sheet1") 
    '******** 

    Set Cn = New ADODB.Connection 
    Cn.Open "Driver={SQL Server};Server=" & ServerName & ";Database=" & DatabaseName & _ 
    ";Uid=" & UserID & ";Pwd=" & Password & ";" 

    rs.Open TableName, Cn, adOpenKeyset, adLockOptimistic 

    For RowCounter = StartRow To EndRow 
     rs.AddNew 
     For ColCounter = 1 To NoOfFields 
      rs(ColCounter - 1) = shtSheetToWork.Cells(RowCounter, ColCounter) 
     Next ColCounter 
    Next RowCounter 
    rs.UpdateBatch 

    ' Tidy up 
    rs.Close 
    Set rs = Nothing 
    Cn.Close 
    Set Cn = Nothing 

End Sub 

代码的伟大工程。但是,我想知道是否有人可以帮我修改代码:

  1. 检查列A中的数据是否已经存在于SQL表中。
  2. 如果数据存在,则只更新而不导入为新角色。
  3. 如果数据不存在,则将其作为新角色导入。
+1

你能修改你的帖子以获得代码全部在1块吗?没有必要,但它更易于阅读。 – PowerUser 2010-04-02 15:24:04

回答

0

这是执行此任务的错误方法。相反,从SQL服务器执行此操作。如果您使用的是SQL Server 2008,请查阅合并命令。

还可以考虑使用SSIS来完成此任务,这是比从VBA执行此任务更好的选择。或者在t-SQL中查找OPenrowset命令,并以此方式进行操作。

+0

有很多方法可以完成这项任务,但我同意直接从SQL Server合并将是最佳方法。 – PowerUser 2010-04-02 15:30:10

0

我建议将数据从Excel上传到SQL中的临时表,然后调用(也通过VBA)SQL存储过程,该过程包含适合您的需要的逻辑,以将临时表中的数据合并到最终的目标表中。