Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba For循环更改公式中的特定单元格_Vba_Excel - Fatal编程技术网

Vba For循环更改公式中的特定单元格

Vba For循环更改公式中的特定单元格,vba,excel,Vba,Excel,我有一个公式,显示特定列中的哪些行符合一组条件。当公式被执行并应用于所有行时,我运行一个循环来检查哪些行以文本形式返回了值,然后将这些单元格复制粘贴到另一个工作表: Sub loop1() Dim r As Range, c As Range With Worksheets("Sheet1") Set r = Range(.Range("AF2"), .Range("AF2").End(xlDown)) For Each c In r

我有一个公式,显示特定列中的哪些行符合一组条件。当公式被执行并应用于所有行时,我运行一个循环来检查哪些行以文本形式返回了值,然后将这些单元格复制粘贴到另一个工作表:

Sub loop1()
    Dim r As Range, c As Range
    With Worksheets("Sheet1")
        Set r = Range(.Range("AF2"), .Range("AF2").End(xlDown))
        For Each c In r
            If WorksheetFunction.IsText(c) Then
                Range(.Cells(c.Row, "AF"), .Cells(c.Row, "AF")).Copy
            Else
                GoTo nextc
            End If
            With Worksheets("Sheet2")
            .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial  Paste:=xlPasteValues
        End With
nextc:

    Next c
    End With
    Application.CutCopyMode = False
End Sub
我现在要做的是运行631个不同名称的公式,复制粘贴每个名称作为标题,然后运行loop1。我不知道如何使for循环在公式内部工作

Sub loop2()

