如何在vba中得到具有实际值的公式?
我正在用excel编写代码,我是新来的:) 请帮助我解决以下问题:如何在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
- 我在
=B1*C1*D1的单元格
中有一个公式A1
- 单元格
、B1
和C1
具有各自的值(即3,2,1)D1
我想使用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
我已经解决了这个问题,伪问题是:
=“=”&b1&“*”&c1&“*”&d1
还不错?:) 我想你需要的是:我同意你的观点。如果需求是更一般的-例如可以处理
+
-
*
/
等-那么我的解决方案将无法解决它。+1很好地解释:)我发现了一个错误:如果公式中有一个范围。试图修复您认为要使用VBA的问题?至少这是你最初要求的。此外,它还有一个硬编码的*
,因此如果实际公式使用+
等,它将不起作用