在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已经说过的一个补充:无论什么时候你有这种典型的现象,只有“有时”才会发生,通常是使用关键字(如Active
或Current
或Selection
。 这些不是特定的,但每次调用macros时都会改变。 无论你select什么是起点。 您甚至可能会开始点击,从而在macros运行时更改Selection
。 简而言之,你应该明确地开始编码,不要让VBA / Excel来为你做出决定。
让我们从Range("J14").Select
开始。 这行代码要求VBA做出两个假设:
- 如果您打开了多个Excel文件。 应该从哪个Excel文件开始?
- 在文件中可能有几张纸。 应该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