如何在循环宏中重新启动数组行计数

时间:2015-06-01 22:25:44

标签: excel vba excel-vba

我正在尝试弄清楚每次do循环宏重新启动时如何重新启动小数组函数中的行计数。第一个宏在电子表格中复制一系列公式,直到满足条件。然后,一旦满足条件,第二个宏应该重新开始并重新输入公式。

这是我为数组公式编写的VBA宏:

ActiveCell.Offset(0, 2).Range("A1").Select
Selection.FormulaArray = _
    "=SMALL(IF(Pivot!C3=R[7]C[-2],ROW(Pivot!C3),""""),ROW(R[-7]))"
ActiveCell.Offset(0, 2).Range("A1").Select 

以下是作为宏循环显示的公式。

第一行:

=SMALL(IF(Pivot!$C:$C=H8,ROW(Pivot!$C:$C),""),ROW(1:1))

然后在宏重新开始循环的第六行中,这是出现的公式:

=SMALL(IF(Pivot!$C:$C=H13,ROW(Pivot!$C:$C),""),ROW(6:6))

我需要将公式更改回ROW(1:1)

这是整个嵌套循环。

 Do
 ActiveCell.FormulaR1C1 = _
    "=IF(ISERROR(VLOOKUP(RC[-3],Matrix!R10C1:R1048576C14,13,0)),"""",VLOOKUP(RC[-3],Matrix!R10C1:R1048576C14,13,0))"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = _
    "=IF(RC[-2]="""","""",IF(ISERROR(VLOOKUP(RC[2],'GBS Data'!R8C5:R1046427C17,2,0)),""Not in GBS"",(VLOOKUP(RC[2],'GBS Data'!R8C5:R1046427C17,2,0))))"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = _
    "=IF(IF(ISERROR(VLOOKUP(RC[-7],Matrix!R10C1:R150C14,14,0)),"""",VLOOKUP(RC[-7],Matrix!R10C1:R150C14,14,0))="""",R[-1]C,VLOOKUP(RC[-7],Matrix!R10C1:R150C14,14,0))"
ActiveCell.Offset(0, 2).Range("A1").Select
Selection.FormulaArray = _
    "=SMALL(IF(Pivot!C3=R[7]C[-2],ROW(Pivot!C3),""""),ROW(R[-7]))"
ActiveCell.Offset(0, 2).Range("A1").Select
    ActiveCell.FormulaR1C1 = _
    "=IF(RC[-8]="""","""",IF(ISERROR(VLOOKUP(RC8,'GBS Data'!C5:C41,R1C,0)),"""",VLOOKUP(RC8,'GBS Data'!C5:C41,R1C12,0)))"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = _
    "=IF(RC[-10]-"""","""",IF(ISERROR(VLOOKUP(RC8,'GBS Data'!C5:C41,R1C,0)),"""",VLOOKUP(RC8,'GBS Data'!C5:C41,R1C12,0)))"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = _
    "=IF(RC[-12]="""","""",IF(ISERROR(VLOOKUP(RC8,'GBS Data'!C5:C41,R1C,0)),"""",VLOOKUP(RC8,'GBS Data'!C5:C41,R1C12,0)))"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = _
    "=IF(RC[-14]="""","""",VLOOKUP(RC[-10],Matrix!R10C14:R10000C15,2,0))"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = _
    "=IF(RC[-14]=""Not in GBS"",""Not in GBS"",IF(ISERROR(VLOOKUP(RC[-10],Pivot!C1:C5,5,0)),"""",VLOOKUP(RC[-10],Pivot!C1:C5,5,0)))"
ActiveCell.Offset(0, 2).Range("A1").Select
ActiveCell.FormulaR1C1 = _
    "=IF(RC[-18]="""","""",COUNTIF('GBS Data'!C3,'Product Summary'!RC8&'Product Summary'!R1C24))"
ActiveCell.Offset(0, 2).Range("A1").Select
     ActiveCell.FormulaR1C1 = _
    "=IF(RC[-22]="""",IF(ISERROR(VLOOKUP(TRIM(RC8)&TRIM(R1C)&TRIM(RC20),'GBS Data'!R8C4:R1048576C41,13,0)),"""",IF(RC[-22]="""",VLOOKUP(TRIM(RC8)&TRIM(R1C)&TRIM(RC20),'GBS Data'!R8C4:R1048576C41,13,0),SUMIF('GBS Data'!C3,'Product Summary'!RC8&'Product Summary'!R1C24,'GBS Data'!C16:C[-8]))),SUMIF('GBS Data'!C3,R8C8&R1C24,'GBS Data'!C16))"

ActiveCell.Offset(0, -20).Range("A1:U1").Select
Application.CutCopyMode = False
Selection.Copy

Do
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste

Loop Until ActiveCell.Offset(0, 16) = ""

ActiveCell.Offset(1, 0).Range("A1").Select

Loop Until Range("H1").Value = "Stop"

1 个答案:

答案 0 :(得分:0)

首先,对ROW function实际做了什么做了一些解释。 SMALL function采用整数作为其第二个参数。这表示有多小;基本上最小,第二小,第三小等ROW(1:1)公式在填充时变为ROW(2:2),ROW(3:3)等。结果是 1,2,3等,它实现了第一,第二,第三等,用于从SMALL返回顺序值。

因此,为了重置ROW返回的序数值,所需要的只是一些数学。如果我们在ROW-1周围添加MOD function并提供 6 的分区,我们将会接近。事实上,我们将得到一系列重复自己的数字 0,1,2,3,4,5 。我们所要做的就是添加 1 以获得从 1 6 的一系列重复的数字。

将以下内容放入任何未使用的单元格并填写。

=MOD(ROW(1:1)-1, 6)+1

这应该产生一系列数字,如 1,2,3,4,5,6,1,2,3,4等。将其应用于您的公式并且公式变为,

Selection.FormulaArray = _
  "=SMALL(IF(Pivot!C3=R[7]C[-2],ROW(Pivot!C3),""""),MOD(ROW(R[-7])-1, 6)+1)"

使用公式的第一行应为

=SMALL(IF(Pivot!$C:$C=H8,ROW(Pivot!$C:$C),""), MOD(ROW(1:1)-1, 6)+1)