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中得到具有实际值的公式?_Vba_Excel_Regexp - Fatal编程技术网

如何在vba中得到具有实际值的公式?

如何在vba中得到具有实际值的公式?,vba,excel,regexp,Vba,Excel,Regexp,我正在用excel编写代码,我是新来的:) 请帮助我解决以下问题: 我在=B1*C1*D1的单元格A1中有一个公式 单元格B1、C1和D1具有各自的值(即3,2,1) 我想使用VBA以字符串形式获取公式-即=3*2*1-我知道的唯一方法是使用先例功能: Sub GetFormulaAsString() Dim var As Range, temp As String, formulaAsString As String temp = "=" For Each va

我正在用excel编写代码,我是新来的:)

请帮助我解决以下问题:

  • 我在
    =B1*C1*D1的单元格
    A1
    中有一个公式
  • 单元格
    B1
    C1
    D1
    具有各自的值(即3,2,1)

我想使用VBA以字符串形式获取公式-即
=3*2*1
-我知道的唯一方法是使用
先例
功能:

Sub GetFormulaAsString()
    Dim var As Range, temp As String, formulaAsString As String

    temp = "="

    For Each var In Range("A1").Precedents
        temp = temp & var & "*"
    Next var

    formulaAsString = VBA.Left$(temp, Len(temp) - 1) // "=3*2*1"
End Sub
你可以用

  • a来解析出所有非数学运算符部分
  • 然后
    评估所有这些字符串部分
它可能需要对复杂的字符串进行精细处理,但这是一个良好的开端

针对更复杂的匹配进行更新

代码

Sub ParseEm()
Dim strIn As String
Dim strNew As String
Dim strCon As String
Dim lngCnt As Long

Dim objRegex As Object
Dim objRegMC As Object
Dim objRegM As Object

strCon = "|"
Set objRegex = CreateObject("vbscript.regexp")

With objRegex
    .Pattern = "[^=/+/\/-/*\^]+"
    .Global = True
    strIn = [a1].Formula
    If .test(strIn) Then
        Set objRegMC = .Execute(strIn)
        For Each objRegM In objRegMC
        strNew = Evaluate(CStr(objRegM))
        If objRegM.Length >= Len(strNew) Then
        Mid$(strIn, objRegM.firstindex + 1 + lngCnt, objRegM.Length) = strNew & Application.Rept(strCon, objRegM.Length - Len(strNew))
        Else
           strIn = Left$(strIn, objRegM.firstindex + lngCnt) & strNew & Right$(strIn, Len(strIn) - objRegM.firstindex - objRegM.Length - lngCnt - 1)
        lngCnt = lngCnt + Len(strNew) - objRegM.Length
        End If
        Next
        strIn = Replace(strIn, strCon, vbNullString)
        MsgBox strIn
    Else
        MsgBox "sorry, no matches"
    End If
End With
End Sub

其思想是将.Formula属性中的单元格引用替换为其值。唯一的问题是$sign-in公式,因此添加了cA和rA循环

Sub GetFormulaAsString()
    Dim var As Range
    Dim temp As String
    Dim R As Range
    Dim v As Variant
    Dim cA As Integer
    Dim rA As Integer
    Dim cellname As String

    Set R = Range("A1")
    temp = R.Formula
    Debug.Print temp

    For Each var In R.DirectPrecedents
        v = var.Value
        For cA = 1 To 0 Step -1
            For rA = 1 To 0 Step -1
                cellname = var.Address(cA, rA)
                temp = Replace(temp, cellname, v)
            Next rA
        Next cA

    Next var

    Debug.Print temp
    msgbox temp
End Sub

我已经解决了这个问题,伪问题是:

  • 查找字符串a1 b1 c1

  • 在单元格a1处创建如下新公式
    =“=”&b1&“*”&c1&“*”&d1

  • 获取a1的值


  • 还不错?:)

    我想你需要的是:我同意你的观点。如果需求是更一般的-例如可以处理
    +
    -
    *
    /
    等-那么我的解决方案将无法解决它。+1很好地解释:)我发现了一个错误:如果公式中有一个范围。试图修复您认为要使用VBA的问题?至少这是你最初要求的。此外,它还有一个硬编码的
    *
    ,因此如果实际公式使用
    +
    等,它将不起作用