Dim i As Integer

  For i = 2 To 632


    Sheets("Sheet1").Select
    Range("AC2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(RC[-3]=""district1"",(IF(RC[2]=R2C33 ,(IF(RC[-18]>=1,0,(IF(RC[-16]>=1,0,IF(RC[-14]>=1,0,IF(RC[-12]>=1,0,IF(RC[-10]>=1,1,IF(RC[-8]>=1,1,IF(RC[-6]>=1,1,0))))))))),0)),0)"
    Range("AC2").Select
    Selection.AutoFill Destination:=Range("AC2:AC20753")
    Range("AC2:AC20753").Select
    Range("AG2").Select
    Selection.Copy
    Sheets("Sheet2").Select
    ActiveSheet.Paste
    Selection.Font.Bold = True
    Sheets("Sheet1").Select
    Application.Run "'Customers.xlsb'!loop1"

  Next i


End Sub
每个循环需要更改的单元格是,R2C33,类似RiC33(不工作)和“标题”范围(“AG2”)。选择类似范围(“AGi”)。选择


任何能提供帮助的人?

以下代码将完成此任务:

Sub loop2()

Dim i As Integer

For i = 2 To 632
   Sheets("Sheet1").Range("AC2:AC20753").FormulaR1C1 = _
   "=IF(RC[-3]=""district1"",(IF(RC[2]=R" & i & "C33 ,(IF(RC[-18]>=1,0,(IF(RC[-16]>=1,0,IF(RC[-14]>=1,0,IF(RC[-12]>=1,0,IF(RC[-10]>=1,1,IF(RC[-8]>=1,1,IF(RC[-6]>=1,1,0))))))))),0)),0)"
   Sheets("Sheet1").Range("AG" & i).Copy Destination:=Sheets("Sheet2").Range("A1")
   Sheets("Sheet2").Range("A1").Font.Bold = True
   Application.Run "'Customers.xlsb'!loop1"
Next i

End Sub
为了让
i
String
公式中使用,您必须停止
String
使用
&i&
,然后继续
String

我还更改了您的代码以防止使用.Select,这在VBA中是不允许的。
通过这种方式,它将填充您的
公式
副本并更改字体,而无需选择任何内容或更改工作表


正如Jeep所指出的,您确实需要更改
工作表(“Sheet2”).Range(“A1”)
,因为我不知道您要粘贴到哪个单元格中。

您的第一个子过程可能会更好

Sub loop1()
    Dim r As Range, c As Range
    With Worksheets("Sheet1")
        Set r = Range(.Range("AF2"), .Range("AF2").End(xlDown))
        For Each c In r
            If WorksheetFunction.IsText(c) Then
                Worksheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = _
                    .Cells(c.Row, "AF").Value2
            End If
        Next c
    End With
End Sub
直接值传输优先于复制、粘贴特殊值

在第二个子过程中,除了从
R2C33
中删除2之外,您无需做任何事情;例如,
RC33
。在xlR1C1公式构造中,一个单独的R表示公式所在的行,您从第2行开始。您还可以一次放入所有公式。一旦放入,您就可以通过G2:G632单元格。

Sub loop2()
    Dim i As Integer

    With Sheets("Sheet1")
        .Range("AC2:AC20753").FormulaR1C1 = _
          "=IF(OR(AND(RC[-3]=""district1"", RC[2]=R2C33, RC[-18]>=1), SUM(RC[-16], RC[-14], RC[-12])>=1), 0, IF(SUM(RC[-10], RC[-8], RC[-6])>=1, 1, 0))"

        For i = 2 To 632
            .Range("AG" & i).Copy _
                Destination:=Sheets("Sheet2").Somewhere
            Sheets("Sheet2").Somewhere.Font.Bold = True
            Application.Run "'Customers.xlsb'!loop1"
        Next i
  Next i

End Sub
我还通过将一些可能导致零的条件与OR函数组合在一起,收紧了您的公式


剩下的唯一一件事就是定义
目的地:=Sheets(“Sheet2”).在某个地方
我挂起了。

我想更改的是R2C33中的2,而不是33。我认为这个问题更合理一些。在Loop2中,最后一个操作是从Sheet1复制AG2并将其粘贴到sheet2,但没有为粘贴定义的目标单元格。只有sheet2。再次查看了您的公式。它有很多条件在返回零的最后,有三个条件可以返回一,如果没有匹配的条件,那么返回值默认为零。您能否将该公式缩短为
=if(或者(RC[-10]>=1,RC[-8]>=1,RC[-6]>=1),1,0)
因为任何不符合这些条件之一的内容都会以某种方式变为零?我需要其他单元格变为0,以确保它是新客户。@根据我检查的内容,它可以缩短,但它仍需要检查2条语句,然后才能进入最终的“检查”“成为1。您现在的方式只检查最后一次“检查”的值是否大于1,以及输出是否为1。如果
R2C33
要更改为
R”&i&“C33
,其中第2行
i=2
,则可以写为
RC33
,不是吗?据我所知,OP希望逐步完成R2C33和AG2,所以R2C33应该保持不变。如果你做RC33,它不是绝对的。OP用“我想改变的是R2C33中的2,而不是33”来澄清。另外,你能快速看一下我在原始问题评论中的逻辑吗。我可能已经找到了一种方法来缩短公式,这就是我的意思,因此我做了R&I&C33,因为每一步都应该改变I。然后,下一步在下一个i步骤中查看AG3,并从AG3Thanks复制以进行查看。谢谢。OP可以决定。正如我们之前讨论的,您的代码中仍然有一个小缺陷。他想从AG查一查,每走一步。所以AG2然后AG3,AG4。。。这一步发生在公式和复制中。这也是为什么(我认为)他在For Next循环中粘贴了公式。这是因为AG范围是他要验证/检查的不同名称的地方。我想我很难相信OP想要用20752个单元格进行631次迭代。明天我再看一看。\n成功:复制目标:=图纸(“sheet2”)。单元格(Rows.Count,“A”)。结束(xlUp)。偏移量(1,0)和图纸(“sheet2”)。单元格(Rows.Count,“A”)。结束(xlUp)。Font.Bold=TrueDragonSamu是正确的。我有631家分行和20752名客户。我想知道自2012年以来,在特定的分支机构中有多少新客户,以及这些客户是谁。现在可以了,非常感谢你的帮助!