VBA运行时错误';1004';

VBA运行时错误';1004';,vba,excel,runtime-error,Vba,Excel,Runtime Error,我试图使用VBA将SQL存储过程生成的数据附加到excel电子表格中现有数据的末尾。我想把它粘贴到最后一列的右边。每次运行它时,我都会遇到上面的错误:“object'\u Global'的方法'Range'失败 我希望将新数据粘贴到现有数据右侧的第3行。下面是我的vba代码: Sub RefreshStatus() Dim db As DAO.Database Dim con As ADODB.Connection Dim cmd As ADODB.Command

我试图使用VBA将SQL存储过程生成的数据附加到excel电子表格中现有数据的末尾。我想把它粘贴到最后一列的右边。每次运行它时,我都会遇到上面的错误:“object'\u Global'的方法'Range'失败

我希望将新数据粘贴到现有数据右侧的第3行。下面是我的vba代码:

Sub RefreshStatus()
    Dim db As DAO.Database
    Dim con As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
    Dim StoredProc As String
    Dim RWS As Worksheet
    Dim DWS As Worksheet
    Dim ServerName As String
    Dim DatabaseName As String
    Dim StoredProcedure As String

    Set con = New ADODB.Connection
    Set cmd = New ADODB.Command
    Set rs = New ADODB.Recordset
    Set RWS = Worksheets("Refresh")
    Set DWS = Worksheets("141215")




    Application.DisplayStatusBar = True
    Application.StatusBar = "Contacting SQL Server..."


    RWS.Activate

    ServerName = "tns-reports-01" ' Enter your server name here
    DatabaseName = "GroupPerformance" ' Enter your database name here
    StoredProcedure = "JM_Recruitment_Status_141215" ' Enter Stored Procedure here

    con.Open "Provider=SQLOLEDB;Data Source=" & ServerName & ";Initial Catalog=" & DatabaseName & ";Trusted_Connection=yes"
    cmd.ActiveConnection = con


    Application.StatusBar = "Running stored procedure..."
    cmd.CommandTimeout = 0
    cmd.CommandText = StoredProcedure
    Set rs = cmd.Execute(, , adCmdStoredProc)


     ' Copy the results to cell A1 on the first Worksheet
    DWS.Activate

    Dim Lastcol As Long

    Lastcol = Range("3" & Columns.Count).End(xlRight).Row

    If rs.EOF = False Then DWS.Cells(2, 1).CopyFromRecordset rs



    rs.Close
    Set rs = Nothing
    Set cmd = Nothing


    con.Close
    Set con = Nothing

    Application.StatusBar = "Data successfully updated."

End Sub
如果有人能帮我,我将不胜感激


非常感谢。

您在尝试查找最后一个非空列时出错,还有其他一些小错误

下面是您的代码,有一些更改(更改在注释中描述)

我假设您的记录集只包含一个字段和多个记录以及 您希望将所有这些记录从单元格3水平粘贴到右侧,其中3是第一个空列

Sub RefreshStatus()
    Dim db As DAO.Database
    Dim con As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
    Dim StoredProc As String
    Dim RWS As Worksheet
    Dim DWS As Worksheet
    Dim ServerName As String
    Dim DatabaseName As String
    Dim StoredProcedure As String

    Set con = New ADODB.Connection
    Set cmd = New ADODB.Command
    Set rs = New ADODB.Recordset
    Set RWS = Worksheets("Refresh")
    Set DWS = Worksheets("141215")



    With Application
        .DisplayStatusBar = True
        .StatusBar = "Contacting SQL Server..."
    End With


    'NOTE: You don't have to activate worksheet to operate on its ranges.
    'Actually, you shouldn't do that, since it's time-consuming, make the
    'user experience worst and can cause errors in specific cases.
    'Additionaly, I can't see where you use RWS worksheet later in the code.
    'RWS.Activate

    ServerName = "tns-reports-01" ' Enter your server name here
    DatabaseName = "GroupPerformance" ' Enter your database name here
    StoredProcedure = "JM_Recruitment_Status_141215" ' Enter Stored Procedure here

    con.Open "Provider=SQLOLEDB;Data Source=" & ServerName & ";Initial Catalog=" & DatabaseName & ";Trusted_Connection=yes"
    cmd.ActiveConnection = con


    Application.StatusBar = "Running stored procedure..."
    cmd.CommandTimeout = 0
    cmd.CommandText = StoredProcedure
    Set rs = cmd.Execute(, , adCmdStoredProc)


    ' Copy the results to cell A1 on the first Worksheet
    'Again, it is not necessary to activate worksheet.
    'DWS.Activate


    Dim lastCol As Long


    'If rs.EOF = False Then DWS.Cells(2, 1).CopyFromRecordset rs
    row = 3
    lastCol = DWS.Cells(row, DWS.Columns.Count).End(xlRight).Column + 1
    Do Until rs.EOF
        DWS.Cells(row, lastCol).value = rs.Fields(0).value
        row = row + 1
        Call rs.MoveNext
    Loop



    rs.Close
    Set rs = Nothing
    Set cmd = Nothing


    con.Close
    Set con = Nothing

    Application.StatusBar = "Data successfully updated."

End Sub

谢谢你的回复。事实上,我刚刚在想。这些列不会完全为空,它们在第1行和第2行有一个标题。而且数据会垂直下降,而不是水平下降。很抱歉没有正确解释我自己。你的代码导致对象的“方法”“范围”“工作表”失败“错误消息,我认为这可能是由于我上面解释的原因。有什么想法吗?@Jamie对不起,我犯了个小错误。我已经编辑了代码,请检查是否仍然出现此错误。因此,例如,如果有10条记录从数据库返回,您希望将它们从单元格C3粘贴到C12,对吗?不,行是正确的,但列必须是最后一列数据之后的列。我计划每天运行这个宏来跟踪特定的状态。我需要每天记录它,以便每次运行时最后一个空列都会更改。我希望这是有道理的。对不起,我很痛苦。