2012-10-01 210 views
0

首先,我明白讓用戶通過excel更新數據庫的過程會帶來很多風險,我很欣賞任何有關此方法的建議,但讓我們推測我有從未犯錯的完美用戶: )通過excel更新SQL數據庫VBA

所以首先,我設法通過excel中的vba訪問存儲過程,以便根據特定單元中的參數提取數據。現在,如果我想更新這些領域,我會如何去做這件事?

我的第一個建議是創建一個存儲過程,根據電子表格中的所有字段進行更新。如果這是遵循正確的途徑,我將如何遍歷所有行?

任何其他建議,人們可以提供將不勝感激。

回答

1

有關更新SQL Server的一些說明。這個[ODBC;FileDSN=z:\docs\test.dsn]可以是任何有效的連接字符串。

Dim cn As Object, rs As Object 
Dim scn As String, sSQL As String, sFile As String 

    sFile = ActiveWorkbook.FullName 

    scn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sFile _ 
     & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

    ''Late binding, so no reference is needed 

    Set cn = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 
    cn.Open scn 

    sSQL = "SELECT * INTO [ODBC;FileDSN=z:\docs\test.dsn].FromXL " _ 
     & "FROM [Sheet8$]" 
    cn.Execute sSQL, recs 
    Debug.Print recs 

    sSQL = "INSERT INTO [ODBC;FileDSN=z:\docs\test.dsn].FromXL " _ 
     & "SELECT * FROM [Sheet8$]" 
    cn.Execute sSQL, recs 
    Debug.Print recs 

    sSQL = "UPDATE [ODBC;FileDSN=z:\docs\test.dsn].FromXL x " _ 
     & "INNER JOIN [Sheet8$] w " _ 
     & "ON x.ID = w.ID SET x.Field =w.field" 
    cn.Execute sSQL, recs 
    Debug.Print recs 

    rs.Open "SELECT * FROM [ODBC;FileDSN=z:\docs\test.dsn].FromXL", cn 
    Debug.Print rs.GetString 
0

您必須熟悉Microsofts COM Object。我的VBA很生鏽,所以要小心。

str t = Range("A1:A4").Value 

如果您正在進行大量的動態處理,您應該使自己成爲一些微軟存根的包裝方法。

function getValue(str location) 
    return Range(location + ":" + location).Value 
end function 

我以前做過大型的VBA項目,並且從前端讀取值是一個代價高昂的操作。您應該設置對象來保存這些值,以便您不必多次讀取相同的值。

最後,您需要進行大量的驗證,從檢查數據庫到確保用戶具有最新版本以確保電子表格不在打印視圖中(因爲這會影響範圍能夠讀)。

驗證版本很重要,因爲您將需要發佈修復程序,並且您需要驗證是否正在使用這些修補程序。