带范围的VBA运行时错误1004“应用程序定义或对象定义的错误”

时间:2017-02-10 09:56:45

标签: excel vba excel-vba

这是我第一次独自编写宏,遇到了两个小问题。

宏的任务: 如果列为空,则将一个文档的信息复制到特定列中的另一个文档中,在这种情况下,它应该使用下一列。

这是到目前为止的代码:

Sub CopyData()

    Dim i As Long
    Dim wbA As Workbook
    Dim wbN As Workbook
    Dim Filepath As String

    i = 7
    Set wbA = ThisWorkbook

    Filepath = "C:\Users\sebastian\Desktop\assessment answers"

    Do
        If IsEmpty(wbA.Sheets("Answers").Cells(1, i)) Then

            Set wbN = Workbooks.Open(Filepath)

            If Cells(37, 3).Value = 31 Then

                wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _
                Destination:=wbA.Sheets("Answers").Range(Cells(36, i), Cells(45, i))

            ElseIf Cells(37, 3).Value = 41 Then

                wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _
                Destination:=wbA.Sheets("Answers").Range(Cells(46, i), Cells(55, i))

            ElseIf Cells(37, 3).Value = 51 Then

                wbN.Sheets("Answers").Range(Cells(37, 4), Cells(46, 4)).Copy _
                Destination:=wbA.Sheets("Answers").Range(Cells(56, i), Cells(65, i))

            Else

                MsgBox "There could be a problem with the data, please check if the candidate has selected a topic."
                Exit Sub

            End If

            wbN.Sheets("Answers").Range(Cells(2, 4), Cells(3, 4)).Copy _
            Destination:=wbA.Sheets("Answers").Range(Cells(1, i), Cells(2, i))

            wbN.Sheets("Answers").Range(Cells(7, 4), Cells(36, 4)).Copy _
            Destination:=wbA.Sheets("Answers").Range(Cells(6, i), Cells(35, i))

            wbN.Close

            Exit Sub

        Else

            i = i + 1

        End If

    Loop

End Sub

1。 问题(VBA运行时错误1004)发生在以下情况之后: 如果是细胞(37,3)。值= 31那么

如果我对其他单元格使用.Range("D37:D46")和Ranges,它可以正常工作,但是当我已经填充了数据时,我想用循环增加列。你有想法解决这个问题吗?

2。 有没有办法更改文件路径,以便谁使用它,将被定向到文件所在的桌面?

Filepath = "C:\Users\sebastian\Desktop\assessment answers"

感谢您的想法,

塞巴斯蒂安

2 个答案:

答案 0 :(得分:0)

错误编号1004通常表示“我找不到您要找的内容”。

对于此特定示例,您看到此错误,因为您对编码不够明确。如果有的话,最好去OTT。

所以而不是

If Cells(37, 3).Value = 31 Then

使用:

If wbA.Sheets("Sheet Name Here").Cells(37, 3).Value = 31 Then

更好的是在代码中包含“With”语句。一个通用的例子如下:

    Sub Example()

    Dim wb As Workbook
    Dim sht As Worksheet

    Set wb = ActiveWorkbook
    Set sht = wb.ActiveSheet

    With sht
        .Name = "New Name"
        .Visible = xlSheetVisible
        .Protect
    End With

End Sub

这可以节省大量的输入,并允许您在一次点击中对一个对象执行多项操作。

答案 1 :(得分:0)

对于可能感兴趣的其他人,我在这里发布我的解决方案:

问题1:

在Rory和Naing Win Htun的建议之后,我将细胞前面的路径包括在内。显然我也可以用 With 来完成它。

wbN.Sheets("Answers").Range(wbN.Sheets("Answers").Cells(37, 4), wbN.Sheets("Answers").Cells(46, 4)).Copy _
Destination:=wbA.Sheets("Answers").Range(wbA.Sheets("Answers").Cells(36, i), wbA.Sheets("Answers").Cells(45, i))

问题2:

用户现在可以手动输入文件的路径和名称,这显然是一个更好的解决方案。这也是Naing Win Htun的建议。

谢谢大家的帮助。