应用程序定义或对象定义的错误1004

时间:2012-07-02 06:38:30

标签: vba excel-vba excel

VBA在Sheets("Sheet1").Range("A" & i).Copy Destination:=Sheets("Sheet2").Range("A" & i & "A" & LastCol - 1)

行上抛出了上述错误

我想要做的是将"A" & i单元格(在第一次迭代中为A2)复制到名为Sheet2的第二个工作表中的范围。

Sub FindFill()

Dim DatesRange As Range
Dim i As Integer
Dim TransposeThis As Range
Dim LastCol As Integer

If WorksheetFunction.CountA(Cells) > 0 Then
   LastColumn = Cells.Find(What:="*", After:=[A1], _
   SearchOrder:=xlByColumns, _
   SearchDirection:=xlPrevious).Column
End If


With Sheets("Sheet1")
    Set DatesRange = Range("B2" & LastCol)
End With
i = 1
Do While i <= ActiveSheet.Rows.Count
    Sheets("Sheet1").Range("A" & i + 1).Copy Destination:=Sheets("Sheet2").Range("A" & i & "A" & LastCol - 1)
    i = i + 1
Loop




End


End Sub

1 个答案:

答案 0 :(得分:4)

你在“A”

之前缺少一个“:”
Range("A" & i & ":A" & LastCol - 1)

<强>后续

在我完成您的评论后,我在您的代码中看到了很多错误

1)您将i视为Integer。如果您的最后一行超过32,767,这可能会在Excel 2007以后出现错误。将其更改为Long我建议您查看此链接。

主题:整数,长整数和字节数据类型

链接http://msdn.microsoft.com/en-us/library/aa164754%28v=office.10%29.aspx

从以上链接引用

  

整数变量可以保持介于-32,768和32,767之间的值,而长变量的范围可以是-2,147,483,648到2,147,483,647

2)您正在找到最后一列,但在哪张表中?你必须完全符合这样的道路。

    If WorksheetFunction.CountA(Sheets("Sheet1").Cells) > 0 Then
       LastCol = Cells.Find(What:="*", After:=[A1], _
       SearchOrder:=xlByColumns, _
       SearchDirection:=xlPrevious).Column
    End If

的情况也是如此
With Sheets("Sheet1")
    Set DatesRange = Range("B2" & LastCol)
End With

您在Range

之前缺少DOT

这是正确的方法......

.Range("B2....

Range("B2" & LastCol)也不会为您提供所需的范围。请参阅以下有关如何创建范围的代码。

3)您正在使用变量LastColumn但使用LastCol。我强烈建议使用Option Explicit我还建议您查看此链接(链接中的SEE POINT 2)。

主题:'Err'是人类

链接http://www.siddharthrout.com/2011/08/01/to-err-is-human/

4)如果有.CountA(Sheets("Sheet1").Cells) = 0会怎样? :)我建议你这个代码

    If WorksheetFunction.CountA(Sheets("Sheet1").Cells) > 0 Then
       LastCol = Cells.Find(What:="*", After:=[A1], _
       SearchOrder:=xlByColumns, _
       SearchDirection:=xlPrevious).Column
    Else
        MsgBox "No Data Found"
        Exit Sub
    End If

5) ActiveSheet.Rows.Count不会为您提供最后一个活动行。它将为您提供该工作表中的总行数。我建议让Col A的最后一行有数据。

您可以将其用于

With Sheets("Sheet")
    LastRow =.Range("A" & .Rows.Count).End(xlup).row
End With

现在使用LastRow代替ActiveSheet.Rows.Count您也可以使用For Loop,这样您就不必每次都增加i。例如

For i = 1 to LastRow

6)最后你永远不应该使用End。理由很简单。这就像使用POWER OFF按钮切换计算机一样。 End语句突然停止代码执行,而不调用Unload,QueryUnload或Terminate事件或任何其他Visual Basic代码。其他程序保留的对象引用(如果有)也是无效的。

7)根据您在聊天中的图片,我相信您正在尝试这样做?这使用的代码不使用任何循环。

Option Explicit

Sub FindFill()
    Dim wsI As Worksheet, wsO As Worksheet
    Dim DatesRange As Range
    Dim LastCol As Long, LastRow As Long

    If Application.WorksheetFunction.CountA(Sheets("Sheet1").Cells) = 0 Then
        MsgBox "No Data Found"
        Exit Sub
    End If

    Set wsI = Sheets("Sheet1")
    Set wsO = Sheets("Sheet2")

    With wsI
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
        Set DatesRange = .Range("B1:" & Split(Cells(, LastCol).Address, "$")(1) & 1)

        .Columns(1).Copy wsO.Columns(1)
        DatesRange.Copy
        wsO.Range("B2").PasteSpecial xlPasteValues, _
        xlPasteSpecialOperationNone, False, True

        .Range("B2:" & Split(Cells(, LastCol).Address, "$")(1) & LastCol).Copy
        wsO.Range("C2").PasteSpecial xlPasteValues
    End With
End Sub