循环行和列

时间:2014-09-17 01:34:10

标签: excel vba loops formula

对于我的生活,我无法弄清楚如何在列和向下行上循环公式。我把一些代码放在一起,我认为它们会在正确的轨道上:

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

该公式导致预期的列表分隔符或)错误。当我将它插入我的工作表时,该公式有效,所以我不知道会出现什么问题。感谢您提前帮助。

顺便说一下,无论如何都要创建一个输入框,提示输入新的工作表名称,这将反映为Worksheets("Sheet1").Activate行中的新工作表名称,这样我就不会这样做了。必须不断更改vba代码中的工作表名称?

再次感谢,

4 个答案:

答案 0 :(得分:2)

  • 您需要使用对象限定Cells属性
  • 来自VB界面的错误消息是由于您的第一个引号是左双引号而不是常规引号。

尝试

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

并且优于循环将是将公式分配给多单元范围对象的例程。

未经测试:

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

答案 1 :(得分:0)

该行

.Cells(R, C)...

应该是合格的:

ActiveSheet.Cells(R,C)...

更好的是,您应该在变量中保留对相应工作表的引用,而不是依赖于它是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函数。

答案 2 :(得分:0)

我相信您需要代码

Activesheet.Cells(R,C)...

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

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

然而,只有在您从未更改工作表的顺序时,这才有用。因为工作表(1)始终转到工作簿的第一个工作表。

您也可以将变量设置为工作表并使用

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

答案 3 :(得分:0)

EDITED: 好的,所以仔细看看你的代码。这里有几处变化。

  1. “R”的循环不会被触发,因为lr + 3将始终&gt; LASTROW
  2. “细胞(R,C)”中的C和R可能是有问题的 - &gt; varR和varC。
  3. .Cells - &gt; Activesheet.Cells
  4. 您将最后一行变量定义为两次“LastRow”&amp; “LR”?我不知道为什么。 (另见下文#6。
  5. .FormulaR1C1中的RC引用受[]
  6. 的约束
  7. 如果数据集不连续,则End(xl [Up,ToLeft])方法可能会错过数据集的完整大小。可以用不同的行/列范围替换“a1”以约束变量。 (很抱歉不知道这段代码的来源,但已经使用了一段时间了)
  8. 我不确定代码是否会无缝运行,或者是否会完全循环您需要的范围。但是试一试,看看它是否有效。希望这个原则能指导您找到解决方案:

    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
    

    End Sub