2017-02-10 130 views
1

这是我对自己写的宏第一次,我遇到了两个小问题。VBA运行时错误1004“应用程序定义或对象定义的错误”使用范围

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

这是迄今为止的代码:

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")和其他单元格的范围,它正在工作,但我想增加列的循环,当有数据已经​​填充。你有想法解决这个问题吗?

2. 有没有办法更改文件路径,以便谁曾经使用它,将被引导到桌面,文件应该放在哪里?

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

谢谢你的想法,

塞巴斯蒂安

+1

Re 1这个问题在这里的很多问题中都有介绍。您需要使用工作表限定'Cells'调用:'wbN.Sheets(“Answers”)。Range(wbN.Sheets(“Answers”)。Cells(37,4),wbN.Sheets(“Answers”)) .Cells(46,4))'。使用表格的变量或With语句将清理它。 – Rory

+0

您需要确定'Cells(37,3).Value'是来自哪个工作簿和哪个工作表。我认为,这可以解决错误信息。当我测试你的代码时,它显示我没有错误。 –

+0

回应问题1:https://support.microsoft.com/en-us/help/210684/copying-worksheet-programmatically-causes-run-time-error-1004-in-excel关于问题2:您可以参考桌面是这样的:Environ $(“USERPROFILE”)&“\ Desktop”,但我不确定它有多可靠,如果文件在桌面上,则最好使用此工作簿路径 – User632716

回答

0

对于其他人,谁可能会感兴趣,我张贴我的解决方案在这里:

问题1:

由罗里和Naing赢吞我在细胞内的前方道路的建议之后。显然,我可以用也做它用

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提出的建议。

谢谢大家的帮助。

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 

这样可以节省大量的输入,并允许你做多件事情的一个目的是在一个打击。

相关问题