2010-04-02 6 views
1

I 스프레드 시트에서 데이터를 가져 오는 다음 코드는 엑셀 VBA에서 직접 SQL해야 :엑셀 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. SQL 테이블에 A 열의 데이터가 이미 있는지 확인하십시오.
  2. 데이터가있는 경우 새 역할로 가져 오기보다는 업데이트 만 수행하십시오.
  3. 데이터가 없으면 새 역할로 가져옵니다.
+1

게시물을 편집하여 코드를 모두 1 블록으로받을 수 있습니까? 필요는 없지만 읽기 쉽습니다. – PowerUser

답변

0

이 작업을 수행하는 잘못된 방법입니다. 대신 SQL 서버에서이 작업을 수행하십시오. SQL Server 2008을 사용하는 경우 병합 명령을 찾습니다.

또한이 작업을 수행하는 데 SSIS를 사용하는 것이 좋습니다. VBA에서 수행하는 것보다 나은 선택입니다. 또는 t-SQL에서 OPenrowset 명령을 찾아보고 그렇게합니다.

+0

이 작업을 수행하는 방법은 여러 가지가 있지만 SQL Server에서 직접 병합하는 것이 최적의 방법이라는 데 동의합니다. – PowerUser

0

나는 SQL에서 준비 테이블에 엑셀에서 데이터를 업로드 제시 한 후 최종 목적지 테이블에 준비 테이블에서 데이터를 병합하는 사용자의 요구에 적합한 논리를 포함하는 SQL 저장 프로 시저 (또한 VBA를 통해)를 호출하는 것입니다.