在ActiveCell <>范围内执行

我有这个VBA excelmacros代码

Sub fillcells() Range("J14").Select Do While ActiveCell <> Range("J902") ActiveCell.Copy ActiveCell.Offset(6, 0).Select ActiveCell.PasteSpecial Loop End Sub 

起初它工作正常,但现在有时当我试图运行macros循环突然停止在单元格J242,其他时间出现错误“不匹配types”,有时macros只是select单元格J14没有做循环

不知道你想要做什么,但是(如你的OP的评论中所述), 不要使用 。select/ .Activate 。 以下应该做什么(我认为)你想要的:

 Sub fillcells() Dim i& ' Create a LONG variable to count cells For i = 14 To 901 Step 6 Cells(i, 10).Offset(6, 0).FormulaR1C1 = Cells(i, 10).FormulaR1C1 Loop End Sub 

这将从单元格J14循环到J901 ,复制/粘贴*到单元格6行偏移。


*注意我没有实际复制/粘贴。 由于您的原始代码使用PasteSpecial ,我假设你只是想粘贴的值。 在这种情况下,您可以设置两个范围/单元格相等。

只是@BruceWayne已经说过的一个补充:无论什么时候你有这种典型的现象,只有“有时”才会发生,通常是使用关键字(如ActiveCurrentSelection 。 这些不是特定的,但每次调用macros时都会改变。 无论你select什么是起点。 您甚至可能会开始点击,从而在macros运行时更改Selection 。 简而言之,你应该明确地开始编码,不要让VBA / Excel来为你做出决定。

让我们从Range("J14").Select开始。 这行代码要求VBA做出两个假设:

  1. 如果您打开了多个Excel文件。 应该从哪个Excel文件开始?
  2. 在文件中可能有几张纸。 应该select哪一张纸?

显式编码意味着你(希望在任何时候)都是非常具体的你所指的。 所以,而不是只声明Range("J14")你应该使用:

 ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Range("J14") 

但是在另一个答案中指出,在这种情况下甚至没有必要。 而是如图所示循环行并使用:

 ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Cells(i, 10).Offset(6, 0).Formula = ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Cells(i, 10).Offset(i, 10).Formula 

由于这有点冗长,可以使用With语句来缩短它:

 With ThisWorkbook.Worksheets("SheetNameYouWantToReferTo") .Cells(i, 10).Offset(6, 0).Formula = .Cells(i, 10).Formula End With