Vba 跨多个工作表在单元格中查找公式,并替换为新公式,但引用公式部分的单元格

Vba 跨多个工作表在单元格中查找公式,并替换为新公式,但引用公式部分的单元格,vba,excel,Vba,Excel,我试图创建一个宏,因为我可以在工作簿中的多个电子表格中搜索特定的公式,并将其替换为不同的公式,但也可以更改公式中的变量 例如,我想找到公式: =SUMPRODUCT(ISNUMBER(MATCH(Actions_qry!$B$2:$B$40000,{"**NameofPerson**"},0))*ISNUMBER(MATCH(Actions_qry!$D$2:$D$40000,{"FormType"},0))) 用公式来代替它 =SUMPRODUCT(ISNUMBER(MATCH(Action

我试图创建一个宏,因为我可以在工作簿中的多个电子表格中搜索特定的公式,并将其替换为不同的公式,但也可以更改公式中的变量

例如,我想找到公式:

=SUMPRODUCT(ISNUMBER(MATCH(Actions_qry!$B$2:$B$40000,{"**NameofPerson**"},0))*ISNUMBER(MATCH(Actions_qry!$D$2:$D$40000,{"FormType"},0)))
用公式来代替它

=SUMPRODUCT(ISNUMBER(MATCH(Actions_qry!$B$2:$B$40000,{"**NameofPerson**"},0))*ISNUMBER(MATCH(Actions_qry!$D$2:$D$40000,{" FormType"},0)))
+ SUMPRODUCT(ISNUMBER(MATCH(Actions_qry!$B$2:$B$40000,{"**NameofPerson**"},0))*ISNUMBER(MATCH(Actions_qry!$D$2:$D$40000,{" FormType2"},0)))
但是,在这个公式中,我需要“NameofPerson”在循环的第一次迭代中引用单元格B4,然后偏移预定数量的行以引用表单中的下一个人。每个人的表格都是相同的,因此他们在整个表格中均匀分布。我已经包括了一个屏幕帽的形式看起来像给一个更好的参考

我曾经看到过宏,人们在宏中创建了一系列要查找的内容,然后又创建了一系列要替换的内容,但我无法使它适应这种情况。这比我有限的VBA技能要复杂一点。我试图通过@Miqi180改编这个脚本。但我不确定我是否已经接近做到这一点。就像我说的,我的VBA技能是有限的,就像在黑暗中蹒跚而行一样。 任何建议或知识将不胜感激。谢谢

子替换为新()


我能够让脚本满足我的需要。我让脚本遍历B列并查找行标签。如果它找到了行标签,它将向右偏移一个单元格,并粘贴我的新公式。在公式中,我让它引用一个字符串,该字符串通过偏移设置数量的单元格来获得用户名,从而将自身设置为具有用户名的单元格。粘贴第一个公式后,它将返回找到的行并向右偏移另一个单元格,然后粘贴插入用户名的下一个公式。代码如下:

    Sub Replaceformulas()

    Dim LR As Long, i As Long
    Dim sUserInput As String

    For Each ws In Worksheets
        If ActiveSheet.ProtectContents = False Then
            Select Case ws.Name
                Case "Tab1", _
                    "Tab13"
                    'Do nothing on these tabs


                Case Else 'If not one of the above tab names then do this
                    With ws.Activate
                        LR = ws.Range("B" & Rows.Count).End(xlUp).Row
                        For i = 1 To LR
                            With ws.Range("B" & i)
                                If .Value = "My Value" Then 'Find the row i specify with My Value here
                                    ws.Select
                                    .Offset(0, 1).Select
                                    sUserInput = ActiveCell.Offset(-19, -1).Address
                                    ActiveCell.Formula = "=SUMPRODUCT(ISNUMBER(MATCH(MYQuery!$B$2:$B$40000," & sUserInput & ",0))*ISNUMBER(MATCH(MYQuery!$D$2:$D$40000,{""Criteria""},0)))+SUMPRODUCT(ISNUMBER(MATCH(MYQuery!!$B$2:$B$40000, " & sUserInput & ",0))*ISNUMBER(MATCH(MYQuery!!$D$2:$D$40000,{""Criteria""},0)))"
                            .Offset(0, 2).Select
                            'This is my first formula I want to enter
                            ActiveCell.Formula = "=SUMIFS(MYQuery1!$D$2:$D$4525,MYQuery1!$B$2:$B$4525, " & sUserInput & ",Hours_qry!$C$2:$C$4525,""Criteria"")+SUMIFS(MyQuery2!$D$2:$D$4525,MYQuery1!$B$2:$B$4525, " & sUserInput & ",MYQuery1!$C$2:$C$4525,""*Criteria"")
                            'This is my second formula I want to enter
                            Debug.Print ws.Name
                        End If
                    End With
                Next i
            End With
        End Select
    Else
        MsgBox xlSheet.Name
    End If


    Next ws

    End Sub

“{”FormType“}”代表什么?所以在你的循环中,你从B4开始,然后每次迭代都会偏移一定的量,你当前的公式会随着表单类型的改变而重复。Formtype和formtype1只是表示我希望将两个不同的表单合并到一行中。
    Sub Replaceformulas()

    Dim LR As Long, i As Long
    Dim sUserInput As String

    For Each ws In Worksheets
        If ActiveSheet.ProtectContents = False Then
            Select Case ws.Name
                Case "Tab1", _
                    "Tab13"
                    'Do nothing on these tabs


                Case Else 'If not one of the above tab names then do this
                    With ws.Activate
                        LR = ws.Range("B" & Rows.Count).End(xlUp).Row
                        For i = 1 To LR
                            With ws.Range("B" & i)
                                If .Value = "My Value" Then 'Find the row i specify with My Value here
                                    ws.Select
                                    .Offset(0, 1).Select
                                    sUserInput = ActiveCell.Offset(-19, -1).Address
                                    ActiveCell.Formula = "=SUMPRODUCT(ISNUMBER(MATCH(MYQuery!$B$2:$B$40000," & sUserInput & ",0))*ISNUMBER(MATCH(MYQuery!$D$2:$D$40000,{""Criteria""},0)))+SUMPRODUCT(ISNUMBER(MATCH(MYQuery!!$B$2:$B$40000, " & sUserInput & ",0))*ISNUMBER(MATCH(MYQuery!!$D$2:$D$40000,{""Criteria""},0)))"
                            .Offset(0, 2).Select
                            'This is my first formula I want to enter
                            ActiveCell.Formula = "=SUMIFS(MYQuery1!$D$2:$D$4525,MYQuery1!$B$2:$B$4525, " & sUserInput & ",Hours_qry!$C$2:$C$4525,""Criteria"")+SUMIFS(MyQuery2!$D$2:$D$4525,MYQuery1!$B$2:$B$4525, " & sUserInput & ",MYQuery1!$C$2:$C$4525,""*Criteria"")
                            'This is my second formula I want to enter
                            Debug.Print ws.Name
                        End If
                    End With
                Next i
            End With
        End Select
    Else
        MsgBox xlSheet.Name
    End If


    Next ws

    End Sub