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
答案 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
这是正确的方法......
.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