在VBA

时间:2016-05-10 20:13:45

标签: excel vba excel-vba adodb

所以,我试图从ListRow获取Target,但我似乎不停地得到错误。目标是将文档中完成的更改上载到服务器。最初我通过ListRows循环以在文档关闭时上传更改,但现在ListObjects变得如此之大以至于将数组上传到服务器所需的时间太长。更快的方式似乎只是在发生变化时上传。

我在下面编写了一个代码,我收到错误:无效或不合格的引用。 我已经省略了一些功能,因为它们正在工作,与问题无关。

     Private Sub Worksheet_Change(ByVal Target As Range)
        Application.Calculation = xlCalculationManual

        Dim CustomersConn As ADODB.Connection
        Dim CustomersCmd As ADODB.Command
        Dim lo As Excel.ListObject
        Dim ws As Excel.Worksheet
        Dim lr As Excel.ListRow
        Dim Customers As Variant


        Set ws = ThisWorkbook.Worksheets(8)
        Set lo = ws.ListObjects("TCustomers")
        Set CustomersConn = New ADODB.Connection
        Set CustomersCmd = New ADODB.Command

        lr = .ListRow(Target.row - 5).Index


        CustomersConn.ConnectionString = SQLConStr

        CustomersConn.Open

        CustomersCmd.ActiveConnection = CustomersConn


        CustomersCmd.CommandText = _
        GetUpdateText( _
        Intersect(lr.Range, lo.ListColumns("Type").Range).Value, _
        Intersect(lr.Range, lo.ListColumns("Customer").Range).Value, _
        Intersect(lr.Range, lo.ListColumns("Name").Range).Value, _
        Intersect(lr.Range, lo.ListColumns("Contact").Range).Value, _
        Intersect(lr.Range, lo.ListColumns("Email").Range).Value, _
        Intersect(lr.Range, lo.ListColumns("Phone").Range).Value, _
        Intersect(lr.Range, lo.ListColumns("Corp").Range).Value)

        Debug.Print (CustomersCmd.CommandText)
CustomersConn.Close

Set CustomersConn = Nothing
Set lo = Nothing
Set ws = Nothing
Set lr = Nothing

Application.Calculation = xlCalculationAutomatic

End Sub

1 个答案:

答案 0 :(得分:0)

解决了!因此,在这种情况下,我需要使用lr的Set函数。所以这条线需要看起来像:Set lr = lo.ListRows(Target.row - 5)我是个傻瓜。