1

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
4

1 回答 1

4

您在“A”之前缺少一个“:”

Range("A" & i & ":A" & LastCol - 1)

跟进

在我浏览了您的评论后,我发现您的代码中有很多错误

1)你变暗iInteger。如果您的最后一行超过 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

你之前错过了一个 DOTRange

这是正确的方法...

.Range("B2....

也不Range("B2" & LastCol)会给你你想要的范围。请参阅下面的代码,了解如何创建您的范围。

3)您正在使用变量LastColumn,但使用LastCol. 我强烈建议使用Option Explicit我还建议查看此链接(请参阅链接中的第 2 点)。

主题:“犯错”是人之常情

链接http ://www.siddharthout.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你也可能想使用 aFor 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
于 2012-07-02T06:43:26.060 回答