Excel VBA代码:代码仅适用于第一行

时间:2013-10-16 12:09:27

标签: excel excel-vba vba

我有以下代码:

' Paste last value
    Range(Cells(LastRowP + 1, 10), Cells(LastRowP + 1, 10)).Select
    Selection.Cut
    Range(Cells(LastRowP + 1, 9), Cells(LastRowP + 1, 9)).Select
    ActiveSheet.Paste

此代码应该从第10列中删除内容并将其粘贴到第9列。不幸的是,这仅适用于其他行的第一个条目(例如第2行),但它不起作用。 你能帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

这应该有效:

Sub CutColumn()

   LastRow = Cells(Rows.Count, "J").End(xlUp).Row
   Range("J1:J" & LastRow).Cut Destination:=Range("I1:I" & LastRow)

End Sub

答案 1 :(得分:0)

您没有选择正确的reange,并且您没有提到LastRowP的值。但是,如果您设置FirstRowP和LastRowP,则以下代码中的值将起作用

Range(Cells(FirstRowP + 1, 10), Cells(LastRowP + 1, 10)).Select
Selection.Cut
Range(Cells(FirstRowP + 1, 9), Cells(LastRowP + 1, 9)).Select
ActiveSheet.Paste

答案 2 :(得分:0)

我认为现有的答案应该包括在内,但我想补充一些与您的问题相关的有用信息。

首先,语法Range(Cells(R1,C1), Cells(R2,C2))指的是从行号R1和列号C1的交集定义的单元格开始的方范围,直到由行号R2和列号C2的交集定义的单元格(假设R1 <= R2,否则它是相反的方向)。

因此,表达式Range(Cells(LastRowP + 2, 10), Cells(LastRowP + 2, 10))Cells(LastRowP+2,10)是相同的:它们都指向位于行号LastRowP+2(无论是什么)和列号{{的交集中的单元格。 1}}。这就是您的代码无法按预期工作的原因。

话虽如此,有两个重要元素被认为是不好的做法(从你的评论到t.thielemans,似乎你已经发现了一个:))。

使用选择

宏录制器大量使用10,这使得某人可以轻松地深入了解宏。然而,宏录制器不知道你的意图是什么,并试图愚蠢地复制任何行动。

Select有什么问题?首先,Selection返回用户选择的任何内容。它可以是范围,图表,工作表或其他任何内容......这使得它变得缓慢且容易出错。如果没有选择,宏将失败,从而产生运行时错误。它也慢,但对于大多数宏来说,这不是一个大问题。

通常,没有必要选择范围或激活工作表来操纵数据。我发现有必要激活单元格的唯一情况是需要以编程方式向单元格添加注释。 Sid上面提到的link显示了一些操作数据的好方法,而没有选择/激活东西(对象)。

限定范围对象

我认为Selection开发人员很少使用像

这样的语法
VBA

我自己从不使用它..这段代码正在寻找麻烦:)

Range(Cells(FirstRowP + 1, 9), Cells(LastRowP + 1, 9)) Range(以及CellsColumns等)都是快捷方式。当上述代码放在Rows中时,它会被解释为此时恰好激活的工作表的VBA moduleRange。换句话说,编译器理解CellsRange = ActiveSheet.Range。当从附加到工作表(例如按钮)的内容调用时,Cells = ActiveSheet.Cells之类的代码可能会正常工作,因为Range("A1")将是我们引用的ActiveSheet ..它将会如果宏激活另一个工作表,然后尝试引用初始工作表的范围(这就是为什么可能工作“OK”)仍会造成麻烦。当从快捷键,用户表单等调用它时会导致错误。

为了增加混淆,如果将完全相同的代码放在工作表模块中,那么SheetRange将被解释为属于该工作表。这有多酷? :)

为了避免这些问题,我个人对所有对象进行了限定。例外是当范围为Cells时(例如检查here),那么我们可以参考它就好了(除非我们在下面的情况下!)。

现在,资格认证细微差别贯穿于工作簿。所以Named暗示Sheet1.Range("A1")。如果我们激活不同的工作簿,ActiveWorkbook.Sheet1.Range("A1")将引用该工作簿的范围。如果两个不同工作簿的命名范围具有相同的名称,那么我们也需要对它们进行限定。

总结一下,避免Sheet1.Range("A1")离子和完全限定对象可以避免许多错误和麻烦。

我希望这有帮助!