2012-10-01 177 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项目,并且从前端读取值是一个代价高昂的操作。您应该设置对象来保存这些值,以便您不必多次读取相同的值。

最后,您需要进行大量的验证,从检查数据库到确保用户具有最新版本以确保电子表格不在打印视图中(因为这会影响范围能够读)。

验证版本很重要,因为您将需要发布修复程序,并且您需要验证是否正在使用这些修补程序。