2010-04-02 244 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存儲過程,該過程包含適合您的需要的邏輯,以將臨時表中的數據合併到最終的目標表中。