循环遍历行和列

对于我的生活,我无法弄清楚如何在列和行之间循环一个公式。 我把一些代码放在一起,我认为会是正确的:

Sub LoopAcrossColsRows() Dim C As Integer Dim R As Integer Dim LastCol As Integer Dim LastRow As Long Dim lr As Long Worksheets("Sheet1").Activate LastCol = Cells(1, Columns.Count).End(xlToLeft).Column LastRow = Cells(Rows.Count, 20).End(xlUp).Row lr = Cells(Rows.Count, 1).End(xlUp).Row For C = 2 To LastCol For R = lr + 3 To LastRow .Cells(R, C).FormulaR1C1 = “=SUMPRODUCT(--(R6C:R7C>=RC1), --(R6C:R7C<=(RC1+30))*R4C)" Next R Next C End Sub 

该公式导致预期的列表分隔符或)错误。 当我在工作表上插入公式时,公式会起作用,所以我不知道会发生什么事情。 感谢所有帮助提前。

顺便说一下,是否有创build一个input框,提示input一个新的工作表名称,这将反映为Worksheets("Sheet1").Activate的新工作表名称,以便我不必不断更改vba代码中的工作表名称?

再次感谢,

  • 您需要使用对象限定Cells属性
  • 你的VB接口的错误信息是由于你的第一个引号是一个左双引号而不是一个普通的引号。

尝试

 Cells(R, C).FormulaR1C1 = "=SUMPRODUCT(--(R6C:R7C>=RC1), --(R6C:R7C<=(RC1+30))*R4C)" 

比循环更好的是将公式分配给多单元范围对象的例程。

未testing:

 range(cells(lr+3,2),cells(lastrow,lastcol)).FormulaR1C1 = "=SUMPRODUCT(--(R6C:R7C>=RC1), --(R6C:R7C<=(RC1+30))*R4C)" 

该线

 .Cells(R, C)... 

应该可以合格:

 ActiveSheet.Cells(R,C)... 

更好的做法是,应该在variables中保留对适当工作表的引用,而不是依赖于For循环长度的活动表:

 Dim wks As Worksheet Set wks=Worksheets("Sheet1") ... For R = lr + 3 To LastRow wks.Cells(R, C).FormulaR1C1 = “=SUMPRODUCT(--(R6C:R7C>=RC1), --(R6C:R7C<=(RC1+30))*R4C)" Next R ... 

您的旁边是一个完全独立的问题,不属于这里,但考虑使用Excel Application.Inputbox函数或VBA Inputbox函数。

我相信你需要的代码是

 Activesheet.Cells(R,C)... 

如果您不想使用名称来调用工作表,则使用索引

 worksheet(1).cells(x,y)... 

然而这只有在你永远不要改变工作表的顺序时才有用。 因为工作表(1)总是转到工作簿的第一个工作表。

你也可以设置一个variables作为工作表,并使用它

 Dim ws1 As Worksheet 'or set it = Worksheet(1) Set ws1 = Worksheets("sheet"1) ws1.cells(1,1) = "test" 

对于名称问题,你可以试试这个

 Dim yourName as String yourName = Application.InputBox("Enter name of worksheet") worksheet(1).Name = yourName 

编辑:好吧,仔细看看你的代码。 这里有几个变化。

  1. “R”的循环不会被触发,因为lr + 3将始终> LastRow
  2. “细胞(R,C)”中的C和R可能有问题 – > varR和varC。
  3. .Cells – > Activesheet.Cells
  4. 你定义你的最后一个行variables两次“LastRow”&“lr”? 我不知道为什么。 (也见下面的#6。
  5. RC中参考.FormulaR1C1被[]绑定
  6. End(xl [Up,ToLeft])方法可能会丢失数据集的全部大小,如果它不是连续的。 可以将“a1”replace为不同的行/列范围来限制variables。 (对不起,不知道这段代码的来源,但已经使用了一段时间)

我不确定代码是否可以无缝运行,或者会循环所需的范围。 但是给它一个去看看它是否有效。 希望这个原则能引导你解决问题:

 Sub LoopAcrossColsRows() Dim varC As Integer Dim varR As Integer Dim LastCol As Integer Dim LastRow As Long Dim lr As Long Worksheets("Sheet1").Activate LastRow = Cells.Find("*", [a1], , , xlByRows, xlPrevious).Row LastCol = Cells.Find("*", [a1], , , xlByColumns, xlPrevious).Column For varC = 2 To LastCol For varR = (LastRow + 3) To LastRow Step -1 Worksheets("Sheet1").Cells(varR, varC).FormulaR1C1 = "=SUMPRODUCT(--(R6C:R7C1>=RC1),--(R6C:R7C1<=(RC1+30))*R4C)" Next varR Next varC 

结束小组